diff --git a/eslint.config.js b/eslint.config.js index c371f073f76..2f2b466c66f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,5 +1,5 @@ import tseslint from '@typescript-eslint/eslint-plugin'; -import stylisticTs from '@stylistic/eslint-plugin-ts' +import stylisticTs from '@stylistic/eslint-plugin-ts'; import parser from '@typescript-eslint/parser'; import importX from 'eslint-plugin-import-x'; @@ -16,15 +16,15 @@ export default [ '@typescript-eslint': tseslint }, rules: { - "eqeqeq": ["error", "always"], // Enforces the use of === and !== instead of == and != - "indent": ["error", 2], // Enforces a 2-space indentation + "eqeqeq": ["error", "always"], // Enforces the use of `===` and `!==` instead of `==` and `!=` + "indent": ["error", 2, { "SwitchCase": 1 }], // Enforces a 2-space indentation, enforces indentation of `case ...:` statements "quotes": ["error", "double"], // Enforces the use of double quotes for strings - "no-var": "error", // Disallows the use of var, enforcing let or const instead - "prefer-const": "error", // Prefers the use of const for variables that are never reassigned + "no-var": "error", // Disallows the use of `var`, enforcing `let` or `const` instead + "prefer-const": "error", // Enforces the use of `const` for variables that are never reassigned "no-undef": "off", // Disables the rule that disallows the use of undeclared variables (TypeScript handles this) "@typescript-eslint/no-unused-vars": [ "error", { "args": "none", // Allows unused function parameters. Useful for functions with specific signatures where not all parameters are always used. - "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the rest. + "ignoreRestSiblings": true // Allows unused variables that are part of a rest property in object destructuring. Useful for excluding certain properties from an object while using the others. }], "eol-last": ["error", "always"], // Enforces at least one newline at the end of files "@stylistic/ts/semi": ["error", "always"], // Requires semicolons for TypeScript-specific syntax @@ -32,14 +32,14 @@ export default [ "no-extra-semi": ["error"], // Disallows unnecessary semicolons for TypeScript-specific syntax "brace-style": "off", // Note: you must disable the base rule as it can report incorrect errors "curly": ["error", "all"], // Enforces the use of curly braces for all control statements - "@stylistic/ts/brace-style": ["error", "1tbs"], + "@stylistic/ts/brace-style": ["error", "1tbs"], // Enforces the following brace style: https://eslint.style/rules/js/brace-style#_1tbs "no-trailing-spaces": ["error", { // Disallows trailing whitespace at the end of lines "skipBlankLines": false, // Enforces the rule even on blank lines "ignoreComments": false // Enforces the rule on lines containing comments }], "space-before-blocks": ["error", "always"], // Enforces a space before blocks "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords - "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after comma + "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after commas "import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json "array-bracket-spacing": ["error", "always", { "objectsInArrays": false, "arraysInArrays": false }], // Enforces consistent spacing inside array brackets "object-curly-spacing": ["error", "always", { "arraysInObjects": false, "objectsInObjects": false }], // Enforces consistent spacing inside braces of object literals, destructuring assignments, and import/export specifiers diff --git a/package-lock.json b/package-lock.json index be946306471..9e512884922 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "pokemon-rogue-battle", - "version": "1.1.0", + "version": "1.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "pokemon-rogue-battle", - "version": "1.1.0", + "version": "1.1.6", "hasInstallScript": true, "dependencies": { "@material/material-color-utilities": "^0.2.7", diff --git a/package.json b/package.json index a31296d1644..f106fb1a773 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "pokemon-rogue-battle", "private": true, - "version": "1.1.0", + "version": "1.1.6", "type": "module", "scripts": { "start": "vite", diff --git a/public/audio/bgm/graveyard.mp3 b/public/audio/bgm/graveyard.mp3 index 48092fa3ec2..45571f16d09 100644 Binary files a/public/audio/bgm/graveyard.mp3 and b/public/audio/bgm/graveyard.mp3 differ diff --git a/public/images/events/halloween2024-event-de.png b/public/images/events/halloween2024-event-de.png new file mode 100644 index 00000000000..a56053c73cc Binary files /dev/null and b/public/images/events/halloween2024-event-de.png differ diff --git a/public/images/events/halloween2024-event-en.png b/public/images/events/halloween2024-event-en.png new file mode 100644 index 00000000000..3886fa796ae Binary files /dev/null and b/public/images/events/halloween2024-event-en.png differ diff --git a/public/images/events/halloween2024-event-es-ES.png b/public/images/events/halloween2024-event-es-ES.png new file mode 100644 index 00000000000..dc9bac86cd0 Binary files /dev/null and b/public/images/events/halloween2024-event-es-ES.png differ diff --git a/public/images/events/halloween2024-event-fr.png b/public/images/events/halloween2024-event-fr.png new file mode 100644 index 00000000000..21df18c7471 Binary files /dev/null and b/public/images/events/halloween2024-event-fr.png differ diff --git a/public/images/events/halloween2024-event-it.png b/public/images/events/halloween2024-event-it.png new file mode 100644 index 00000000000..ce2316b2ce5 Binary files /dev/null and b/public/images/events/halloween2024-event-it.png differ diff --git a/public/images/events/halloween2024-event-ja.png b/public/images/events/halloween2024-event-ja.png new file mode 100644 index 00000000000..363f3b33b0d Binary files /dev/null and b/public/images/events/halloween2024-event-ja.png differ diff --git a/public/images/events/halloween2024-event-ko.png b/public/images/events/halloween2024-event-ko.png new file mode 100644 index 00000000000..3f52526a296 Binary files /dev/null and b/public/images/events/halloween2024-event-ko.png differ diff --git a/public/images/events/halloween2024-event-pt-BR.png b/public/images/events/halloween2024-event-pt-BR.png new file mode 100644 index 00000000000..764a9c1daa9 Binary files /dev/null and b/public/images/events/halloween2024-event-pt-BR.png differ diff --git a/public/images/events/halloween2024-event-zh-CN.png b/public/images/events/halloween2024-event-zh-CN.png new file mode 100644 index 00000000000..c2096a05d98 Binary files /dev/null and b/public/images/events/halloween2024-event-zh-CN.png differ diff --git a/public/images/items.json b/public/images/items.json index 779823d1293..9d84476a8a0 100644 --- a/public/images/items.json +++ b/public/images/items.json @@ -3353,12 +3353,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 23 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 1, + "x": 5, + "y": 5, "w": 22, "h": 21 }, @@ -3416,12 +3416,12 @@ "rotated": false, "trimmed": true, "sourceSize": { - "w": 24, - "h": 24 + "w": 32, + "h": 32 }, "spriteSourceSize": { - "x": 1, - "y": 2, + "x": 5, + "y": 7, "w": 22, "h": 19 }, @@ -6583,7 +6583,7 @@ } }, { - "filename": "rb", + "filename": "pb_silver", "rotated": false, "trimmed": true, "sourceSize": { @@ -6666,6 +6666,27 @@ "h": 19 } }, + { + "filename": "rb", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 20, + "h": 20 + }, + "frame": { + "x": 254, + "y": 320, + "w": 20, + "h": 20 + } + }, { "filename": "smooth_meteorite", "rotated": false, @@ -6680,27 +6701,6 @@ "w": 20, "h": 20 }, - "frame": { - "x": 254, - "y": 320, - "w": 20, - "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": 274, "y": 325, @@ -6709,7 +6709,7 @@ } }, { - "filename": "ub", + "filename": "strange_ball", "rotated": false, "trimmed": true, "sourceSize": { @@ -6751,7 +6751,7 @@ } }, { - "filename": "apicot_berry", + "filename": "ub", "rotated": false, "trimmed": true, "sourceSize": { @@ -6761,13 +6761,13 @@ "spriteSourceSize": { "x": 6, "y": 6, - "w": 19, + "w": 20, "h": 20 }, "frame": { "x": 221, "y": 337, - "w": 19, + "w": 20, "h": 20 } }, @@ -6793,7 +6793,7 @@ } }, { - "filename": "big_mushroom", + "filename": "apicot_berry", "rotated": false, "trimmed": true, "sourceSize": { @@ -6804,13 +6804,13 @@ "x": 6, "y": 6, "w": 19, - "h": 19 + "h": 20 }, "frame": { "x": 343, "y": 287, "w": 19, - "h": 19 + "h": 20 } }, { @@ -6834,6 +6834,27 @@ "h": 20 } }, + { + "filename": "big_mushroom", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 6, + "w": 19, + "h": 19 + }, + "frame": { + "x": 318, + "y": 306, + "w": 19, + "h": 19 + } + }, { "filename": "hard_stone", "rotated": false, @@ -6849,33 +6870,12 @@ "h": 20 }, "frame": { - "x": 318, - "y": 306, + "x": 314, + "y": 325, "w": 19, "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": 337, - "y": 306, - "w": 19, - "h": 19 - } - }, { "filename": "wl_ability_urge", "rotated": false, @@ -6891,12 +6891,33 @@ "h": 18 }, "frame": { - "x": 314, - "y": 326, + "x": 337, + "y": 307, "w": 20, "h": 18 } }, + { + "filename": "miracle_seed", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 6, + "y": 7, + "w": 19, + "h": 19 + }, + "frame": { + "x": 333, + "y": 325, + "w": 19, + "h": 19 + } + }, { "filename": "wl_antidote", "rotated": false, @@ -6912,12 +6933,54 @@ "h": 18 }, "frame": { - "x": 356, + "x": 357, "y": 307, "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": 352, + "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": 241, + "y": 340, + "w": 20, + "h": 18 + } + }, { "filename": "golden_egg", "rotated": false, @@ -6933,33 +6996,12 @@ "h": 20 }, "frame": { - "x": 376, - "y": 307, + "x": 372, + "y": 325, "w": 17, "h": 20 } }, - { - "filename": "wl_awakening", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 6, - "y": 8, - "w": 20, - "h": 18 - }, - "frame": { - "x": 393, - "y": 241, - "w": 20, - "h": 18 - } - }, { "filename": "toxic_orb", "rotated": false, @@ -6975,96 +7017,12 @@ "h": 18 }, "frame": { - "x": 413, - "y": 258, + "x": 377, + "y": 307, "w": 18, "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": 393, - "y": 259, - "w": 20, - "h": 18 - } - }, - { - "filename": "ampharosite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 377, - "y": 243, - "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": 377, - "y": 259, - "w": 16, - "h": 16 - } - }, - { - "filename": "relic_gold", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 9, - "y": 11, - "w": 15, - "h": 11 - }, - "frame": { - "x": 377, - "y": 275, - "w": 15, - "h": 11 - } - }, { "filename": "lucky_egg", "rotated": false, @@ -7080,8 +7038,8 @@ "h": 20 }, "frame": { - "x": 381, - "y": 286, + "x": 389, + "y": 325, "w": 17, "h": 20 } @@ -7101,8 +7059,8 @@ "h": 18 }, "frame": { - "x": 398, - "y": 277, + "x": 352, + "y": 343, "w": 20, "h": 18 } @@ -7122,8 +7080,8 @@ "h": 18 }, "frame": { - "x": 398, - "y": 295, + "x": 372, + "y": 345, "w": 20, "h": 18 } @@ -7143,8 +7101,8 @@ "h": 18 }, "frame": { - "x": 393, - "y": 313, + "x": 392, + "y": 345, "w": 20, "h": 18 } @@ -7164,14 +7122,14 @@ "h": 18 }, "frame": { - "x": 240, - "y": 340, + "x": 378, + "y": 241, "w": 20, "h": 18 } }, { - "filename": "banettite", + "filename": "relic_gold", "rotated": false, "trimmed": true, "sourceSize": { @@ -7179,16 +7137,16 @@ "h": 32 }, "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 + "x": 9, + "y": 11, + "w": 15, + "h": 11 }, "frame": { - "x": 413, - "y": 313, - "w": 16, - "h": 16 + "x": 398, + "y": 241, + "w": 15, + "h": 11 } }, { @@ -7206,8 +7164,8 @@ "h": 18 }, "frame": { - "x": 202, - "y": 358, + "x": 377, + "y": 259, "w": 20, "h": 18 } @@ -7227,8 +7185,8 @@ "h": 18 }, "frame": { - "x": 201, - "y": 376, + "x": 381, + "y": 277, "w": 20, "h": 18 } @@ -7248,8 +7206,8 @@ "h": 18 }, "frame": { - "x": 201, - "y": 394, + "x": 397, + "y": 259, "w": 20, "h": 18 } @@ -7269,33 +7227,12 @@ "h": 18 }, "frame": { - "x": 201, - "y": 412, + "x": 401, + "y": 277, "w": 20, "h": 18 } }, - { - "filename": "beedrillite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 222, - "y": 357, - "w": 16, - "h": 16 - } - }, { "filename": "wl_ice_heal", "rotated": false, @@ -7311,14 +7248,14 @@ "h": 18 }, "frame": { - "x": 238, - "y": 358, + "x": 395, + "y": 295, "w": 20, "h": 18 } }, { - "filename": "blastoisinite", + "filename": "ampharosite", "rotated": false, "trimmed": true, "sourceSize": { @@ -7332,8 +7269,29 @@ "h": 16 }, "frame": { - "x": 222, - "y": 373, + "x": 415, + "y": 295, + "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": 415, + "y": 311, "w": 16, "h": 16 } @@ -7353,12 +7311,33 @@ "h": 18 }, "frame": { - "x": 221, - "y": 389, + "x": 406, + "y": 327, "w": 20, "h": 18 } }, + { + "filename": "banettite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 412, + "y": 345, + "w": 16, + "h": 16 + } + }, { "filename": "wl_item_urge", "rotated": false, @@ -7375,7 +7354,7 @@ }, "frame": { "x": 221, - "y": 407, + "y": 357, "w": 20, "h": 18 } @@ -7396,7 +7375,7 @@ }, "frame": { "x": 241, - "y": 376, + "y": 358, "w": 20, "h": 18 } @@ -7416,8 +7395,8 @@ "h": 18 }, "frame": { - "x": 241, - "y": 394, + "x": 201, + "y": 360, "w": 20, "h": 18 } @@ -7437,8 +7416,8 @@ "h": 18 }, "frame": { - "x": 241, - "y": 412, + "x": 201, + "y": 378, "w": 20, "h": 18 } @@ -7458,8 +7437,8 @@ "h": 18 }, "frame": { - "x": 258, - "y": 358, + "x": 221, + "y": 375, "w": 20, "h": 18 } @@ -7479,8 +7458,8 @@ "h": 18 }, "frame": { - "x": 261, - "y": 376, + "x": 201, + "y": 396, "w": 20, "h": 18 } @@ -7500,8 +7479,8 @@ "h": 18 }, "frame": { - "x": 261, - "y": 394, + "x": 221, + "y": 393, "w": 20, "h": 18 } @@ -7521,8 +7500,8 @@ "h": 18 }, "frame": { - "x": 261, - "y": 412, + "x": 241, + "y": 376, "w": 20, "h": 18 } @@ -7542,12 +7521,33 @@ "h": 18 }, "frame": { - "x": 278, - "y": 345, + "x": 241, + "y": 394, "w": 20, "h": 18 } }, + { + "filename": "beedrillite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 201, + "y": 414, + "w": 16, + "h": 16 + } + }, { "filename": "wl_super_potion", "rotated": false, @@ -7563,12 +7563,33 @@ "h": 18 }, "frame": { - "x": 298, + "x": 261, "y": 345, "w": 20, "h": 18 } }, + { + "filename": "blastoisinite", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 32, + "h": 32 + }, + "spriteSourceSize": { + "x": 8, + "y": 8, + "w": 16, + "h": 16 + }, + "frame": { + "x": 261, + "y": 363, + "w": 16, + "h": 16 + } + }, { "filename": "blazikenite", "rotated": false, @@ -7584,8 +7605,8 @@ "h": 16 }, "frame": { - "x": 318, - "y": 344, + "x": 281, + "y": 345, "w": 16, "h": 16 } @@ -7605,8 +7626,8 @@ "h": 16 }, "frame": { - "x": 334, - "y": 326, + "x": 261, + "y": 379, "w": 16, "h": 16 } @@ -7626,8 +7647,8 @@ "h": 16 }, "frame": { - "x": 334, - "y": 342, + "x": 297, + "y": 345, "w": 16, "h": 16 } @@ -7647,8 +7668,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 325, + "x": 261, + "y": 395, "w": 16, "h": 16 } @@ -7668,8 +7689,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 341, + "x": 313, + "y": 345, "w": 16, "h": 16 } @@ -7689,8 +7710,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 327, + "x": 217, + "y": 414, "w": 16, "h": 16 } @@ -7710,8 +7731,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 343, + "x": 233, + "y": 412, "w": 16, "h": 16 } @@ -7731,8 +7752,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 331, + "x": 249, + "y": 412, "w": 16, "h": 16 } @@ -7752,8 +7773,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 331, + "x": 265, + "y": 411, "w": 16, "h": 16 } @@ -7773,8 +7794,8 @@ "h": 16 }, "frame": { - "x": 414, - "y": 329, + "x": 329, + "y": 345, "w": 16, "h": 16 } @@ -7794,8 +7815,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 347, + "x": 277, + "y": 363, "w": 16, "h": 16 } @@ -7815,8 +7836,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 347, + "x": 277, + "y": 379, "w": 16, "h": 16 } @@ -7836,8 +7857,8 @@ "h": 16 }, "frame": { - "x": 414, - "y": 345, + "x": 277, + "y": 395, "w": 16, "h": 16 } @@ -7857,8 +7878,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 363, + "x": 293, + "y": 361, "w": 16, "h": 16 } @@ -7878,8 +7899,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 379, + "x": 309, + "y": 361, "w": 16, "h": 16 } @@ -7899,8 +7920,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 363, + "x": 293, + "y": 377, "w": 16, "h": 16 } @@ -7920,8 +7941,8 @@ "h": 16 }, "frame": { - "x": 281, - "y": 395, + "x": 325, + "y": 361, "w": 16, "h": 16 } @@ -7941,8 +7962,8 @@ "h": 16 }, "frame": { - "x": 297, - "y": 379, + "x": 293, + "y": 393, "w": 16, "h": 16 } @@ -7961,6 +7982,90 @@ "w": 16, "h": 16 }, + "frame": { + "x": 309, + "y": 377, + "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": 309, + "y": 393, + "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": 325, + "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": 325, + "y": 393, + "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": 281, "y": 411, @@ -7968,90 +8073,6 @@ "h": 16 } }, - { - "filename": "mawilite", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 32, - "h": 32 - }, - "spriteSourceSize": { - "x": 8, - "y": 8, - "w": 16, - "h": 16 - }, - "frame": { - "x": 297, - "y": 395, - "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": 297, - "y": 411, - "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": 313, - "y": 363, - "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": 313, - "y": 379, - "w": 16, - "h": 16 - } - }, { "filename": "mewtwonite_y", "rotated": false, @@ -8067,8 +8088,8 @@ "h": 16 }, "frame": { - "x": 313, - "y": 395, + "x": 297, + "y": 409, "w": 16, "h": 16 } @@ -8089,7 +8110,7 @@ }, "frame": { "x": 313, - "y": 411, + "y": 409, "w": 16, "h": 16 } @@ -8109,8 +8130,8 @@ "h": 16 }, "frame": { - "x": 350, - "y": 357, + "x": 329, + "y": 409, "w": 16, "h": 16 } @@ -8130,8 +8151,8 @@ "h": 16 }, "frame": { - "x": 366, - "y": 359, + "x": 341, + "y": 361, "w": 16, "h": 16 } @@ -8151,8 +8172,8 @@ "h": 16 }, "frame": { - "x": 334, - "y": 358, + "x": 341, + "y": 377, "w": 16, "h": 16 } @@ -8172,8 +8193,8 @@ "h": 16 }, "frame": { - "x": 382, - "y": 363, + "x": 341, + "y": 393, "w": 16, "h": 16 } @@ -8193,8 +8214,8 @@ "h": 16 }, "frame": { - "x": 398, - "y": 363, + "x": 345, + "y": 409, "w": 16, "h": 16 } @@ -8214,7 +8235,7 @@ "h": 16 }, "frame": { - "x": 414, + "x": 412, "y": 361, "w": 16, "h": 16 @@ -8235,8 +8256,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 374, + "x": 357, + "y": 363, "w": 16, "h": 16 } @@ -8256,8 +8277,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 390, + "x": 357, + "y": 379, "w": 16, "h": 16 } @@ -8277,8 +8298,8 @@ "h": 16 }, "frame": { - "x": 329, - "y": 406, + "x": 373, + "y": 363, "w": 16, "h": 16 } @@ -8298,8 +8319,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 374, + "x": 373, + "y": 379, "w": 16, "h": 16 } @@ -8319,8 +8340,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 390, + "x": 389, + "y": 363, "w": 16, "h": 16 } @@ -8340,8 +8361,8 @@ "h": 16 }, "frame": { - "x": 345, - "y": 406, + "x": 389, + "y": 379, "w": 16, "h": 16 } @@ -8361,8 +8382,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 375, + "x": 405, + "y": 377, "w": 16, "h": 16 } @@ -8383,7 +8404,7 @@ }, "frame": { "x": 361, - "y": 391, + "y": 395, "w": 16, "h": 16 } @@ -8403,8 +8424,8 @@ "h": 16 }, "frame": { - "x": 361, - "y": 407, + "x": 377, + "y": 395, "w": 16, "h": 16 } @@ -8415,6 +8436,6 @@ "meta": { "app": "https://www.codeandweb.com/texturepacker", "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:934ea4080bad980d4fea720cc771f133:ed564bc47b79b15a763de57045178e88:110e074689c9edd2c54833ce2e4d9270$" + "smartupdate": "$TexturePacker:SmartUpdate:d91a46c431ace3f09f5ca68916a2171e:1e84369d9a13e1416fa58028d629d116:110e074689c9edd2c54833ce2e4d9270$" } } diff --git a/public/images/items.png b/public/images/items.png index 5f032b30cfb..cb4f8fa7d06 100644 Binary files a/public/images/items.png and b/public/images/items.png differ diff --git a/public/images/items/berry_juice.png b/public/images/items/berry_juice.png index c0986b804f9..127fa458906 100644 Binary files a/public/images/items/berry_juice.png and b/public/images/items/berry_juice.png differ diff --git a/public/images/items/black_sludge.png b/public/images/items/black_sludge.png index 39684a40310..37aa31de43e 100644 Binary files a/public/images/items/black_sludge.png and b/public/images/items/black_sludge.png differ diff --git a/public/images/items/pb_silver.png b/public/images/items/pb_silver.png new file mode 100644 index 00000000000..f60a8348a94 Binary files /dev/null and b/public/images/items/pb_silver.png differ diff --git a/public/images/pokemon/1012-counterfeit.png b/public/images/pokemon/1012-counterfeit.png index 2482debd312..32d9c1790c9 100644 Binary files a/public/images/pokemon/1012-counterfeit.png and b/public/images/pokemon/1012-counterfeit.png differ diff --git a/public/images/pokemon/1013-unremarkable.png b/public/images/pokemon/1013-unremarkable.png index a70954685ed..aaf57aa1a02 100644 Binary files a/public/images/pokemon/1013-unremarkable.png and b/public/images/pokemon/1013-unremarkable.png differ diff --git a/public/images/pokemon/154.png b/public/images/pokemon/154.png index 74370115aa6..7547d4c573a 100644 Binary files a/public/images/pokemon/154.png and b/public/images/pokemon/154.png differ diff --git a/public/images/pokemon/172-spiky.png b/public/images/pokemon/172-spiky.png index 2a02c6fb268..f74c6574344 100644 Binary files a/public/images/pokemon/172-spiky.png and b/public/images/pokemon/172-spiky.png differ diff --git a/public/images/pokemon/172.png b/public/images/pokemon/172.png index 435ebbe4c63..9e96ff34936 100644 Binary files a/public/images/pokemon/172.png and b/public/images/pokemon/172.png differ diff --git a/public/images/pokemon/194.png b/public/images/pokemon/194.png index 589c2ae155a..d126190685b 100644 Binary files a/public/images/pokemon/194.png and b/public/images/pokemon/194.png differ diff --git a/public/images/pokemon/198.png b/public/images/pokemon/198.png index 3d6c15f1a1d..5a310216129 100644 Binary files a/public/images/pokemon/198.png and b/public/images/pokemon/198.png differ diff --git a/public/images/pokemon/2026.png b/public/images/pokemon/2026.png index 78c881eb10d..fde7405f65a 100644 Binary files a/public/images/pokemon/2026.png and b/public/images/pokemon/2026.png differ diff --git a/public/images/pokemon/25-beauty-cosplay.png b/public/images/pokemon/25-beauty-cosplay.png index a0c4c5717b2..0db73184c8e 100644 Binary files a/public/images/pokemon/25-beauty-cosplay.png and b/public/images/pokemon/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/25-cool-cosplay.png b/public/images/pokemon/25-cool-cosplay.png index 209509f12fc..123ae257598 100644 Binary files a/public/images/pokemon/25-cool-cosplay.png and b/public/images/pokemon/25-cool-cosplay.png differ diff --git a/public/images/pokemon/25-cosplay.png b/public/images/pokemon/25-cosplay.png index 9a70984cc8b..217ab730cc4 100644 Binary files a/public/images/pokemon/25-cosplay.png and b/public/images/pokemon/25-cosplay.png differ diff --git a/public/images/pokemon/25-cute-cosplay.png b/public/images/pokemon/25-cute-cosplay.png index 5c4adce2304..17fdfd32609 100644 Binary files a/public/images/pokemon/25-cute-cosplay.png and b/public/images/pokemon/25-cute-cosplay.png differ diff --git a/public/images/pokemon/25-gigantamax.png b/public/images/pokemon/25-gigantamax.png index b9f3f037788..e39511341a3 100644 Binary files a/public/images/pokemon/25-gigantamax.png and b/public/images/pokemon/25-gigantamax.png differ diff --git a/public/images/pokemon/25-partner.png b/public/images/pokemon/25-partner.png index 7b1104a3a55..f1cb33f9701 100644 Binary files a/public/images/pokemon/25-partner.png and b/public/images/pokemon/25-partner.png differ diff --git a/public/images/pokemon/25-smart-cosplay.png b/public/images/pokemon/25-smart-cosplay.png index edafa4d2a21..603837dd34f 100644 Binary files a/public/images/pokemon/25-smart-cosplay.png and b/public/images/pokemon/25-smart-cosplay.png differ diff --git a/public/images/pokemon/25-tough-cosplay.png b/public/images/pokemon/25-tough-cosplay.png index ecadee4ff27..380269b87e7 100644 Binary files a/public/images/pokemon/25-tough-cosplay.png and b/public/images/pokemon/25-tough-cosplay.png differ diff --git a/public/images/pokemon/25.png b/public/images/pokemon/25.png index 7b1104a3a55..f1cb33f9701 100644 Binary files a/public/images/pokemon/25.png and b/public/images/pokemon/25.png differ diff --git a/public/images/pokemon/26.png b/public/images/pokemon/26.png index ae0a7aeab62..f2cdf63c718 100644 Binary files a/public/images/pokemon/26.png and b/public/images/pokemon/26.png differ diff --git a/public/images/pokemon/276.png b/public/images/pokemon/276.png index 1b24f59d105..a191440497c 100644 Binary files a/public/images/pokemon/276.png and b/public/images/pokemon/276.png differ diff --git a/public/images/pokemon/277.png b/public/images/pokemon/277.png index 3c4475e5fce..2ec0b9b8a9a 100644 Binary files a/public/images/pokemon/277.png and b/public/images/pokemon/277.png differ diff --git a/public/images/pokemon/359-mega.png b/public/images/pokemon/359-mega.png index 99e95151b79..9c026d78779 100644 Binary files a/public/images/pokemon/359-mega.png and b/public/images/pokemon/359-mega.png differ diff --git a/public/images/pokemon/359.png b/public/images/pokemon/359.png index bb02f52637e..e5a1d168ad2 100644 Binary files a/public/images/pokemon/359.png and b/public/images/pokemon/359.png differ diff --git a/public/images/pokemon/379.png b/public/images/pokemon/379.png index dd430eb9d70..3a4185ffaf6 100644 Binary files a/public/images/pokemon/379.png and b/public/images/pokemon/379.png differ diff --git a/public/images/pokemon/390.png b/public/images/pokemon/390.png index 7bd6fd2de90..e96b6631c8a 100644 Binary files a/public/images/pokemon/390.png and b/public/images/pokemon/390.png differ diff --git a/public/images/pokemon/391.png b/public/images/pokemon/391.png index 480894c9373..bb6abefada7 100644 Binary files a/public/images/pokemon/391.png and b/public/images/pokemon/391.png differ diff --git a/public/images/pokemon/392.png b/public/images/pokemon/392.png index 5c65d92889b..b65da9eecb4 100644 Binary files a/public/images/pokemon/392.png and b/public/images/pokemon/392.png differ diff --git a/public/images/pokemon/40.png b/public/images/pokemon/40.png index 4d2cc4f1d60..e6b59c51bfe 100644 Binary files a/public/images/pokemon/40.png and b/public/images/pokemon/40.png differ diff --git a/public/images/pokemon/430.png b/public/images/pokemon/430.png index 07aca365e02..5ed0fb19c20 100644 Binary files a/public/images/pokemon/430.png and b/public/images/pokemon/430.png differ diff --git a/public/images/pokemon/451.json b/public/images/pokemon/451.json index 3a320a87c61..0e99c96f876 100644 --- a/public/images/pokemon/451.json +++ b/public/images/pokemon/451.json @@ -1,715 +1,2330 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0002.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0003.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0004.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0005.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0006.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0007.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0008.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0009.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0010.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0011.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0012.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0013.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0014.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0015.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0016.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0017.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0018.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0019.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0020.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0021.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0022.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0023.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0024.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0025.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0026.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0027.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0028.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0029.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0030.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0031.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0032.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0033.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0034.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0035.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0036.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0037.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0038.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0039.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0040.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0041.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0042.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0043.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0044.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0045.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0046.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0047.png", - "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0048.png", - "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0049.png", - "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0050.png", - "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0051.png", - "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0052.png", - "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0053.png", - "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0054.png", - "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0055.png", - "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0056.png", - "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0057.png", - "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0058.png", - "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0059.png", - "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0060.png", - "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0061.png", - "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0062.png", - "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0063.png", - "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0064.png", - "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0065.png", - "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0066.png", - "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0067.png", - "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0068.png", - "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0069.png", - "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0070.png", - "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0071.png", - "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0072.png", - "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0073.png", - "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0074.png", - "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0075.png", - "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0076.png", - "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0077.png", - "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0078.png", - "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0079.png", - "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0080.png", - "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0081.png", - "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0082.png", - "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0083.png", - "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0084.png", - "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0085.png", - "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0086.png", - "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0087.png", - "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0088.png", - "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.8.1-x64", - "image": "451.png", - "format": "I8", - "size": { "w": 339, "h": 221 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "451.png", + "format": "RGBA8888", + "size": { + "w": 281, + "h": 281 + }, + "scale": 1, + "frames": [ + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 179, + "y": 87, + "w": 57, + "h": 45 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 179, + "y": 87, + "w": 57, + "h": 45 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 0, + "y": 129, + "w": 57, + "h": 45 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 0, + "y": 129, + "w": 57, + "h": 45 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 57, + "y": 132, + "w": 57, + "h": 45 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 57, + "y": 132, + "w": 57, + "h": 45 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 56, + "h": 45 + }, + "frame": { + "x": 114, + "y": 132, + "w": 56, + "h": 45 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 56, + "h": 45 + }, + "frame": { + "x": 114, + "y": 132, + "w": 56, + "h": 45 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 170, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 170, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 224, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 224, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 228, + "y": 177, + "w": 53, + "h": 46 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 228, + "y": 177, + "w": 53, + "h": 46 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 220, + "w": 54, + "h": 46 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 220, + "w": 54, + "h": 46 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 111, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 111, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 166, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 166, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 221, + "y": 223, + "w": 54, + "h": 46 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 221, + "y": 223, + "w": 54, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:e303c68c1876b77078f3e1fd4372a4ce:84139d6b94cea0f3c45dbd8fa7109c3d:c79e17c206de27e3b7f1ce96f7df8e51$" + } } diff --git a/public/images/pokemon/451.png b/public/images/pokemon/451.png index 716e8a08041..fac8f5a0170 100644 Binary files a/public/images/pokemon/451.png and b/public/images/pokemon/451.png differ diff --git a/public/images/pokemon/455.png b/public/images/pokemon/455.png index 9518bc019fe..731abfec4e6 100644 Binary files a/public/images/pokemon/455.png and b/public/images/pokemon/455.png differ diff --git a/public/images/pokemon/486.png b/public/images/pokemon/486.png index aaee1287a47..328ed80c995 100644 Binary files a/public/images/pokemon/486.png and b/public/images/pokemon/486.png differ diff --git a/public/images/pokemon/501.png b/public/images/pokemon/501.png index ac4c5d9fbf0..79a012cadd5 100644 Binary files a/public/images/pokemon/501.png and b/public/images/pokemon/501.png differ diff --git a/public/images/pokemon/502.png b/public/images/pokemon/502.png index 8a7c2636894..ef1291a2520 100644 Binary files a/public/images/pokemon/502.png and b/public/images/pokemon/502.png differ diff --git a/public/images/pokemon/503.png b/public/images/pokemon/503.png index d9cf94f3c6f..3571e64156c 100644 Binary files a/public/images/pokemon/503.png and b/public/images/pokemon/503.png differ diff --git a/public/images/pokemon/528.png b/public/images/pokemon/528.png index d1806f17f70..fd6e0c54a77 100644 Binary files a/public/images/pokemon/528.png and b/public/images/pokemon/528.png differ diff --git a/public/images/pokemon/587.png b/public/images/pokemon/587.png index 409b423c13b..6a870170219 100644 Binary files a/public/images/pokemon/587.png and b/public/images/pokemon/587.png differ diff --git a/public/images/pokemon/590.png b/public/images/pokemon/590.png index 2cf97f1fe69..0908b46cd83 100644 Binary files a/public/images/pokemon/590.png and b/public/images/pokemon/590.png differ diff --git a/public/images/pokemon/591.png b/public/images/pokemon/591.png index 179e3b4160f..a294749149f 100644 Binary files a/public/images/pokemon/591.png and b/public/images/pokemon/591.png differ diff --git a/public/images/pokemon/616.png b/public/images/pokemon/616.png index 5d4e04e31fd..aff43388faf 100644 Binary files a/public/images/pokemon/616.png and b/public/images/pokemon/616.png differ diff --git a/public/images/pokemon/6503.png b/public/images/pokemon/6503.png index 906fcb9115b..71d6e27d855 100644 Binary files a/public/images/pokemon/6503.png and b/public/images/pokemon/6503.png differ diff --git a/public/images/pokemon/656.png b/public/images/pokemon/656.png index 1f0f181712b..b653616955d 100644 Binary files a/public/images/pokemon/656.png and b/public/images/pokemon/656.png differ diff --git a/public/images/pokemon/657.png b/public/images/pokemon/657.png index 8c0f2b9a15f..031c9404805 100644 Binary files a/public/images/pokemon/657.png and b/public/images/pokemon/657.png differ diff --git a/public/images/pokemon/658-ash.json b/public/images/pokemon/658-ash.json index 8fbe19f5ccb..c2b8eede9ef 100644 --- a/public/images/pokemon/658-ash.json +++ b/public/images/pokemon/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 79, - "h": 79 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:936f62fa49ba4d6e402bb2e2eaf2afd0:ed00ba047a44b4bf1309bc147dd000e3:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 74 }, + "scale": "1" + } } diff --git a/public/images/pokemon/658-ash.png b/public/images/pokemon/658-ash.png index 8daaaa02063..a122df859bd 100644 Binary files a/public/images/pokemon/658-ash.png and b/public/images/pokemon/658-ash.png differ diff --git a/public/images/pokemon/658.json b/public/images/pokemon/658.json index 4fd918e0f50..219645ec240 100644 --- a/public/images/pokemon/658.json +++ b/public/images/pokemon/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e0b10df331bd4ce6760edab61dee144b:061561c45beff89a92bf0158d065204f:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "sourceSize": { "w": 85, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 85, "h": 67 }, + "scale": "1" + } } diff --git a/public/images/pokemon/658.png b/public/images/pokemon/658.png index 095b8c0039d..ed730c8b81c 100644 Binary files a/public/images/pokemon/658.png and b/public/images/pokemon/658.png differ diff --git a/public/images/pokemon/676-dandy.png b/public/images/pokemon/676-dandy.png index 1e9f9b7bb2c..54e36574b2a 100644 Binary files a/public/images/pokemon/676-dandy.png and b/public/images/pokemon/676-dandy.png differ diff --git a/public/images/pokemon/676-debutante.png b/public/images/pokemon/676-debutante.png index 92390b17f34..30d5bcafec5 100644 Binary files a/public/images/pokemon/676-debutante.png and b/public/images/pokemon/676-debutante.png differ diff --git a/public/images/pokemon/676-diamond.png b/public/images/pokemon/676-diamond.png index 3915b78ec26..953581d7bb7 100644 Binary files a/public/images/pokemon/676-diamond.png and b/public/images/pokemon/676-diamond.png differ diff --git a/public/images/pokemon/676-heart.png b/public/images/pokemon/676-heart.png index 99327208605..9e6950cc36c 100644 Binary files a/public/images/pokemon/676-heart.png and b/public/images/pokemon/676-heart.png differ diff --git a/public/images/pokemon/676-kabuki.png b/public/images/pokemon/676-kabuki.png index c4f6473c75b..0d7323a520c 100644 Binary files a/public/images/pokemon/676-kabuki.png and b/public/images/pokemon/676-kabuki.png differ diff --git a/public/images/pokemon/676-la-reine.png b/public/images/pokemon/676-la-reine.png index e649e6d74c8..c2f0eb72d75 100644 Binary files a/public/images/pokemon/676-la-reine.png and b/public/images/pokemon/676-la-reine.png differ diff --git a/public/images/pokemon/676-matron.png b/public/images/pokemon/676-matron.png index 98142c41661..1f93b11a277 100644 Binary files a/public/images/pokemon/676-matron.png and b/public/images/pokemon/676-matron.png differ diff --git a/public/images/pokemon/676-pharaoh.png b/public/images/pokemon/676-pharaoh.png index cced072318b..e0f48c46bab 100644 Binary files a/public/images/pokemon/676-pharaoh.png and b/public/images/pokemon/676-pharaoh.png differ diff --git a/public/images/pokemon/676-star.png b/public/images/pokemon/676-star.png index 7a1044bda75..566aa713aee 100644 Binary files a/public/images/pokemon/676-star.png and b/public/images/pokemon/676-star.png differ diff --git a/public/images/pokemon/682.png b/public/images/pokemon/682.png index 41ecd482b14..2a83ceedaa9 100644 Binary files a/public/images/pokemon/682.png and b/public/images/pokemon/682.png differ diff --git a/public/images/pokemon/683.png b/public/images/pokemon/683.png index bf559a07929..1b16b038c51 100644 Binary files a/public/images/pokemon/683.png and b/public/images/pokemon/683.png differ diff --git a/public/images/pokemon/684.png b/public/images/pokemon/684.png index 8bf8f765465..a3f7e544f89 100644 Binary files a/public/images/pokemon/684.png and b/public/images/pokemon/684.png differ diff --git a/public/images/pokemon/685.png b/public/images/pokemon/685.png index 521b7560182..957cd5d815b 100644 Binary files a/public/images/pokemon/685.png and b/public/images/pokemon/685.png differ diff --git a/public/images/pokemon/688.json b/public/images/pokemon/688.json index 84ec62d4211..3d9aa902a54 100644 --- a/public/images/pokemon/688.json +++ b/public/images/pokemon/688.json @@ -1,41 +1,18 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:f328f72c414efc6cf463a1254afa75ac:50168e1a7077626f41bdaf5d0b35af74:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "sourceSize": { "w": 64, "h": 63 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 64, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/688.png b/public/images/pokemon/688.png index 2ac1b5d5fb1..2e65d4beb6f 100644 Binary files a/public/images/pokemon/688.png and b/public/images/pokemon/688.png differ diff --git a/public/images/pokemon/689.json b/public/images/pokemon/689.json index 2ff881f55c0..488ef54de71 100644 --- a/public/images/pokemon/689.json +++ b/public/images/pokemon/689.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "689.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:1825183d2cc847c000400501e055918b:af535bb92b1490f3ab69be674b3b6fe0:bd0c58ecddcb4af9a0c6e7b39821d971$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "sourceSize": { "w": 79, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 82 }, + "scale": "1" + } } diff --git a/public/images/pokemon/689.png b/public/images/pokemon/689.png index 75fa0b474d7..1ec1bcec98a 100644 Binary files a/public/images/pokemon/689.png and b/public/images/pokemon/689.png differ diff --git a/public/images/pokemon/894.png b/public/images/pokemon/894.png index ea82d8bd82e..5f5b0535e8a 100644 Binary files a/public/images/pokemon/894.png and b/public/images/pokemon/894.png differ diff --git a/public/images/pokemon/945.png b/public/images/pokemon/945.png index 280ad17b152..74c43b6d32e 100644 Binary files a/public/images/pokemon/945.png and b/public/images/pokemon/945.png differ diff --git a/public/images/pokemon/back/1012-counterfeit.png b/public/images/pokemon/back/1012-counterfeit.png index 8ab1941187d..e6deb02c70c 100644 Binary files a/public/images/pokemon/back/1012-counterfeit.png and b/public/images/pokemon/back/1012-counterfeit.png differ diff --git a/public/images/pokemon/back/1013-unremarkable.png b/public/images/pokemon/back/1013-unremarkable.png index b8532d049fc..479f0e51cff 100644 Binary files a/public/images/pokemon/back/1013-unremarkable.png and b/public/images/pokemon/back/1013-unremarkable.png differ diff --git a/public/images/pokemon/back/172-spiky.png b/public/images/pokemon/back/172-spiky.png index 37b2d401f17..d038e0d3661 100644 Binary files a/public/images/pokemon/back/172-spiky.png and b/public/images/pokemon/back/172-spiky.png differ diff --git a/public/images/pokemon/back/172.png b/public/images/pokemon/back/172.png index 9f4c8f4f1bd..775a42dd948 100644 Binary files a/public/images/pokemon/back/172.png and b/public/images/pokemon/back/172.png differ diff --git a/public/images/pokemon/back/198.png b/public/images/pokemon/back/198.png index dbae4ffdfed..dc92c8b1d59 100644 Binary files a/public/images/pokemon/back/198.png and b/public/images/pokemon/back/198.png differ diff --git a/public/images/pokemon/back/2026.png b/public/images/pokemon/back/2026.png index 4e1e16c6207..1f0411ffcd8 100644 Binary files a/public/images/pokemon/back/2026.png and b/public/images/pokemon/back/2026.png differ diff --git a/public/images/pokemon/back/25-beauty-cosplay.png b/public/images/pokemon/back/25-beauty-cosplay.png index 30c51863f9f..8a57b642aa7 100644 Binary files a/public/images/pokemon/back/25-beauty-cosplay.png and b/public/images/pokemon/back/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/back/25-cool-cosplay.png b/public/images/pokemon/back/25-cool-cosplay.png index fe8e67a27cd..1c9528eb350 100644 Binary files a/public/images/pokemon/back/25-cool-cosplay.png and b/public/images/pokemon/back/25-cool-cosplay.png differ diff --git a/public/images/pokemon/back/25-cosplay.png b/public/images/pokemon/back/25-cosplay.png index 54c1dca4925..38e573f5784 100644 Binary files a/public/images/pokemon/back/25-cosplay.png and b/public/images/pokemon/back/25-cosplay.png differ diff --git a/public/images/pokemon/back/25-cute-cosplay.png b/public/images/pokemon/back/25-cute-cosplay.png index 9436bad0863..64b180067d5 100644 Binary files a/public/images/pokemon/back/25-cute-cosplay.png and b/public/images/pokemon/back/25-cute-cosplay.png differ diff --git a/public/images/pokemon/back/25-gigantamax.png b/public/images/pokemon/back/25-gigantamax.png index 70bf85129da..c80b3d5d486 100644 Binary files a/public/images/pokemon/back/25-gigantamax.png and b/public/images/pokemon/back/25-gigantamax.png differ diff --git a/public/images/pokemon/back/25-partner.png b/public/images/pokemon/back/25-partner.png index 8085a963e28..ae6133aefff 100644 Binary files a/public/images/pokemon/back/25-partner.png and b/public/images/pokemon/back/25-partner.png differ diff --git a/public/images/pokemon/back/25-smart-cosplay.png b/public/images/pokemon/back/25-smart-cosplay.png index 81a6d938154..6f23b7f4df0 100644 Binary files a/public/images/pokemon/back/25-smart-cosplay.png and b/public/images/pokemon/back/25-smart-cosplay.png differ diff --git a/public/images/pokemon/back/25-tough-cosplay.png b/public/images/pokemon/back/25-tough-cosplay.png index e70757866a5..cfc9392efe8 100644 Binary files a/public/images/pokemon/back/25-tough-cosplay.png and b/public/images/pokemon/back/25-tough-cosplay.png differ diff --git a/public/images/pokemon/back/25.png b/public/images/pokemon/back/25.png index 8085a963e28..ae6133aefff 100644 Binary files a/public/images/pokemon/back/25.png and b/public/images/pokemon/back/25.png differ diff --git a/public/images/pokemon/back/26.png b/public/images/pokemon/back/26.png index 21b3a5fa9c1..454c581edae 100644 Binary files a/public/images/pokemon/back/26.png and b/public/images/pokemon/back/26.png differ diff --git a/public/images/pokemon/back/276.png b/public/images/pokemon/back/276.png index 64c4a4d22ee..fef264f004e 100644 Binary files a/public/images/pokemon/back/276.png and b/public/images/pokemon/back/276.png differ diff --git a/public/images/pokemon/back/277.png b/public/images/pokemon/back/277.png index 0e173bc54fb..ced72a75a73 100644 Binary files a/public/images/pokemon/back/277.png and b/public/images/pokemon/back/277.png differ diff --git a/public/images/pokemon/back/379.png b/public/images/pokemon/back/379.png index 586a19a5916..b4f282d5989 100644 Binary files a/public/images/pokemon/back/379.png and b/public/images/pokemon/back/379.png differ diff --git a/public/images/pokemon/back/390.png b/public/images/pokemon/back/390.png index 65b5595cfbe..d6dcc990c48 100644 Binary files a/public/images/pokemon/back/390.png and b/public/images/pokemon/back/390.png differ diff --git a/public/images/pokemon/back/391.png b/public/images/pokemon/back/391.png index e89d79720ab..9b41cd2bd89 100644 Binary files a/public/images/pokemon/back/391.png and b/public/images/pokemon/back/391.png differ diff --git a/public/images/pokemon/back/392.png b/public/images/pokemon/back/392.png index e15396669ce..2e7466294da 100644 Binary files a/public/images/pokemon/back/392.png and b/public/images/pokemon/back/392.png differ diff --git a/public/images/pokemon/back/430.png b/public/images/pokemon/back/430.png index 6c0fc8a5166..383685fa816 100644 Binary files a/public/images/pokemon/back/430.png and b/public/images/pokemon/back/430.png differ diff --git a/public/images/pokemon/back/455.png b/public/images/pokemon/back/455.png index 116faf6f090..2191905e2ce 100644 Binary files a/public/images/pokemon/back/455.png and b/public/images/pokemon/back/455.png differ diff --git a/public/images/pokemon/back/486.png b/public/images/pokemon/back/486.png index 041b03e5790..4df438f6320 100644 Binary files a/public/images/pokemon/back/486.png and b/public/images/pokemon/back/486.png differ diff --git a/public/images/pokemon/back/502.png b/public/images/pokemon/back/502.png index 4857186bd7e..5225cb803e0 100644 Binary files a/public/images/pokemon/back/502.png and b/public/images/pokemon/back/502.png differ diff --git a/public/images/pokemon/back/503.png b/public/images/pokemon/back/503.png index 96a901b2bdc..8b38780da27 100644 Binary files a/public/images/pokemon/back/503.png and b/public/images/pokemon/back/503.png differ diff --git a/public/images/pokemon/back/527.png b/public/images/pokemon/back/527.png index 61eab42c767..ce061ffe60a 100644 Binary files a/public/images/pokemon/back/527.png and b/public/images/pokemon/back/527.png differ diff --git a/public/images/pokemon/back/528.png b/public/images/pokemon/back/528.png index 1b7733cd4db..81fc8414dd8 100644 Binary files a/public/images/pokemon/back/528.png and b/public/images/pokemon/back/528.png differ diff --git a/public/images/pokemon/back/587.png b/public/images/pokemon/back/587.png index e7304b754ce..8932c1f480a 100644 Binary files a/public/images/pokemon/back/587.png and b/public/images/pokemon/back/587.png differ diff --git a/public/images/pokemon/back/590.png b/public/images/pokemon/back/590.png index 9874d4e216d..6e7685b2ced 100644 Binary files a/public/images/pokemon/back/590.png and b/public/images/pokemon/back/590.png differ diff --git a/public/images/pokemon/back/591.png b/public/images/pokemon/back/591.png index af87fdf527e..2f2d9f34f08 100644 Binary files a/public/images/pokemon/back/591.png and b/public/images/pokemon/back/591.png differ diff --git a/public/images/pokemon/back/616.png b/public/images/pokemon/back/616.png index 751eaf485da..7033e50a0dd 100644 Binary files a/public/images/pokemon/back/616.png and b/public/images/pokemon/back/616.png differ diff --git a/public/images/pokemon/back/6503.png b/public/images/pokemon/back/6503.png index 3953d5d6c66..c88de28046e 100644 Binary files a/public/images/pokemon/back/6503.png and b/public/images/pokemon/back/6503.png differ diff --git a/public/images/pokemon/back/656.png b/public/images/pokemon/back/656.png index 5f6ce42c63b..62362337762 100644 Binary files a/public/images/pokemon/back/656.png and b/public/images/pokemon/back/656.png differ diff --git a/public/images/pokemon/back/657.png b/public/images/pokemon/back/657.png index c7655a643b2..1e61b595e49 100644 Binary files a/public/images/pokemon/back/657.png and b/public/images/pokemon/back/657.png differ diff --git a/public/images/pokemon/back/658-ash.json b/public/images/pokemon/back/658-ash.json index 4ddab1765b2..51a722070b3 100644 --- a/public/images/pokemon/back/658-ash.json +++ b/public/images/pokemon/back/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 73, - "h": 73 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:4f38801bb3afeda5faff04bdcf6a666f:0c78ce2715e7510bf55da0a92b42661c:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 73, "h": 73 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/658-ash.png b/public/images/pokemon/back/658-ash.png index e574e888fac..382b06fd6cb 100644 Binary files a/public/images/pokemon/back/658-ash.png and b/public/images/pokemon/back/658-ash.png differ diff --git a/public/images/pokemon/back/658.json b/public/images/pokemon/back/658.json index 119002876a6..050b63e3592 100644 --- a/public/images/pokemon/back/658.json +++ b/public/images/pokemon/back/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 77, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:acdb9925f3f23b947504eec7cc28c92d:1a13d9d418f6c107bb9e5d621d9154bb:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 77, "h": 77 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/658.png b/public/images/pokemon/back/658.png index a8128e1c73f..ea24d9a6336 100644 Binary files a/public/images/pokemon/back/658.png and b/public/images/pokemon/back/658.png differ diff --git a/public/images/pokemon/back/676-dandy.png b/public/images/pokemon/back/676-dandy.png index f8052549668..8a4f26e17b2 100644 Binary files a/public/images/pokemon/back/676-dandy.png and b/public/images/pokemon/back/676-dandy.png differ diff --git a/public/images/pokemon/back/676-debutante.png b/public/images/pokemon/back/676-debutante.png index 507ea4addbe..bed3f323a6b 100644 Binary files a/public/images/pokemon/back/676-debutante.png and b/public/images/pokemon/back/676-debutante.png differ diff --git a/public/images/pokemon/back/676-diamond.png b/public/images/pokemon/back/676-diamond.png index 9498e4e75be..436d9b6dbde 100644 Binary files a/public/images/pokemon/back/676-diamond.png and b/public/images/pokemon/back/676-diamond.png differ diff --git a/public/images/pokemon/back/676-heart.png b/public/images/pokemon/back/676-heart.png index 49c83c6c113..57d472c3834 100644 Binary files a/public/images/pokemon/back/676-heart.png and b/public/images/pokemon/back/676-heart.png differ diff --git a/public/images/pokemon/back/676-kabuki.png b/public/images/pokemon/back/676-kabuki.png index 2aa6fccce61..d602c607643 100644 Binary files a/public/images/pokemon/back/676-kabuki.png and b/public/images/pokemon/back/676-kabuki.png differ diff --git a/public/images/pokemon/back/676-la-reine.png b/public/images/pokemon/back/676-la-reine.png index 2147e5cab01..de1b1a15b90 100644 Binary files a/public/images/pokemon/back/676-la-reine.png and b/public/images/pokemon/back/676-la-reine.png differ diff --git a/public/images/pokemon/back/676-matron.png b/public/images/pokemon/back/676-matron.png index 38092e4fefe..e01a8f273af 100644 Binary files a/public/images/pokemon/back/676-matron.png and b/public/images/pokemon/back/676-matron.png differ diff --git a/public/images/pokemon/back/676-pharaoh.png b/public/images/pokemon/back/676-pharaoh.png index a7ca046406f..13952c58c68 100644 Binary files a/public/images/pokemon/back/676-pharaoh.png and b/public/images/pokemon/back/676-pharaoh.png differ diff --git a/public/images/pokemon/back/676-star.png b/public/images/pokemon/back/676-star.png index 9b082488381..5b188f33498 100644 Binary files a/public/images/pokemon/back/676-star.png and b/public/images/pokemon/back/676-star.png differ diff --git a/public/images/pokemon/back/682.png b/public/images/pokemon/back/682.png index a801a3be1d4..60f869b2f2c 100644 Binary files a/public/images/pokemon/back/682.png and b/public/images/pokemon/back/682.png differ diff --git a/public/images/pokemon/back/683.png b/public/images/pokemon/back/683.png index 2183bc34796..38247067a25 100644 Binary files a/public/images/pokemon/back/683.png and b/public/images/pokemon/back/683.png differ diff --git a/public/images/pokemon/back/684.png b/public/images/pokemon/back/684.png index 1ba17e86bac..3f02f312123 100644 Binary files a/public/images/pokemon/back/684.png and b/public/images/pokemon/back/684.png differ diff --git a/public/images/pokemon/back/685.png b/public/images/pokemon/back/685.png index b1a18694193..eab453253cc 100644 Binary files a/public/images/pokemon/back/685.png and b/public/images/pokemon/back/685.png differ diff --git a/public/images/pokemon/back/688.json b/public/images/pokemon/back/688.json index 872fbc1f9db..d9f30db34a8 100644 --- a/public/images/pokemon/back/688.json +++ b/public/images/pokemon/back/688.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:ea462f2b1b46327e3b8fcb7ec5e44f08:2d2598cc03dec73182dbea237ad83b34:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "sourceSize": { "w": 51, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "688.png", + "format": "I8", + "size": { "w": 51, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/688.png b/public/images/pokemon/back/688.png index 33602c624a7..bb22ceed75e 100644 Binary files a/public/images/pokemon/back/688.png and b/public/images/pokemon/back/688.png differ diff --git a/public/images/pokemon/back/894.png b/public/images/pokemon/back/894.png index 337cba1cc71..b4cc4974ce2 100644 Binary files a/public/images/pokemon/back/894.png and b/public/images/pokemon/back/894.png differ diff --git a/public/images/pokemon/back/945.png b/public/images/pokemon/back/945.png index a89963b7cc3..6359f2cd77a 100644 Binary files a/public/images/pokemon/back/945.png and b/public/images/pokemon/back/945.png differ diff --git a/public/images/pokemon/back/female/198.png b/public/images/pokemon/back/female/198.png index 4f3f5d5c1a4..01489a05fb0 100644 Binary files a/public/images/pokemon/back/female/198.png and b/public/images/pokemon/back/female/198.png differ diff --git a/public/images/pokemon/back/female/25-beauty-cosplay.png b/public/images/pokemon/back/female/25-beauty-cosplay.png index b33e374aa6d..161cc301f7b 100644 Binary files a/public/images/pokemon/back/female/25-beauty-cosplay.png and b/public/images/pokemon/back/female/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cool-cosplay.png b/public/images/pokemon/back/female/25-cool-cosplay.png index e672040eaab..d10328785c8 100644 Binary files a/public/images/pokemon/back/female/25-cool-cosplay.png and b/public/images/pokemon/back/female/25-cool-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cosplay.png b/public/images/pokemon/back/female/25-cosplay.png index 2ebb0fe2285..644aec70f50 100644 Binary files a/public/images/pokemon/back/female/25-cosplay.png and b/public/images/pokemon/back/female/25-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-cute-cosplay.png b/public/images/pokemon/back/female/25-cute-cosplay.png index 998a41f7396..552d816e142 100644 Binary files a/public/images/pokemon/back/female/25-cute-cosplay.png and b/public/images/pokemon/back/female/25-cute-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-partner.png b/public/images/pokemon/back/female/25-partner.png index 97ceaa8bb2f..e65e58ec131 100644 Binary files a/public/images/pokemon/back/female/25-partner.png and b/public/images/pokemon/back/female/25-partner.png differ diff --git a/public/images/pokemon/back/female/25-smart-cosplay.png b/public/images/pokemon/back/female/25-smart-cosplay.png index 983f49e7024..c84c0b556aa 100644 Binary files a/public/images/pokemon/back/female/25-smart-cosplay.png and b/public/images/pokemon/back/female/25-smart-cosplay.png differ diff --git a/public/images/pokemon/back/female/25-tough-cosplay.png b/public/images/pokemon/back/female/25-tough-cosplay.png index a043231f172..73be0c8fb85 100644 Binary files a/public/images/pokemon/back/female/25-tough-cosplay.png and b/public/images/pokemon/back/female/25-tough-cosplay.png differ diff --git a/public/images/pokemon/back/female/25.png b/public/images/pokemon/back/female/25.png index 97ceaa8bb2f..e65e58ec131 100644 Binary files a/public/images/pokemon/back/female/25.png and b/public/images/pokemon/back/female/25.png differ diff --git a/public/images/pokemon/back/female/26.png b/public/images/pokemon/back/female/26.png index 40d39589660..2a6a3e41b2f 100644 Binary files a/public/images/pokemon/back/female/26.png and b/public/images/pokemon/back/female/26.png differ diff --git a/public/images/pokemon/back/shiny/378.png b/public/images/pokemon/back/shiny/378.png index ecaa26564c3..7bb24f1edfe 100644 Binary files a/public/images/pokemon/back/shiny/378.png and b/public/images/pokemon/back/shiny/378.png differ diff --git a/public/images/pokemon/back/shiny/658-ash.json b/public/images/pokemon/back/shiny/658-ash.json index a796ad08246..51a722070b3 100644 --- a/public/images/pokemon/back/shiny/658-ash.json +++ b/public/images/pokemon/back/shiny/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 73, - "h": 73 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 73, - "h": 69 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - }, - "frame": { - "x": 0, - "y": 0, - "w": 73, - "h": 69 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d474b821316a87dfe09b397bdc2db5ef:497de0c2ec59ceba163e870b3226c76c:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 73, "h": 73 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/658-ash.png b/public/images/pokemon/back/shiny/658-ash.png index e41efb2c7ad..6e10e834731 100644 Binary files a/public/images/pokemon/back/shiny/658-ash.png and b/public/images/pokemon/back/shiny/658-ash.png differ diff --git a/public/images/pokemon/back/shiny/658.json b/public/images/pokemon/back/shiny/658.json index cc5d3c5b9ff..050b63e3592 100644 --- a/public/images/pokemon/back/shiny/658.json +++ b/public/images/pokemon/back/shiny/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 77, - "h": 77 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 77, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 77, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:5891f87a78022cde3402e7d9714cc7bf:756360084290e39c139e3fef91c81759:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 77, "h": 77 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/658.png b/public/images/pokemon/back/shiny/658.png index 8b7f9c7e4fb..21519b6a145 100644 Binary files a/public/images/pokemon/back/shiny/658.png and b/public/images/pokemon/back/shiny/658.png differ diff --git a/public/images/pokemon/back/shiny/688.json b/public/images/pokemon/back/shiny/688.json index 56cf47aab5a..d9f30db34a8 100644 --- a/public/images/pokemon/back/shiny/688.json +++ b/public/images/pokemon/back/shiny/688.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0261b6c9242bba728fcfbfc515875b27:de0d9ddceed9311b33ae50ba86e969d1:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 51, "h": 65 }, + "sourceSize": { "w": 51, "h": 65 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-dev", + "image": "688.png", + "format": "I8", + "size": { "w": 51, "h": 65 }, + "scale": "1" + } } diff --git a/public/images/pokemon/back/shiny/688.png b/public/images/pokemon/back/shiny/688.png index c4aff6eb12d..bfff80c4925 100644 Binary files a/public/images/pokemon/back/shiny/688.png and b/public/images/pokemon/back/shiny/688.png differ diff --git a/public/images/pokemon/back/shiny/944.png b/public/images/pokemon/back/shiny/944.png index 24957073d46..a33c2a39c2f 100644 Binary files a/public/images/pokemon/back/shiny/944.png and b/public/images/pokemon/back/shiny/944.png differ diff --git a/public/images/pokemon/back/shiny/945.png b/public/images/pokemon/back/shiny/945.png index a1cc685f008..38be3590480 100644 Binary files a/public/images/pokemon/back/shiny/945.png and b/public/images/pokemon/back/shiny/945.png differ diff --git a/public/images/pokemon/exp/2026.png b/public/images/pokemon/exp/2026.png index 80ac591cd62..718fb8957b3 100644 Binary files a/public/images/pokemon/exp/2026.png and b/public/images/pokemon/exp/2026.png differ diff --git a/public/images/pokemon/exp/359-mega.png b/public/images/pokemon/exp/359-mega.png index 8b6d0dd2b4a..10787a35a8b 100644 Binary files a/public/images/pokemon/exp/359-mega.png and b/public/images/pokemon/exp/359-mega.png differ diff --git a/public/images/pokemon/exp/6503.png b/public/images/pokemon/exp/6503.png index 28d3a366fef..d1a698254cb 100644 Binary files a/public/images/pokemon/exp/6503.png and b/public/images/pokemon/exp/6503.png differ diff --git a/public/images/pokemon/exp/656.png b/public/images/pokemon/exp/656.png index 4f4af590a45..7afec8b08ee 100644 Binary files a/public/images/pokemon/exp/656.png and b/public/images/pokemon/exp/656.png differ diff --git a/public/images/pokemon/exp/657.png b/public/images/pokemon/exp/657.png index 6cfff5af3f7..404fb30a2b2 100644 Binary files a/public/images/pokemon/exp/657.png and b/public/images/pokemon/exp/657.png differ diff --git a/public/images/pokemon/exp/658-ash.json b/public/images/pokemon/exp/658-ash.json index f3a02cb1774..52dbac8366a 100644 --- a/public/images/pokemon/exp/658-ash.json +++ b/public/images/pokemon/exp/658-ash.json @@ -1,671 +1,299 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:cfb009f1af61ea752bdb3266bffd0fd0:e1abe8d09d1fe3c1ec758293b0a4bed5:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 237, "h": 148 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/658-ash.png b/public/images/pokemon/exp/658-ash.png index 5d80ca1ad0e..6bb84f3e4fd 100644 Binary files a/public/images/pokemon/exp/658-ash.png and b/public/images/pokemon/exp/658-ash.png differ diff --git a/public/images/pokemon/exp/658.png b/public/images/pokemon/exp/658.png index ab2e30592f6..83b2f5fab89 100644 Binary files a/public/images/pokemon/exp/658.png and b/public/images/pokemon/exp/658.png differ diff --git a/public/images/pokemon/exp/662.png b/public/images/pokemon/exp/662.png index 090e6e4c91f..e47863f724b 100644 Binary files a/public/images/pokemon/exp/662.png and b/public/images/pokemon/exp/662.png differ diff --git a/public/images/pokemon/exp/682.png b/public/images/pokemon/exp/682.png index 35ab3a5c315..104dc143677 100644 Binary files a/public/images/pokemon/exp/682.png and b/public/images/pokemon/exp/682.png differ diff --git a/public/images/pokemon/exp/683.png b/public/images/pokemon/exp/683.png index 5e8ff5acd30..d657a0ee5fd 100644 Binary files a/public/images/pokemon/exp/683.png and b/public/images/pokemon/exp/683.png differ diff --git a/public/images/pokemon/exp/684.png b/public/images/pokemon/exp/684.png index d7d6b29f730..84f06ee4f3c 100644 Binary files a/public/images/pokemon/exp/684.png and b/public/images/pokemon/exp/684.png differ diff --git a/public/images/pokemon/exp/685.png b/public/images/pokemon/exp/685.png index cfccc4f119b..2a1ab94bc22 100644 Binary files a/public/images/pokemon/exp/685.png and b/public/images/pokemon/exp/685.png differ diff --git a/public/images/pokemon/exp/894.png b/public/images/pokemon/exp/894.png index 4879a1ca5ec..749eec38e5e 100644 Binary files a/public/images/pokemon/exp/894.png and b/public/images/pokemon/exp/894.png differ diff --git a/public/images/pokemon/exp/945.png b/public/images/pokemon/exp/945.png index 074c03fda29..b50e1a9af52 100644 Binary files a/public/images/pokemon/exp/945.png and b/public/images/pokemon/exp/945.png differ diff --git a/public/images/pokemon/exp/back/2026.png b/public/images/pokemon/exp/back/2026.png index 007e4bee3e0..0624bb2c5e7 100644 Binary files a/public/images/pokemon/exp/back/2026.png and b/public/images/pokemon/exp/back/2026.png differ diff --git a/public/images/pokemon/exp/back/359-mega.png b/public/images/pokemon/exp/back/359-mega.png index 4ba1dd3ff81..1659752a571 100644 Binary files a/public/images/pokemon/exp/back/359-mega.png and b/public/images/pokemon/exp/back/359-mega.png differ diff --git a/public/images/pokemon/exp/back/6503.png b/public/images/pokemon/exp/back/6503.png index f5a2395826a..39b93590981 100644 Binary files a/public/images/pokemon/exp/back/6503.png and b/public/images/pokemon/exp/back/6503.png differ diff --git a/public/images/pokemon/exp/back/656.png b/public/images/pokemon/exp/back/656.png index 3a7b6fcec5c..99119d2e96e 100644 Binary files a/public/images/pokemon/exp/back/656.png and b/public/images/pokemon/exp/back/656.png differ diff --git a/public/images/pokemon/exp/back/657.png b/public/images/pokemon/exp/back/657.png index 7484a85289c..72e8367e10d 100644 Binary files a/public/images/pokemon/exp/back/657.png and b/public/images/pokemon/exp/back/657.png differ diff --git a/public/images/pokemon/exp/back/658-ash.json b/public/images/pokemon/exp/back/658-ash.json index 9c2e394a89d..8e360497b8d 100644 --- a/public/images/pokemon/exp/back/658-ash.json +++ b/public/images/pokemon/exp/back/658-ash.json @@ -1,188 +1,155 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 75, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0121f3850f8a57a4a046524a1a5974dd:168ffc856b6fea872641e8672304766c:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 146, "h": 146 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/658-ash.png b/public/images/pokemon/exp/back/658-ash.png index 8921ea65270..5d8794a1c0f 100644 Binary files a/public/images/pokemon/exp/back/658-ash.png and b/public/images/pokemon/exp/back/658-ash.png differ diff --git a/public/images/pokemon/exp/back/658.json b/public/images/pokemon/exp/back/658.json index 2fa50a7d23f..453f6c16dc6 100644 --- a/public/images/pokemon/exp/back/658.json +++ b/public/images/pokemon/exp/back/658.json @@ -1,188 +1,92 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:63845d55db2350ed7cd6956836dc9510:7129df11a518cdd74572c2016d5f8ed8:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658.png", + "format": "I8", + "size": { "w": 154, "h": 154 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/658.png b/public/images/pokemon/exp/back/658.png index edcfa15b9f3..07b9084c43e 100644 Binary files a/public/images/pokemon/exp/back/658.png and b/public/images/pokemon/exp/back/658.png differ diff --git a/public/images/pokemon/exp/back/662.png b/public/images/pokemon/exp/back/662.png index e2a3111062f..4e6a3c88277 100644 Binary files a/public/images/pokemon/exp/back/662.png and b/public/images/pokemon/exp/back/662.png differ diff --git a/public/images/pokemon/exp/back/682.png b/public/images/pokemon/exp/back/682.png index 9f713bfb828..d926cdc22a8 100644 Binary files a/public/images/pokemon/exp/back/682.png and b/public/images/pokemon/exp/back/682.png differ diff --git a/public/images/pokemon/exp/back/683.png b/public/images/pokemon/exp/back/683.png index 76aa9914d20..e65d213eaf2 100644 Binary files a/public/images/pokemon/exp/back/683.png and b/public/images/pokemon/exp/back/683.png differ diff --git a/public/images/pokemon/exp/back/684.png b/public/images/pokemon/exp/back/684.png index a58d2c77eb8..517cc69f8ee 100644 Binary files a/public/images/pokemon/exp/back/684.png and b/public/images/pokemon/exp/back/684.png differ diff --git a/public/images/pokemon/exp/back/685.png b/public/images/pokemon/exp/back/685.png index c791e4e92d7..d05cf54fb63 100644 Binary files a/public/images/pokemon/exp/back/685.png and b/public/images/pokemon/exp/back/685.png differ diff --git a/public/images/pokemon/exp/back/894.png b/public/images/pokemon/exp/back/894.png index c83851c2d54..e82e8dc0183 100644 Binary files a/public/images/pokemon/exp/back/894.png and b/public/images/pokemon/exp/back/894.png differ diff --git a/public/images/pokemon/exp/back/944.png b/public/images/pokemon/exp/back/944.png index 1f4139b4128..5162fa285be 100644 Binary files a/public/images/pokemon/exp/back/944.png and b/public/images/pokemon/exp/back/944.png differ diff --git a/public/images/pokemon/exp/back/945.png b/public/images/pokemon/exp/back/945.png index 98e56cc2468..74d4e56a598 100644 Binary files a/public/images/pokemon/exp/back/945.png and b/public/images/pokemon/exp/back/945.png differ diff --git a/public/images/pokemon/exp/back/shiny/658-ash.json b/public/images/pokemon/exp/back/shiny/658-ash.json index db9e546af7f..8e360497b8d 100644 --- a/public/images/pokemon/exp/back/shiny/658-ash.json +++ b/public/images/pokemon/exp/back/shiny/658-ash.json @@ -1,188 +1,155 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 75, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:d9855568004fd93bcd73aa782894b172:d7e4656a720ccca08a26ed4485129bb3:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 0, "y": 73, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 73, "y": 0, "w": 73, "h": 73 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 73, "h": 73 }, + "sourceSize": { "w": 73, "h": 73 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 146, "h": 146 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/658-ash.png b/public/images/pokemon/exp/back/shiny/658-ash.png index a2a53dbdbc7..3269d435c94 100644 Binary files a/public/images/pokemon/exp/back/shiny/658-ash.png and b/public/images/pokemon/exp/back/shiny/658-ash.png differ diff --git a/public/images/pokemon/exp/back/shiny/658.json b/public/images/pokemon/exp/back/shiny/658.json index 8dc315c768e..453f6c16dc6 100644 --- a/public/images/pokemon/exp/back/shiny/658.json +++ b/public/images/pokemon/exp/back/shiny/658.json @@ -1,188 +1,92 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 62 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 62 - } - }, - { - "filename": "0001.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 62 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 61 - }, - "frame": { - "x": 0, - "y": 62, - "w": 75, - "h": 61 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:661efcc0c742bc0d4b4e26900a59332f:d0aa0f579971d046660bf77b4044aa35:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 0, "y": 77, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 77, "y": 0, "w": 77, "h": 77 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 77, "h": 77 }, + "sourceSize": { "w": 77, "h": 77 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658.png", + "format": "I8", + "size": { "w": 154, "h": 154 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/back/shiny/658.png b/public/images/pokemon/exp/back/shiny/658.png index 416f1145463..bb0ee7accdf 100644 Binary files a/public/images/pokemon/exp/back/shiny/658.png and b/public/images/pokemon/exp/back/shiny/658.png differ diff --git a/public/images/pokemon/exp/back/shiny/662.png b/public/images/pokemon/exp/back/shiny/662.png index b4e6c703eab..e662b3198a6 100644 Binary files a/public/images/pokemon/exp/back/shiny/662.png and b/public/images/pokemon/exp/back/shiny/662.png differ diff --git a/public/images/pokemon/exp/back/shiny/944.png b/public/images/pokemon/exp/back/shiny/944.png index a0d96282076..060e8a99545 100644 Binary files a/public/images/pokemon/exp/back/shiny/944.png and b/public/images/pokemon/exp/back/shiny/944.png differ diff --git a/public/images/pokemon/exp/back/shiny/945.png b/public/images/pokemon/exp/back/shiny/945.png index dabe70fdb31..71644f57479 100644 Binary files a/public/images/pokemon/exp/back/shiny/945.png and b/public/images/pokemon/exp/back/shiny/945.png differ diff --git a/public/images/pokemon/exp/shiny/658-ash.json b/public/images/pokemon/exp/shiny/658-ash.json index 5101079ce90..52dbac8366a 100644 --- a/public/images/pokemon/exp/shiny/658-ash.json +++ b/public/images/pokemon/exp/shiny/658-ash.json @@ -1,671 +1,299 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 150, - "h": 150 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0002.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0003.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0004.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0017.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0018.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0019.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0020.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0005.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0006.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0007.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0008.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0013.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0014.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0015.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0016.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0029.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0030.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0031.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 75, - "y": 0, - "w": 75, - "h": 66 - } - }, - { - "filename": "0021.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0022.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0023.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0024.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 66 - }, - "frame": { - "x": 0, - "y": 66, - "w": 75, - "h": 66 - } - }, - { - "filename": "0009.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0010.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0011.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0012.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0025.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0026.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0027.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - }, - { - "filename": "0028.png", - "rotated": false, - "trimmed": true, - "sourceSize": { - "w": 75, - "h": 66 - }, - "spriteSourceSize": { - "x": 0, - "y": 1, - "w": 75, - "h": 65 - }, - "frame": { - "x": 75, - "y": 66, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:0875c2204eeabc96bd1f034bcc69210b:e1abe8d09d1fe3c1ec758293b0a4bed5:f09eeed5adc5ec50aec50218e03662c2$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0002.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0003.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0004.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0005.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0006.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0007.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0008.png", + "frame": { "x": 79, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0009.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0010.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0011.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0012.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0013.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0014.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0015.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0016.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0017.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0018.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0019.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0020.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0021.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0022.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0023.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0024.png", + "frame": { "x": 79, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0025.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0026.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0027.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0028.png", + "frame": { "x": 158, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0029.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0030.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0031.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + }, + { + "filename": "0032.png", + "frame": { "x": 0, "y": 74, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "image": "658-ash.png", + "format": "I8", + "size": { "w": 237, "h": 148 }, + "scale": "1" + } } diff --git a/public/images/pokemon/exp/shiny/658-ash.png b/public/images/pokemon/exp/shiny/658-ash.png index 5d80ca1ad0e..5b25ec9e021 100644 Binary files a/public/images/pokemon/exp/shiny/658-ash.png and b/public/images/pokemon/exp/shiny/658-ash.png differ diff --git a/public/images/pokemon/exp/shiny/658.png b/public/images/pokemon/exp/shiny/658.png index 999bc74c659..e7278458f2c 100644 Binary files a/public/images/pokemon/exp/shiny/658.png and b/public/images/pokemon/exp/shiny/658.png differ diff --git a/public/images/pokemon/exp/shiny/662.png b/public/images/pokemon/exp/shiny/662.png index ec0100f3e96..e45e79556c5 100644 Binary files a/public/images/pokemon/exp/shiny/662.png and b/public/images/pokemon/exp/shiny/662.png differ diff --git a/public/images/pokemon/exp/shiny/684.png b/public/images/pokemon/exp/shiny/684.png index 96fbea5e395..ed7b392cd6d 100644 Binary files a/public/images/pokemon/exp/shiny/684.png and b/public/images/pokemon/exp/shiny/684.png differ diff --git a/public/images/pokemon/exp/shiny/944.png b/public/images/pokemon/exp/shiny/944.png index fdb0f2ecb68..ee13a988a2b 100644 Binary files a/public/images/pokemon/exp/shiny/944.png and b/public/images/pokemon/exp/shiny/944.png differ diff --git a/public/images/pokemon/exp/shiny/945.png b/public/images/pokemon/exp/shiny/945.png index 9b938dfcfdd..3dba64c6ee8 100644 Binary files a/public/images/pokemon/exp/shiny/945.png and b/public/images/pokemon/exp/shiny/945.png differ diff --git a/public/images/pokemon/female/154.png b/public/images/pokemon/female/154.png index 4921f1556aa..f671d6b75aa 100644 Binary files a/public/images/pokemon/female/154.png and b/public/images/pokemon/female/154.png differ diff --git a/public/images/pokemon/female/194.png b/public/images/pokemon/female/194.png index 39c18727c2d..c0066f051ee 100644 Binary files a/public/images/pokemon/female/194.png and b/public/images/pokemon/female/194.png differ diff --git a/public/images/pokemon/female/198.png b/public/images/pokemon/female/198.png index 29bf2a296a5..9cead4fcbe0 100644 Binary files a/public/images/pokemon/female/198.png and b/public/images/pokemon/female/198.png differ diff --git a/public/images/pokemon/female/25-beauty-cosplay.png b/public/images/pokemon/female/25-beauty-cosplay.png index 018d0011254..26887468559 100644 Binary files a/public/images/pokemon/female/25-beauty-cosplay.png and b/public/images/pokemon/female/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/female/25-cool-cosplay.png b/public/images/pokemon/female/25-cool-cosplay.png index 5936a9042ed..ae1e7c76d44 100644 Binary files a/public/images/pokemon/female/25-cool-cosplay.png and b/public/images/pokemon/female/25-cool-cosplay.png differ diff --git a/public/images/pokemon/female/25-cosplay.png b/public/images/pokemon/female/25-cosplay.png index 1f8f381419b..145d32e5130 100644 Binary files a/public/images/pokemon/female/25-cosplay.png and b/public/images/pokemon/female/25-cosplay.png differ diff --git a/public/images/pokemon/female/25-cute-cosplay.png b/public/images/pokemon/female/25-cute-cosplay.png index f559198f7ac..675a141b0fd 100644 Binary files a/public/images/pokemon/female/25-cute-cosplay.png and b/public/images/pokemon/female/25-cute-cosplay.png differ diff --git a/public/images/pokemon/female/25-partner.png b/public/images/pokemon/female/25-partner.png index e500db2a3be..8ce8d01c937 100644 Binary files a/public/images/pokemon/female/25-partner.png and b/public/images/pokemon/female/25-partner.png differ diff --git a/public/images/pokemon/female/25-smart-cosplay.png b/public/images/pokemon/female/25-smart-cosplay.png index b5c979e78ec..8306fb17dea 100644 Binary files a/public/images/pokemon/female/25-smart-cosplay.png and b/public/images/pokemon/female/25-smart-cosplay.png differ diff --git a/public/images/pokemon/female/25-tough-cosplay.png b/public/images/pokemon/female/25-tough-cosplay.png index 2896e27c8a9..a12d4a40a88 100644 Binary files a/public/images/pokemon/female/25-tough-cosplay.png and b/public/images/pokemon/female/25-tough-cosplay.png differ diff --git a/public/images/pokemon/female/25.png b/public/images/pokemon/female/25.png index e500db2a3be..8ce8d01c937 100644 Binary files a/public/images/pokemon/female/25.png and b/public/images/pokemon/female/25.png differ diff --git a/public/images/pokemon/female/26.png b/public/images/pokemon/female/26.png index 3f8c46ac761..242785a81cc 100644 Binary files a/public/images/pokemon/female/26.png and b/public/images/pokemon/female/26.png differ diff --git a/public/images/pokemon/icons/1/25-beauty-cosplay.png b/public/images/pokemon/icons/1/25-beauty-cosplay.png index 19fd467ebd7..f9b6f3dcc82 100644 Binary files a/public/images/pokemon/icons/1/25-beauty-cosplay.png and b/public/images/pokemon/icons/1/25-beauty-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cool-cosplay.png b/public/images/pokemon/icons/1/25-cool-cosplay.png index 7d1b0954524..6436dff6dbb 100644 Binary files a/public/images/pokemon/icons/1/25-cool-cosplay.png and b/public/images/pokemon/icons/1/25-cool-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cosplay.png b/public/images/pokemon/icons/1/25-cosplay.png index 74f0b993ce4..580805ef797 100644 Binary files a/public/images/pokemon/icons/1/25-cosplay.png and b/public/images/pokemon/icons/1/25-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-cute-cosplay.png b/public/images/pokemon/icons/1/25-cute-cosplay.png index 76488be18fe..71822acab8b 100644 Binary files a/public/images/pokemon/icons/1/25-cute-cosplay.png and b/public/images/pokemon/icons/1/25-cute-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-gigantamax.png b/public/images/pokemon/icons/1/25-gigantamax.png index ee10d68fd92..8650a88a62e 100644 Binary files a/public/images/pokemon/icons/1/25-gigantamax.png and b/public/images/pokemon/icons/1/25-gigantamax.png differ diff --git a/public/images/pokemon/icons/1/25-smart-cosplay.png b/public/images/pokemon/icons/1/25-smart-cosplay.png index 7eb69c5a17e..90aba5ddbf0 100644 Binary files a/public/images/pokemon/icons/1/25-smart-cosplay.png and b/public/images/pokemon/icons/1/25-smart-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25-tough-cosplay.png b/public/images/pokemon/icons/1/25-tough-cosplay.png index 45c95ada80e..18101b5b497 100644 Binary files a/public/images/pokemon/icons/1/25-tough-cosplay.png and b/public/images/pokemon/icons/1/25-tough-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-beauty-cosplay.png b/public/images/pokemon/icons/1/25s-beauty-cosplay.png index 19fd467ebd7..3b524dfcb06 100644 Binary files a/public/images/pokemon/icons/1/25s-beauty-cosplay.png and b/public/images/pokemon/icons/1/25s-beauty-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cool-cosplay.png b/public/images/pokemon/icons/1/25s-cool-cosplay.png index 7d1b0954524..0a3fc2d11ac 100644 Binary files a/public/images/pokemon/icons/1/25s-cool-cosplay.png and b/public/images/pokemon/icons/1/25s-cool-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cosplay.png b/public/images/pokemon/icons/1/25s-cosplay.png index 74f0b993ce4..218977fd454 100644 Binary files a/public/images/pokemon/icons/1/25s-cosplay.png and b/public/images/pokemon/icons/1/25s-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-cute-cosplay.png b/public/images/pokemon/icons/1/25s-cute-cosplay.png index 76488be18fe..07df252aeb9 100644 Binary files a/public/images/pokemon/icons/1/25s-cute-cosplay.png and b/public/images/pokemon/icons/1/25s-cute-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-smart-cosplay.png b/public/images/pokemon/icons/1/25s-smart-cosplay.png index 7eb69c5a17e..5742bb2718a 100644 Binary files a/public/images/pokemon/icons/1/25s-smart-cosplay.png and b/public/images/pokemon/icons/1/25s-smart-cosplay.png differ diff --git a/public/images/pokemon/icons/1/25s-tough-cosplay.png b/public/images/pokemon/icons/1/25s-tough-cosplay.png index 45c95ada80e..7e49d494573 100644 Binary files a/public/images/pokemon/icons/1/25s-tough-cosplay.png and b/public/images/pokemon/icons/1/25s-tough-cosplay.png differ diff --git a/public/images/pokemon/icons/2/172s.png b/public/images/pokemon/icons/2/172s.png index 27a11014758..a1def7089ba 100644 Binary files a/public/images/pokemon/icons/2/172s.png and b/public/images/pokemon/icons/2/172s.png differ diff --git a/public/images/pokemon/icons/2/198-f.png b/public/images/pokemon/icons/2/198-f.png new file mode 100644 index 00000000000..bfc3e9bea4c Binary files /dev/null and b/public/images/pokemon/icons/2/198-f.png differ diff --git a/public/images/pokemon/icons/2/198s-f.png b/public/images/pokemon/icons/2/198s-f.png new file mode 100644 index 00000000000..ccc258cafac Binary files /dev/null and b/public/images/pokemon/icons/2/198s-f.png differ diff --git a/public/images/pokemon/icons/3/350s.png b/public/images/pokemon/icons/3/350s.png index eaed5c4bd11..4f5de9f5d57 100644 Binary files a/public/images/pokemon/icons/3/350s.png and b/public/images/pokemon/icons/3/350s.png differ diff --git a/public/images/pokemon/icons/3/378s.png b/public/images/pokemon/icons/3/378s.png index e2fc99bbc87..b52709493e7 100644 Binary files a/public/images/pokemon/icons/3/378s.png and b/public/images/pokemon/icons/3/378s.png differ diff --git a/public/images/pokemon/icons/7/2026.png b/public/images/pokemon/icons/7/2026.png index 5bc49abc790..cd8db24dd8b 100644 Binary files a/public/images/pokemon/icons/7/2026.png and b/public/images/pokemon/icons/7/2026.png differ diff --git a/public/images/pokemon/icons/7/2026s.png b/public/images/pokemon/icons/7/2026s.png index ecc11b878ab..94ce33a124f 100644 Binary files a/public/images/pokemon/icons/7/2026s.png and b/public/images/pokemon/icons/7/2026s.png differ diff --git a/public/images/pokemon/icons/9/1012-artisan.png b/public/images/pokemon/icons/9/1012-artisan.png index 96a215e47de..0eed79df1f2 100644 Binary files a/public/images/pokemon/icons/9/1012-artisan.png and b/public/images/pokemon/icons/9/1012-artisan.png differ diff --git a/public/images/pokemon/icons/9/1012-counterfeit.png b/public/images/pokemon/icons/9/1012-counterfeit.png index ff79d615db7..0eed79df1f2 100644 Binary files a/public/images/pokemon/icons/9/1012-counterfeit.png and b/public/images/pokemon/icons/9/1012-counterfeit.png differ diff --git a/public/images/pokemon/icons/9/1013-unremarkable.png b/public/images/pokemon/icons/9/1013-unremarkable.png index 3aa144b6d5c..9f4ec0cce34 100644 Binary files a/public/images/pokemon/icons/9/1013-unremarkable.png and b/public/images/pokemon/icons/9/1013-unremarkable.png differ diff --git a/public/images/pokemon/icons/variant/1/102_2.png b/public/images/pokemon/icons/variant/1/102_2.png new file mode 100644 index 00000000000..9d96f087919 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/102_2.png differ diff --git a/public/images/pokemon/icons/variant/1/102_3.png b/public/images/pokemon/icons/variant/1/102_3.png new file mode 100644 index 00000000000..65272284ea8 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/102_3.png differ diff --git a/public/images/pokemon/icons/variant/1/103_2.png b/public/images/pokemon/icons/variant/1/103_2.png new file mode 100644 index 00000000000..046d2b1bb6a Binary files /dev/null and b/public/images/pokemon/icons/variant/1/103_2.png differ diff --git a/public/images/pokemon/icons/variant/1/103_3.png b/public/images/pokemon/icons/variant/1/103_3.png new file mode 100644 index 00000000000..b68fdd50318 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/103_3.png differ diff --git a/public/images/pokemon/icons/variant/1/128_2.png b/public/images/pokemon/icons/variant/1/128_2.png new file mode 100644 index 00000000000..0a44d5bbfad Binary files /dev/null and b/public/images/pokemon/icons/variant/1/128_2.png differ diff --git a/public/images/pokemon/icons/variant/1/128_3.png b/public/images/pokemon/icons/variant/1/128_3.png new file mode 100644 index 00000000000..8f6b25c2c18 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/128_3.png differ diff --git a/public/images/pokemon/icons/variant/1/133-partner_2.png b/public/images/pokemon/icons/variant/1/133-partner_2.png new file mode 100644 index 00000000000..3e082ae0bd4 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/133-partner_2.png differ diff --git a/public/images/pokemon/icons/variant/1/133-partner_3.png b/public/images/pokemon/icons/variant/1/133-partner_3.png new file mode 100644 index 00000000000..57c969d855c Binary files /dev/null and b/public/images/pokemon/icons/variant/1/133-partner_3.png differ diff --git a/public/images/pokemon/icons/variant/1/133_2.png b/public/images/pokemon/icons/variant/1/133_2.png index 7ab496699f7..b17979df07a 100644 Binary files a/public/images/pokemon/icons/variant/1/133_2.png and b/public/images/pokemon/icons/variant/1/133_2.png differ diff --git a/public/images/pokemon/icons/variant/1/133_3.png b/public/images/pokemon/icons/variant/1/133_3.png index f999dd0fff7..fa4d99879ae 100644 Binary files a/public/images/pokemon/icons/variant/1/133_3.png and b/public/images/pokemon/icons/variant/1/133_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png new file mode 100644 index 00000000000..19c61af5069 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png new file mode 100644 index 00000000000..1da79229795 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-beauty-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png new file mode 100644 index 00000000000..8dc1e27acab Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cool-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png new file mode 100644 index 00000000000..7a603219649 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cool-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cosplay_2.png new file mode 100644 index 00000000000..c47e9ef7d18 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cosplay_3.png new file mode 100644 index 00000000000..16332db9041 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png new file mode 100644 index 00000000000..3f606da7bb0 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cute-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png new file mode 100644 index 00000000000..8560b6f04b5 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-cute-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-gigantamax_2.png b/public/images/pokemon/icons/variant/1/25-gigantamax_2.png new file mode 100644 index 00000000000..6bc267b55fa Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-gigantamax_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-gigantamax_3.png b/public/images/pokemon/icons/variant/1/25-gigantamax_3.png new file mode 100644 index 00000000000..8c4ff760bcd Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-gigantamax_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-partner_2.png b/public/images/pokemon/icons/variant/1/25-partner_2.png new file mode 100644 index 00000000000..eaa2cfb610f Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-partner_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-partner_3.png b/public/images/pokemon/icons/variant/1/25-partner_3.png new file mode 100644 index 00000000000..1faf330ef51 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-partner_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png new file mode 100644 index 00000000000..4ecae1f73a2 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-smart-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png new file mode 100644 index 00000000000..ea41daf34e6 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-smart-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png b/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png new file mode 100644 index 00000000000..3f7072c4138 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-tough-cosplay_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png b/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png new file mode 100644 index 00000000000..e671ff98639 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25-tough-cosplay_3.png differ diff --git a/public/images/pokemon/icons/variant/1/25_2.png b/public/images/pokemon/icons/variant/1/25_2.png new file mode 100644 index 00000000000..5e987ffe777 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25_2.png differ diff --git a/public/images/pokemon/icons/variant/1/25_3.png b/public/images/pokemon/icons/variant/1/25_3.png new file mode 100644 index 00000000000..b04af012bec Binary files /dev/null and b/public/images/pokemon/icons/variant/1/25_3.png differ diff --git a/public/images/pokemon/icons/variant/1/26_2.png b/public/images/pokemon/icons/variant/1/26_2.png new file mode 100644 index 00000000000..f21ebe42b16 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/26_2.png differ diff --git a/public/images/pokemon/icons/variant/1/26_3.png b/public/images/pokemon/icons/variant/1/26_3.png new file mode 100644 index 00000000000..adbe9c212b3 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/26_3.png differ diff --git a/public/images/pokemon/icons/variant/1/39_2.png b/public/images/pokemon/icons/variant/1/39_2.png new file mode 100644 index 00000000000..f4b85b201cf Binary files /dev/null and b/public/images/pokemon/icons/variant/1/39_2.png differ diff --git a/public/images/pokemon/icons/variant/1/39_3.png b/public/images/pokemon/icons/variant/1/39_3.png new file mode 100644 index 00000000000..137f3dc083c Binary files /dev/null and b/public/images/pokemon/icons/variant/1/39_3.png differ diff --git a/public/images/pokemon/icons/variant/1/40_2.png b/public/images/pokemon/icons/variant/1/40_2.png new file mode 100644 index 00000000000..09ffdcd5757 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/40_2.png differ diff --git a/public/images/pokemon/icons/variant/1/40_3.png b/public/images/pokemon/icons/variant/1/40_3.png new file mode 100644 index 00000000000..09333136c19 Binary files /dev/null and b/public/images/pokemon/icons/variant/1/40_3.png differ diff --git a/public/images/pokemon/icons/variant/1/42_1.png b/public/images/pokemon/icons/variant/1/42_1.png index 17c82d9dd9e..91d7fae345d 100644 Binary files a/public/images/pokemon/icons/variant/1/42_1.png and b/public/images/pokemon/icons/variant/1/42_1.png differ diff --git a/public/images/pokemon/icons/variant/1/42_2.png b/public/images/pokemon/icons/variant/1/42_2.png index 91d7fae345d..17c82d9dd9e 100644 Binary files a/public/images/pokemon/icons/variant/1/42_2.png and b/public/images/pokemon/icons/variant/1/42_2.png differ diff --git a/public/images/pokemon/icons/variant/2/152_2.png b/public/images/pokemon/icons/variant/2/152_2.png new file mode 100644 index 00000000000..3815a4dbf49 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/152_2.png differ diff --git a/public/images/pokemon/icons/variant/2/152_3.png b/public/images/pokemon/icons/variant/2/152_3.png new file mode 100644 index 00000000000..be0fffab10c Binary files /dev/null and b/public/images/pokemon/icons/variant/2/152_3.png differ diff --git a/public/images/pokemon/icons/variant/2/153_2.png b/public/images/pokemon/icons/variant/2/153_2.png new file mode 100644 index 00000000000..020fc80d8b9 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/153_2.png differ diff --git a/public/images/pokemon/icons/variant/2/153_3.png b/public/images/pokemon/icons/variant/2/153_3.png new file mode 100644 index 00000000000..681acfa2db1 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/153_3.png differ diff --git a/public/images/pokemon/icons/variant/2/154-f_2.png b/public/images/pokemon/icons/variant/2/154-f_2.png new file mode 100644 index 00000000000..5ba8c458cf5 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154-f_2.png differ diff --git a/public/images/pokemon/icons/variant/2/154-f_3.png b/public/images/pokemon/icons/variant/2/154-f_3.png new file mode 100644 index 00000000000..c278d045c38 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154-f_3.png differ diff --git a/public/images/pokemon/icons/variant/2/154_2.png b/public/images/pokemon/icons/variant/2/154_2.png new file mode 100644 index 00000000000..323e2331a77 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154_2.png differ diff --git a/public/images/pokemon/icons/variant/2/154_3.png b/public/images/pokemon/icons/variant/2/154_3.png new file mode 100644 index 00000000000..aef1e4d633e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/154_3.png differ diff --git a/public/images/pokemon/icons/variant/2/158_2.png b/public/images/pokemon/icons/variant/2/158_2.png new file mode 100644 index 00000000000..c6b75ed6c20 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/158_2.png differ diff --git a/public/images/pokemon/icons/variant/2/158_3.png b/public/images/pokemon/icons/variant/2/158_3.png new file mode 100644 index 00000000000..073e3faa2e2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/158_3.png differ diff --git a/public/images/pokemon/icons/variant/2/159_2.png b/public/images/pokemon/icons/variant/2/159_2.png new file mode 100644 index 00000000000..95d74728073 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/159_2.png differ diff --git a/public/images/pokemon/icons/variant/2/159_3.png b/public/images/pokemon/icons/variant/2/159_3.png new file mode 100644 index 00000000000..a73818d0c3a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/159_3.png differ diff --git a/public/images/pokemon/icons/variant/2/160_2.png b/public/images/pokemon/icons/variant/2/160_2.png new file mode 100644 index 00000000000..7b7ba6e7231 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/160_2.png differ diff --git a/public/images/pokemon/icons/variant/2/160_3.png b/public/images/pokemon/icons/variant/2/160_3.png new file mode 100644 index 00000000000..62a4ab22fd2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/160_3.png differ diff --git a/public/images/pokemon/icons/variant/2/167_2.png b/public/images/pokemon/icons/variant/2/167_2.png new file mode 100644 index 00000000000..a6bd15c0eef Binary files /dev/null and b/public/images/pokemon/icons/variant/2/167_2.png differ diff --git a/public/images/pokemon/icons/variant/2/167_3.png b/public/images/pokemon/icons/variant/2/167_3.png new file mode 100644 index 00000000000..88d84eec2a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/167_3.png differ diff --git a/public/images/pokemon/icons/variant/2/168_2.png b/public/images/pokemon/icons/variant/2/168_2.png new file mode 100644 index 00000000000..cf34c26be21 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/168_2.png differ diff --git a/public/images/pokemon/icons/variant/2/168_3.png b/public/images/pokemon/icons/variant/2/168_3.png new file mode 100644 index 00000000000..7a62c58d299 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/168_3.png differ diff --git a/public/images/pokemon/icons/variant/2/170_2.png b/public/images/pokemon/icons/variant/2/170_2.png new file mode 100644 index 00000000000..1ecdfda6eb8 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/170_2.png differ diff --git a/public/images/pokemon/icons/variant/2/170_3.png b/public/images/pokemon/icons/variant/2/170_3.png new file mode 100644 index 00000000000..01cb78568ed Binary files /dev/null and b/public/images/pokemon/icons/variant/2/170_3.png differ diff --git a/public/images/pokemon/icons/variant/2/171_2.png b/public/images/pokemon/icons/variant/2/171_2.png new file mode 100644 index 00000000000..3ff5792e2d2 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/171_2.png differ diff --git a/public/images/pokemon/icons/variant/2/171_3.png b/public/images/pokemon/icons/variant/2/171_3.png new file mode 100644 index 00000000000..11a3996da80 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/171_3.png differ diff --git a/public/images/pokemon/icons/variant/2/172-spiky_2.png b/public/images/pokemon/icons/variant/2/172-spiky_2.png new file mode 100644 index 00000000000..b293ee3283a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172-spiky_2.png differ diff --git a/public/images/pokemon/icons/variant/2/172-spiky_3.png b/public/images/pokemon/icons/variant/2/172-spiky_3.png new file mode 100644 index 00000000000..ff9a4229421 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172-spiky_3.png differ diff --git a/public/images/pokemon/icons/variant/2/172_2.png b/public/images/pokemon/icons/variant/2/172_2.png new file mode 100644 index 00000000000..4fa282f9297 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172_2.png differ diff --git a/public/images/pokemon/icons/variant/2/172_3.png b/public/images/pokemon/icons/variant/2/172_3.png new file mode 100644 index 00000000000..95f0c9bdc6d Binary files /dev/null and b/public/images/pokemon/icons/variant/2/172_3.png differ diff --git a/public/images/pokemon/icons/variant/2/174_2.png b/public/images/pokemon/icons/variant/2/174_2.png new file mode 100644 index 00000000000..e7ffddb1f57 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/174_2.png differ diff --git a/public/images/pokemon/icons/variant/2/174_3.png b/public/images/pokemon/icons/variant/2/174_3.png new file mode 100644 index 00000000000..58d98aab99a Binary files /dev/null and b/public/images/pokemon/icons/variant/2/174_3.png differ diff --git a/public/images/pokemon/icons/variant/2/194_2.png b/public/images/pokemon/icons/variant/2/194_2.png new file mode 100644 index 00000000000..043c11ce065 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/194_2.png differ diff --git a/public/images/pokemon/icons/variant/2/194_3.png b/public/images/pokemon/icons/variant/2/194_3.png new file mode 100644 index 00000000000..f5d792b141f Binary files /dev/null and b/public/images/pokemon/icons/variant/2/194_3.png differ diff --git a/public/images/pokemon/icons/variant/2/195_2.png b/public/images/pokemon/icons/variant/2/195_2.png new file mode 100644 index 00000000000..7fd5ba2792f Binary files /dev/null and b/public/images/pokemon/icons/variant/2/195_2.png differ diff --git a/public/images/pokemon/icons/variant/2/195_3.png b/public/images/pokemon/icons/variant/2/195_3.png new file mode 100644 index 00000000000..99da4dfe12e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/195_3.png differ diff --git a/public/images/pokemon/icons/variant/2/198-f_2.png b/public/images/pokemon/icons/variant/2/198-f_2.png new file mode 100644 index 00000000000..35e5c2e75ea Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198-f_2.png differ diff --git a/public/images/pokemon/icons/variant/2/198-f_3.png b/public/images/pokemon/icons/variant/2/198-f_3.png new file mode 100644 index 00000000000..f2920cd1d0e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198-f_3.png differ diff --git a/public/images/pokemon/icons/variant/2/198_2.png b/public/images/pokemon/icons/variant/2/198_2.png new file mode 100644 index 00000000000..35e5c2e75ea Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198_2.png differ diff --git a/public/images/pokemon/icons/variant/2/198_3.png b/public/images/pokemon/icons/variant/2/198_3.png new file mode 100644 index 00000000000..f2920cd1d0e Binary files /dev/null and b/public/images/pokemon/icons/variant/2/198_3.png differ diff --git a/public/images/pokemon/icons/variant/2/211_2.png b/public/images/pokemon/icons/variant/2/211_2.png new file mode 100644 index 00000000000..c042910bc17 Binary files /dev/null and b/public/images/pokemon/icons/variant/2/211_2.png differ diff --git a/public/images/pokemon/icons/variant/2/211_3.png b/public/images/pokemon/icons/variant/2/211_3.png new file mode 100644 index 00000000000..3548893b6ec Binary files /dev/null and b/public/images/pokemon/icons/variant/2/211_3.png differ diff --git a/public/images/pokemon/icons/variant/3/255_2.png b/public/images/pokemon/icons/variant/3/255_2.png index adf8c6ea8bc..b40b8f1607c 100644 Binary files a/public/images/pokemon/icons/variant/3/255_2.png and b/public/images/pokemon/icons/variant/3/255_2.png differ diff --git a/public/images/pokemon/icons/variant/3/255_3.png b/public/images/pokemon/icons/variant/3/255_3.png index 6ed47e69afa..2ae8ef351f5 100644 Binary files a/public/images/pokemon/icons/variant/3/255_3.png and b/public/images/pokemon/icons/variant/3/255_3.png differ diff --git a/public/images/pokemon/icons/variant/3/256_2.png b/public/images/pokemon/icons/variant/3/256_2.png index b372f1ff981..43919a2db06 100644 Binary files a/public/images/pokemon/icons/variant/3/256_2.png and b/public/images/pokemon/icons/variant/3/256_2.png differ diff --git a/public/images/pokemon/icons/variant/3/256_3.png b/public/images/pokemon/icons/variant/3/256_3.png index 0c529f838ba..bb1cbfe0809 100644 Binary files a/public/images/pokemon/icons/variant/3/256_3.png and b/public/images/pokemon/icons/variant/3/256_3.png differ diff --git a/public/images/pokemon/icons/variant/3/257_3.png b/public/images/pokemon/icons/variant/3/257_3.png index c7853c73d4f..cccaab5db12 100644 Binary files a/public/images/pokemon/icons/variant/3/257_3.png and b/public/images/pokemon/icons/variant/3/257_3.png differ diff --git a/public/images/pokemon/icons/variant/3/276_2.png b/public/images/pokemon/icons/variant/3/276_2.png new file mode 100644 index 00000000000..d7e8a3aa9ca Binary files /dev/null and b/public/images/pokemon/icons/variant/3/276_2.png differ diff --git a/public/images/pokemon/icons/variant/3/276_3.png b/public/images/pokemon/icons/variant/3/276_3.png new file mode 100644 index 00000000000..b9cfa276eb2 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/276_3.png differ diff --git a/public/images/pokemon/icons/variant/3/277_2.png b/public/images/pokemon/icons/variant/3/277_2.png new file mode 100644 index 00000000000..f4d58f259c3 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/277_2.png differ diff --git a/public/images/pokemon/icons/variant/3/277_3.png b/public/images/pokemon/icons/variant/3/277_3.png new file mode 100644 index 00000000000..69ccce9069b Binary files /dev/null and b/public/images/pokemon/icons/variant/3/277_3.png differ diff --git a/public/images/pokemon/icons/variant/3/359-mega_2.png b/public/images/pokemon/icons/variant/3/359-mega_2.png new file mode 100644 index 00000000000..35290c15aa9 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359-mega_2.png differ diff --git a/public/images/pokemon/icons/variant/3/359-mega_3.png b/public/images/pokemon/icons/variant/3/359-mega_3.png new file mode 100644 index 00000000000..5a3250b944d Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359-mega_3.png differ diff --git a/public/images/pokemon/icons/variant/3/359_2.png b/public/images/pokemon/icons/variant/3/359_2.png new file mode 100644 index 00000000000..0fa229141fd Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359_2.png differ diff --git a/public/images/pokemon/icons/variant/3/359_3.png b/public/images/pokemon/icons/variant/3/359_3.png new file mode 100644 index 00000000000..54ba72028ac Binary files /dev/null and b/public/images/pokemon/icons/variant/3/359_3.png differ diff --git a/public/images/pokemon/icons/variant/3/377_2.png b/public/images/pokemon/icons/variant/3/377_2.png new file mode 100644 index 00000000000..f90f337c32e Binary files /dev/null and b/public/images/pokemon/icons/variant/3/377_2.png differ diff --git a/public/images/pokemon/icons/variant/3/377_3.png b/public/images/pokemon/icons/variant/3/377_3.png new file mode 100644 index 00000000000..0957178662a Binary files /dev/null and b/public/images/pokemon/icons/variant/3/377_3.png differ diff --git a/public/images/pokemon/icons/variant/3/378_1.png b/public/images/pokemon/icons/variant/3/378_1.png new file mode 100644 index 00000000000..32bc37d9e33 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_1.png differ diff --git a/public/images/pokemon/icons/variant/3/378_2.png b/public/images/pokemon/icons/variant/3/378_2.png new file mode 100644 index 00000000000..9f310bc92c8 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_2.png differ diff --git a/public/images/pokemon/icons/variant/3/378_3.png b/public/images/pokemon/icons/variant/3/378_3.png new file mode 100644 index 00000000000..45afe9a71a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/378_3.png differ diff --git a/public/images/pokemon/icons/variant/3/379_2.png b/public/images/pokemon/icons/variant/3/379_2.png new file mode 100644 index 00000000000..ad928fd752e Binary files /dev/null and b/public/images/pokemon/icons/variant/3/379_2.png differ diff --git a/public/images/pokemon/icons/variant/3/379_3.png b/public/images/pokemon/icons/variant/3/379_3.png new file mode 100644 index 00000000000..acb86b4f665 Binary files /dev/null and b/public/images/pokemon/icons/variant/3/379_3.png differ diff --git a/public/images/pokemon/icons/variant/3/427_2.png b/public/images/pokemon/icons/variant/3/427_2.png deleted file mode 100644 index ceaf11acb48..00000000000 Binary files a/public/images/pokemon/icons/variant/3/427_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/427_3.png b/public/images/pokemon/icons/variant/3/427_3.png deleted file mode 100644 index 5972f5e9489..00000000000 Binary files a/public/images/pokemon/icons/variant/3/427_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/428-mega_2.png b/public/images/pokemon/icons/variant/3/428-mega_2.png deleted file mode 100644 index 32c3293a796..00000000000 Binary files a/public/images/pokemon/icons/variant/3/428-mega_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/428_2.png b/public/images/pokemon/icons/variant/3/428_2.png deleted file mode 100644 index 5b325f3256a..00000000000 Binary files a/public/images/pokemon/icons/variant/3/428_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_1.png b/public/images/pokemon/icons/variant/3/429_1.png deleted file mode 100644 index 667f389f5c1..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_1.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_2.png b/public/images/pokemon/icons/variant/3/429_2.png deleted file mode 100644 index 85cd47bd85f..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/429_3.png b/public/images/pokemon/icons/variant/3/429_3.png deleted file mode 100644 index bb9b2384514..00000000000 Binary files a/public/images/pokemon/icons/variant/3/429_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/475-mega_3.png b/public/images/pokemon/icons/variant/3/475-mega_3.png deleted file mode 100644 index c067c36c836..00000000000 Binary files a/public/images/pokemon/icons/variant/3/475-mega_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/3/475_3.png b/public/images/pokemon/icons/variant/3/475_3.png deleted file mode 100644 index 4a8f5bdb56d..00000000000 Binary files a/public/images/pokemon/icons/variant/3/475_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/4/390_2.png b/public/images/pokemon/icons/variant/4/390_2.png new file mode 100644 index 00000000000..f29d3561210 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/390_2.png differ diff --git a/public/images/pokemon/icons/variant/4/390_3.png b/public/images/pokemon/icons/variant/4/390_3.png new file mode 100644 index 00000000000..7634f2e8639 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/390_3.png differ diff --git a/public/images/pokemon/icons/variant/4/391_2.png b/public/images/pokemon/icons/variant/4/391_2.png new file mode 100644 index 00000000000..470de43c7bc Binary files /dev/null and b/public/images/pokemon/icons/variant/4/391_2.png differ diff --git a/public/images/pokemon/icons/variant/4/391_3.png b/public/images/pokemon/icons/variant/4/391_3.png new file mode 100644 index 00000000000..8996fdb025c Binary files /dev/null and b/public/images/pokemon/icons/variant/4/391_3.png differ diff --git a/public/images/pokemon/icons/variant/4/392_2.png b/public/images/pokemon/icons/variant/4/392_2.png new file mode 100644 index 00000000000..0550a20e94d Binary files /dev/null and b/public/images/pokemon/icons/variant/4/392_2.png differ diff --git a/public/images/pokemon/icons/variant/4/392_3.png b/public/images/pokemon/icons/variant/4/392_3.png new file mode 100644 index 00000000000..7a66926b533 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/392_3.png differ diff --git a/public/images/pokemon/icons/variant/4/427_2.png b/public/images/pokemon/icons/variant/4/427_2.png index 1b5d9271624..ceaf11acb48 100644 Binary files a/public/images/pokemon/icons/variant/4/427_2.png and b/public/images/pokemon/icons/variant/4/427_2.png differ diff --git a/public/images/pokemon/icons/variant/4/427_3.png b/public/images/pokemon/icons/variant/4/427_3.png index a3f90ea6dfa..5972f5e9489 100644 Binary files a/public/images/pokemon/icons/variant/4/427_3.png and b/public/images/pokemon/icons/variant/4/427_3.png differ diff --git a/public/images/pokemon/icons/variant/4/428-mega_2.png b/public/images/pokemon/icons/variant/4/428-mega_2.png index 43dfa05d438..32c3293a796 100644 Binary files a/public/images/pokemon/icons/variant/4/428-mega_2.png and b/public/images/pokemon/icons/variant/4/428-mega_2.png differ diff --git a/public/images/pokemon/icons/variant/4/428_2.png b/public/images/pokemon/icons/variant/4/428_2.png index 1e42720c78b..5b325f3256a 100644 Binary files a/public/images/pokemon/icons/variant/4/428_2.png and b/public/images/pokemon/icons/variant/4/428_2.png differ diff --git a/public/images/pokemon/icons/variant/4/429_1.png b/public/images/pokemon/icons/variant/4/429_1.png index 7354a6a6be7..667f389f5c1 100644 Binary files a/public/images/pokemon/icons/variant/4/429_1.png and b/public/images/pokemon/icons/variant/4/429_1.png differ diff --git a/public/images/pokemon/icons/variant/4/429_2.png b/public/images/pokemon/icons/variant/4/429_2.png index 9ec7cd5e76e..85cd47bd85f 100644 Binary files a/public/images/pokemon/icons/variant/4/429_2.png and b/public/images/pokemon/icons/variant/4/429_2.png differ diff --git a/public/images/pokemon/icons/variant/4/429_3.png b/public/images/pokemon/icons/variant/4/429_3.png index 48f7068ced8..bb9b2384514 100644 Binary files a/public/images/pokemon/icons/variant/4/429_3.png and b/public/images/pokemon/icons/variant/4/429_3.png differ diff --git a/public/images/pokemon/icons/variant/4/430_2.png b/public/images/pokemon/icons/variant/4/430_2.png new file mode 100644 index 00000000000..8026dd75141 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/430_2.png differ diff --git a/public/images/pokemon/icons/variant/4/430_3.png b/public/images/pokemon/icons/variant/4/430_3.png new file mode 100644 index 00000000000..d83a4f349f0 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/430_3.png differ diff --git a/public/images/pokemon/icons/variant/4/455_2.png b/public/images/pokemon/icons/variant/4/455_2.png new file mode 100644 index 00000000000..206ba13205f Binary files /dev/null and b/public/images/pokemon/icons/variant/4/455_2.png differ diff --git a/public/images/pokemon/icons/variant/4/455_3.png b/public/images/pokemon/icons/variant/4/455_3.png new file mode 100644 index 00000000000..199976e2f67 Binary files /dev/null and b/public/images/pokemon/icons/variant/4/455_3.png differ diff --git a/public/images/pokemon/icons/variant/4/486_2.png b/public/images/pokemon/icons/variant/4/486_2.png new file mode 100644 index 00000000000..d13c4861a4b Binary files /dev/null and b/public/images/pokemon/icons/variant/4/486_2.png differ diff --git a/public/images/pokemon/icons/variant/4/486_3.png b/public/images/pokemon/icons/variant/4/486_3.png new file mode 100644 index 00000000000..cf33b01869a Binary files /dev/null and b/public/images/pokemon/icons/variant/4/486_3.png differ diff --git a/public/images/pokemon/icons/variant/5/501_2.png b/public/images/pokemon/icons/variant/5/501_2.png new file mode 100644 index 00000000000..d92f57a8399 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/501_2.png differ diff --git a/public/images/pokemon/icons/variant/5/501_3.png b/public/images/pokemon/icons/variant/5/501_3.png new file mode 100644 index 00000000000..50bbb59a545 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/501_3.png differ diff --git a/public/images/pokemon/icons/variant/5/502_2.png b/public/images/pokemon/icons/variant/5/502_2.png new file mode 100644 index 00000000000..3d327da2129 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/502_2.png differ diff --git a/public/images/pokemon/icons/variant/5/502_3.png b/public/images/pokemon/icons/variant/5/502_3.png new file mode 100644 index 00000000000..a10810daed9 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/502_3.png differ diff --git a/public/images/pokemon/icons/variant/5/503_2.png b/public/images/pokemon/icons/variant/5/503_2.png new file mode 100644 index 00000000000..b3611139d87 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/503_2.png differ diff --git a/public/images/pokemon/icons/variant/5/503_3.png b/public/images/pokemon/icons/variant/5/503_3.png new file mode 100644 index 00000000000..da3aa967ab5 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/503_3.png differ diff --git a/public/images/pokemon/icons/variant/5/527_2.png b/public/images/pokemon/icons/variant/5/527_2.png new file mode 100644 index 00000000000..3a0b284bfde Binary files /dev/null and b/public/images/pokemon/icons/variant/5/527_2.png differ diff --git a/public/images/pokemon/icons/variant/5/527_3.png b/public/images/pokemon/icons/variant/5/527_3.png new file mode 100644 index 00000000000..39b54a23b1e Binary files /dev/null and b/public/images/pokemon/icons/variant/5/527_3.png differ diff --git a/public/images/pokemon/icons/variant/5/528_2.png b/public/images/pokemon/icons/variant/5/528_2.png new file mode 100644 index 00000000000..4d209760134 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/528_2.png differ diff --git a/public/images/pokemon/icons/variant/5/528_3.png b/public/images/pokemon/icons/variant/5/528_3.png new file mode 100644 index 00000000000..1c887443660 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/528_3.png differ diff --git a/public/images/pokemon/icons/variant/5/587_2.png b/public/images/pokemon/icons/variant/5/587_2.png new file mode 100644 index 00000000000..1e522a31676 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/587_2.png differ diff --git a/public/images/pokemon/icons/variant/5/587_3.png b/public/images/pokemon/icons/variant/5/587_3.png new file mode 100644 index 00000000000..c26066605cd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/587_3.png differ diff --git a/public/images/pokemon/icons/variant/5/588_2.png b/public/images/pokemon/icons/variant/5/588_2.png new file mode 100644 index 00000000000..df99218cedd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/588_2.png differ diff --git a/public/images/pokemon/icons/variant/5/588_3.png b/public/images/pokemon/icons/variant/5/588_3.png new file mode 100644 index 00000000000..3d9277308c7 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/588_3.png differ diff --git a/public/images/pokemon/icons/variant/5/589_2.png b/public/images/pokemon/icons/variant/5/589_2.png new file mode 100644 index 00000000000..ada32c980c1 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/589_2.png differ diff --git a/public/images/pokemon/icons/variant/5/589_3.png b/public/images/pokemon/icons/variant/5/589_3.png new file mode 100644 index 00000000000..1f612c4e8a5 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/589_3.png differ diff --git a/public/images/pokemon/icons/variant/5/590_2.png b/public/images/pokemon/icons/variant/5/590_2.png new file mode 100644 index 00000000000..66c3767024b Binary files /dev/null and b/public/images/pokemon/icons/variant/5/590_2.png differ diff --git a/public/images/pokemon/icons/variant/5/590_3.png b/public/images/pokemon/icons/variant/5/590_3.png new file mode 100644 index 00000000000..d18ccb42e21 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/590_3.png differ diff --git a/public/images/pokemon/icons/variant/5/591_2.png b/public/images/pokemon/icons/variant/5/591_2.png new file mode 100644 index 00000000000..dad56af2559 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/591_2.png differ diff --git a/public/images/pokemon/icons/variant/5/591_3.png b/public/images/pokemon/icons/variant/5/591_3.png new file mode 100644 index 00000000000..a407a14b83a Binary files /dev/null and b/public/images/pokemon/icons/variant/5/591_3.png differ diff --git a/public/images/pokemon/icons/variant/5/616_2.png b/public/images/pokemon/icons/variant/5/616_2.png new file mode 100644 index 00000000000..88e45da0238 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/616_2.png differ diff --git a/public/images/pokemon/icons/variant/5/616_3.png b/public/images/pokemon/icons/variant/5/616_3.png new file mode 100644 index 00000000000..b1767da8fdd Binary files /dev/null and b/public/images/pokemon/icons/variant/5/616_3.png differ diff --git a/public/images/pokemon/icons/variant/5/617_2.png b/public/images/pokemon/icons/variant/5/617_2.png new file mode 100644 index 00000000000..fff02c3f344 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/617_2.png differ diff --git a/public/images/pokemon/icons/variant/5/617_3.png b/public/images/pokemon/icons/variant/5/617_3.png new file mode 100644 index 00000000000..b3f05f31db2 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/617_3.png differ diff --git a/public/images/pokemon/icons/variant/5/621_2.png b/public/images/pokemon/icons/variant/5/621_2.png new file mode 100644 index 00000000000..dbaa26325d8 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/621_2.png differ diff --git a/public/images/pokemon/icons/variant/5/621_3.png b/public/images/pokemon/icons/variant/5/621_3.png new file mode 100644 index 00000000000..190ffb11dc3 Binary files /dev/null and b/public/images/pokemon/icons/variant/5/621_3.png differ diff --git a/public/images/pokemon/icons/variant/6/656_2.png b/public/images/pokemon/icons/variant/6/656_2.png new file mode 100644 index 00000000000..612386a5d1e Binary files /dev/null and b/public/images/pokemon/icons/variant/6/656_2.png differ diff --git a/public/images/pokemon/icons/variant/6/656_3.png b/public/images/pokemon/icons/variant/6/656_3.png new file mode 100644 index 00000000000..575cf3aef3a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/656_3.png differ diff --git a/public/images/pokemon/icons/variant/6/657_2.png b/public/images/pokemon/icons/variant/6/657_2.png new file mode 100644 index 00000000000..9f26c5f85bf Binary files /dev/null and b/public/images/pokemon/icons/variant/6/657_2.png differ diff --git a/public/images/pokemon/icons/variant/6/657_3.png b/public/images/pokemon/icons/variant/6/657_3.png new file mode 100644 index 00000000000..fde76bb8d1c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/657_3.png differ diff --git a/public/images/pokemon/icons/variant/6/658-ash_2.png b/public/images/pokemon/icons/variant/6/658-ash_2.png new file mode 100644 index 00000000000..b788b336efe Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658-ash_2.png differ diff --git a/public/images/pokemon/icons/variant/6/658-ash_3.png b/public/images/pokemon/icons/variant/6/658-ash_3.png new file mode 100644 index 00000000000..52ac4fe0ede Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658-ash_3.png differ diff --git a/public/images/pokemon/icons/variant/6/658_2.png b/public/images/pokemon/icons/variant/6/658_2.png new file mode 100644 index 00000000000..eaf9da8a9ce Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658_2.png differ diff --git a/public/images/pokemon/icons/variant/6/658_3.png b/public/images/pokemon/icons/variant/6/658_3.png new file mode 100644 index 00000000000..027dda592f0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/658_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-dandy_2.png b/public/images/pokemon/icons/variant/6/676-dandy_2.png new file mode 100644 index 00000000000..2fb1a1a01b6 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-dandy_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-dandy_3.png b/public/images/pokemon/icons/variant/6/676-dandy_3.png new file mode 100644 index 00000000000..ac05ae8dd3a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-dandy_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-debutante_2.png b/public/images/pokemon/icons/variant/6/676-debutante_2.png new file mode 100644 index 00000000000..9ec13ca1964 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-debutante_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-debutante_3.png b/public/images/pokemon/icons/variant/6/676-debutante_3.png new file mode 100644 index 00000000000..aef6da0a1fd Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-debutante_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-diamond_2.png b/public/images/pokemon/icons/variant/6/676-diamond_2.png new file mode 100644 index 00000000000..1406640a69c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-diamond_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-diamond_3.png b/public/images/pokemon/icons/variant/6/676-diamond_3.png new file mode 100644 index 00000000000..ccf477d6819 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-diamond_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-heart_2.png b/public/images/pokemon/icons/variant/6/676-heart_2.png new file mode 100644 index 00000000000..7f3607f8579 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-heart_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-heart_3.png b/public/images/pokemon/icons/variant/6/676-heart_3.png new file mode 100644 index 00000000000..e8256f783ba Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-heart_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-kabuki_2.png b/public/images/pokemon/icons/variant/6/676-kabuki_2.png new file mode 100644 index 00000000000..ea78810582a Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-kabuki_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-kabuki_3.png b/public/images/pokemon/icons/variant/6/676-kabuki_3.png new file mode 100644 index 00000000000..f8501bec610 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-kabuki_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-la-reine_2.png b/public/images/pokemon/icons/variant/6/676-la-reine_2.png new file mode 100644 index 00000000000..5d4cb6bbea0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-la-reine_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-la-reine_3.png b/public/images/pokemon/icons/variant/6/676-la-reine_3.png new file mode 100644 index 00000000000..57488ba17e2 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-la-reine_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-matron_2.png b/public/images/pokemon/icons/variant/6/676-matron_2.png new file mode 100644 index 00000000000..e7bd18d5a10 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-matron_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-matron_3.png b/public/images/pokemon/icons/variant/6/676-matron_3.png new file mode 100644 index 00000000000..a8870d9ed20 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-matron_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-pharaoh_2.png b/public/images/pokemon/icons/variant/6/676-pharaoh_2.png new file mode 100644 index 00000000000..96d60fa6d4c Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-pharaoh_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-pharaoh_3.png b/public/images/pokemon/icons/variant/6/676-pharaoh_3.png new file mode 100644 index 00000000000..db2de83c8ef Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-pharaoh_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676-star_2.png b/public/images/pokemon/icons/variant/6/676-star_2.png new file mode 100644 index 00000000000..e2a58c698f6 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-star_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676-star_3.png b/public/images/pokemon/icons/variant/6/676-star_3.png new file mode 100644 index 00000000000..7c4fdc4efb1 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676-star_3.png differ diff --git a/public/images/pokemon/icons/variant/6/676_2.png b/public/images/pokemon/icons/variant/6/676_2.png new file mode 100644 index 00000000000..56bcc1a7a34 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676_2.png differ diff --git a/public/images/pokemon/icons/variant/6/676_3.png b/public/images/pokemon/icons/variant/6/676_3.png new file mode 100644 index 00000000000..accb6f96f66 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/676_3.png differ diff --git a/public/images/pokemon/icons/variant/6/682_2.png b/public/images/pokemon/icons/variant/6/682_2.png new file mode 100644 index 00000000000..59c05cce665 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/682_2.png differ diff --git a/public/images/pokemon/icons/variant/6/682_3.png b/public/images/pokemon/icons/variant/6/682_3.png new file mode 100644 index 00000000000..a7c73e94eef Binary files /dev/null and b/public/images/pokemon/icons/variant/6/682_3.png differ diff --git a/public/images/pokemon/icons/variant/6/683_2.png b/public/images/pokemon/icons/variant/6/683_2.png new file mode 100644 index 00000000000..7f64665f9d7 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/683_2.png differ diff --git a/public/images/pokemon/icons/variant/6/683_3.png b/public/images/pokemon/icons/variant/6/683_3.png new file mode 100644 index 00000000000..b09a0be5fd2 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/683_3.png differ diff --git a/public/images/pokemon/icons/variant/6/684_2.png b/public/images/pokemon/icons/variant/6/684_2.png new file mode 100644 index 00000000000..2fccca23416 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/684_2.png differ diff --git a/public/images/pokemon/icons/variant/6/684_3.png b/public/images/pokemon/icons/variant/6/684_3.png new file mode 100644 index 00000000000..9c09475db49 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/684_3.png differ diff --git a/public/images/pokemon/icons/variant/6/685_2.png b/public/images/pokemon/icons/variant/6/685_2.png new file mode 100644 index 00000000000..8f52850dd2d Binary files /dev/null and b/public/images/pokemon/icons/variant/6/685_2.png differ diff --git a/public/images/pokemon/icons/variant/6/685_3.png b/public/images/pokemon/icons/variant/6/685_3.png new file mode 100644 index 00000000000..ebad502551e Binary files /dev/null and b/public/images/pokemon/icons/variant/6/685_3.png differ diff --git a/public/images/pokemon/icons/variant/6/688_2.png b/public/images/pokemon/icons/variant/6/688_2.png new file mode 100644 index 00000000000..6fe8ba9c770 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/688_2.png differ diff --git a/public/images/pokemon/icons/variant/6/688_3.png b/public/images/pokemon/icons/variant/6/688_3.png new file mode 100644 index 00000000000..9586c3203a9 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/688_3.png differ diff --git a/public/images/pokemon/icons/variant/6/689_2.png b/public/images/pokemon/icons/variant/6/689_2.png new file mode 100644 index 00000000000..66305ef69e8 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/689_2.png differ diff --git a/public/images/pokemon/icons/variant/6/689_3.png b/public/images/pokemon/icons/variant/6/689_3.png new file mode 100644 index 00000000000..2bdfea0ddd0 Binary files /dev/null and b/public/images/pokemon/icons/variant/6/689_3.png differ diff --git a/public/images/pokemon/icons/variant/7/2026_2.png b/public/images/pokemon/icons/variant/7/2026_2.png new file mode 100644 index 00000000000..3b939a6c1fc Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2026_2.png differ diff --git a/public/images/pokemon/icons/variant/7/2026_3.png b/public/images/pokemon/icons/variant/7/2026_3.png new file mode 100644 index 00000000000..f530b9cfcb3 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2026_3.png differ diff --git a/public/images/pokemon/icons/variant/7/2103_2.png b/public/images/pokemon/icons/variant/7/2103_2.png new file mode 100644 index 00000000000..d3795c35070 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2103_2.png differ diff --git a/public/images/pokemon/icons/variant/7/2103_3.png b/public/images/pokemon/icons/variant/7/2103_3.png new file mode 100644 index 00000000000..e24ba1eb917 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2103_3.png differ diff --git a/public/images/pokemon/icons/variant/7/807_2.png b/public/images/pokemon/icons/variant/7/807_2.png new file mode 100644 index 00000000000..6e070af347d Binary files /dev/null and b/public/images/pokemon/icons/variant/7/807_2.png differ diff --git a/public/images/pokemon/icons/variant/7/807_3.png b/public/images/pokemon/icons/variant/7/807_3.png new file mode 100644 index 00000000000..19e59272f86 Binary files /dev/null and b/public/images/pokemon/icons/variant/7/807_3.png differ diff --git a/public/images/pokemon/icons/variant/8/6503_2.png b/public/images/pokemon/icons/variant/8/6503_2.png new file mode 100644 index 00000000000..0098615187e Binary files /dev/null and b/public/images/pokemon/icons/variant/8/6503_2.png differ diff --git a/public/images/pokemon/icons/variant/8/6503_3.png b/public/images/pokemon/icons/variant/8/6503_3.png new file mode 100644 index 00000000000..64428182df0 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/6503_3.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax.png b/public/images/pokemon/icons/variant/8/851-gigantamax.png new file mode 100644 index 00000000000..e757af7b4fa Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax_2.png b/public/images/pokemon/icons/variant/8/851-gigantamax_2.png new file mode 100644 index 00000000000..081d8284b3d Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax_2.png differ diff --git a/public/images/pokemon/icons/variant/8/851-gigantamax_3.png b/public/images/pokemon/icons/variant/8/851-gigantamax_3.png new file mode 100644 index 00000000000..6d26a7395f2 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851-gigantamax_3.png differ diff --git a/public/images/pokemon/icons/variant/8/851s-gigantamax.png b/public/images/pokemon/icons/variant/8/851s-gigantamax.png new file mode 100644 index 00000000000..73fb57b8a5a Binary files /dev/null and b/public/images/pokemon/icons/variant/8/851s-gigantamax.png differ diff --git a/public/images/pokemon/icons/variant/8/894_2.png b/public/images/pokemon/icons/variant/8/894_2.png new file mode 100644 index 00000000000..2b4754d56a0 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/894_2.png differ diff --git a/public/images/pokemon/icons/variant/8/894_3.png b/public/images/pokemon/icons/variant/8/894_3.png new file mode 100644 index 00000000000..cc5baef46cc Binary files /dev/null and b/public/images/pokemon/icons/variant/8/894_3.png differ diff --git a/public/images/pokemon/icons/variant/8/895_2.png b/public/images/pokemon/icons/variant/8/895_2.png new file mode 100644 index 00000000000..bdacf0683ee Binary files /dev/null and b/public/images/pokemon/icons/variant/8/895_2.png differ diff --git a/public/images/pokemon/icons/variant/8/895_3.png b/public/images/pokemon/icons/variant/8/895_3.png new file mode 100644 index 00000000000..9ac023e2e89 Binary files /dev/null and b/public/images/pokemon/icons/variant/8/895_3.png differ diff --git a/public/images/pokemon/icons/variant/8/909_2.png b/public/images/pokemon/icons/variant/8/909_2.png deleted file mode 100644 index 73f71bd49d3..00000000000 Binary files a/public/images/pokemon/icons/variant/8/909_2.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/8/909_3.png b/public/images/pokemon/icons/variant/8/909_3.png deleted file mode 100644 index 5fb79e5b917..00000000000 Binary files a/public/images/pokemon/icons/variant/8/909_3.png and /dev/null differ diff --git a/public/images/pokemon/icons/variant/8/1003_2.png b/public/images/pokemon/icons/variant/9/1003_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1003_2.png rename to public/images/pokemon/icons/variant/9/1003_2.png diff --git a/public/images/pokemon/icons/variant/8/1003_3.png b/public/images/pokemon/icons/variant/9/1003_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1003_3.png rename to public/images/pokemon/icons/variant/9/1003_3.png diff --git a/public/images/pokemon/icons/variant/8/1006_2.png b/public/images/pokemon/icons/variant/9/1006_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1006_2.png rename to public/images/pokemon/icons/variant/9/1006_2.png diff --git a/public/images/pokemon/icons/variant/8/1006_3.png b/public/images/pokemon/icons/variant/9/1006_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1006_3.png rename to public/images/pokemon/icons/variant/9/1006_3.png diff --git a/public/images/pokemon/icons/variant/8/1010_2.png b/public/images/pokemon/icons/variant/9/1010_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1010_2.png rename to public/images/pokemon/icons/variant/9/1010_2.png diff --git a/public/images/pokemon/icons/variant/8/1010_3.png b/public/images/pokemon/icons/variant/9/1010_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/1010_3.png rename to public/images/pokemon/icons/variant/9/1010_3.png diff --git a/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png b/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png new file mode 100644 index 00000000000..19fa8603c69 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1012-counterfeit_2.png differ diff --git a/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png b/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png new file mode 100644 index 00000000000..04f74b0fd3a Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1012-counterfeit_3.png differ diff --git a/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png b/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png new file mode 100644 index 00000000000..3588b5e2641 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1013-unremarkable_2.png differ diff --git a/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png b/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png new file mode 100644 index 00000000000..acdb6716ab8 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/1013-unremarkable_3.png differ diff --git a/public/images/pokemon/icons/variant/9/909_2.png b/public/images/pokemon/icons/variant/9/909_2.png index 95cf5e14d4e..73f71bd49d3 100644 Binary files a/public/images/pokemon/icons/variant/9/909_2.png and b/public/images/pokemon/icons/variant/9/909_2.png differ diff --git a/public/images/pokemon/icons/variant/9/909_3.png b/public/images/pokemon/icons/variant/9/909_3.png index d4d7a9593a4..5fb79e5b917 100644 Binary files a/public/images/pokemon/icons/variant/9/909_3.png and b/public/images/pokemon/icons/variant/9/909_3.png differ diff --git a/public/images/pokemon/icons/variant/8/912_2.png b/public/images/pokemon/icons/variant/9/912_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/912_2.png rename to public/images/pokemon/icons/variant/9/912_2.png diff --git a/public/images/pokemon/icons/variant/8/912_3.png b/public/images/pokemon/icons/variant/9/912_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/912_3.png rename to public/images/pokemon/icons/variant/9/912_3.png diff --git a/public/images/pokemon/icons/variant/8/913_2.png b/public/images/pokemon/icons/variant/9/913_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/913_2.png rename to public/images/pokemon/icons/variant/9/913_2.png diff --git a/public/images/pokemon/icons/variant/8/913_3.png b/public/images/pokemon/icons/variant/9/913_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/913_3.png rename to public/images/pokemon/icons/variant/9/913_3.png diff --git a/public/images/pokemon/icons/variant/8/914_2.png b/public/images/pokemon/icons/variant/9/914_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/914_2.png rename to public/images/pokemon/icons/variant/9/914_2.png diff --git a/public/images/pokemon/icons/variant/8/914_3.png b/public/images/pokemon/icons/variant/9/914_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/914_3.png rename to public/images/pokemon/icons/variant/9/914_3.png diff --git a/public/images/pokemon/icons/variant/8/940_2.png b/public/images/pokemon/icons/variant/9/940_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/940_2.png rename to public/images/pokemon/icons/variant/9/940_2.png diff --git a/public/images/pokemon/icons/variant/8/940_3.png b/public/images/pokemon/icons/variant/9/940_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/940_3.png rename to public/images/pokemon/icons/variant/9/940_3.png diff --git a/public/images/pokemon/icons/variant/8/941_2.png b/public/images/pokemon/icons/variant/9/941_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/941_2.png rename to public/images/pokemon/icons/variant/9/941_2.png diff --git a/public/images/pokemon/icons/variant/8/941_3.png b/public/images/pokemon/icons/variant/9/941_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/941_3.png rename to public/images/pokemon/icons/variant/9/941_3.png diff --git a/public/images/pokemon/icons/variant/9/944_2.png b/public/images/pokemon/icons/variant/9/944_2.png new file mode 100644 index 00000000000..70af4937c8f Binary files /dev/null and b/public/images/pokemon/icons/variant/9/944_2.png differ diff --git a/public/images/pokemon/icons/variant/9/944_3.png b/public/images/pokemon/icons/variant/9/944_3.png new file mode 100644 index 00000000000..ef7618c9a9c Binary files /dev/null and b/public/images/pokemon/icons/variant/9/944_3.png differ diff --git a/public/images/pokemon/icons/variant/9/945_2.png b/public/images/pokemon/icons/variant/9/945_2.png new file mode 100644 index 00000000000..5a4a7c6ebe5 Binary files /dev/null and b/public/images/pokemon/icons/variant/9/945_2.png differ diff --git a/public/images/pokemon/icons/variant/9/945_3.png b/public/images/pokemon/icons/variant/9/945_3.png new file mode 100644 index 00000000000..1dad94c543c Binary files /dev/null and b/public/images/pokemon/icons/variant/9/945_3.png differ diff --git a/public/images/pokemon/icons/variant/8/953_2.png b/public/images/pokemon/icons/variant/9/953_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/953_2.png rename to public/images/pokemon/icons/variant/9/953_2.png diff --git a/public/images/pokemon/icons/variant/8/953_3.png b/public/images/pokemon/icons/variant/9/953_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/953_3.png rename to public/images/pokemon/icons/variant/9/953_3.png diff --git a/public/images/pokemon/icons/variant/8/954_2.png b/public/images/pokemon/icons/variant/9/954_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/954_2.png rename to public/images/pokemon/icons/variant/9/954_2.png diff --git a/public/images/pokemon/icons/variant/8/954_3.png b/public/images/pokemon/icons/variant/9/954_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/954_3.png rename to public/images/pokemon/icons/variant/9/954_3.png diff --git a/public/images/pokemon/icons/variant/8/981_2.png b/public/images/pokemon/icons/variant/9/981_2.png similarity index 100% rename from public/images/pokemon/icons/variant/8/981_2.png rename to public/images/pokemon/icons/variant/9/981_2.png diff --git a/public/images/pokemon/icons/variant/8/981_3.png b/public/images/pokemon/icons/variant/9/981_3.png similarity index 100% rename from public/images/pokemon/icons/variant/8/981_3.png rename to public/images/pokemon/icons/variant/9/981_3.png diff --git a/public/images/pokemon/shiny/194.png b/public/images/pokemon/shiny/194.png index 2e33bbfd005..38800a7d545 100644 Binary files a/public/images/pokemon/shiny/194.png and b/public/images/pokemon/shiny/194.png differ diff --git a/public/images/pokemon/shiny/378.png b/public/images/pokemon/shiny/378.png index 62322276ec1..7674ac1873a 100644 Binary files a/public/images/pokemon/shiny/378.png and b/public/images/pokemon/shiny/378.png differ diff --git a/public/images/pokemon/shiny/451.json b/public/images/pokemon/shiny/451.json index 3a320a87c61..f492cdbcb04 100644 --- a/public/images/pokemon/shiny/451.json +++ b/public/images/pokemon/shiny/451.json @@ -1,715 +1,2330 @@ -{ "frames": [ - { - "filename": "0001.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0002.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0003.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0004.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0005.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0006.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0007.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0008.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0009.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0010.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0011.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0012.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0013.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0014.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0015.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0016.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0017.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0018.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0019.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0020.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0021.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0022.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0023.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0024.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0025.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0026.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0027.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0028.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0029.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0030.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0031.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0032.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0033.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0034.png", - "frame": { "x": 68, "y": 0, "w": 64, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 64, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0035.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0036.png", - "frame": { "x": 177, "y": 42, "w": 61, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 61, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0037.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0038.png", - "frame": { "x": 238, "y": 43, "w": 59, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 59, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0039.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0040.png", - "frame": { "x": 0, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0041.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0042.png", - "frame": { "x": 57, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0043.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0044.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0045.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0046.png", - "frame": { "x": 287, "y": 86, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0047.png", - "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0048.png", - "frame": { "x": 232, "y": 86, "w": 55, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 55, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0049.png", - "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0050.png", - "frame": { "x": 117, "y": 85, "w": 57, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 57, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0051.png", - "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0052.png", - "frame": { "x": 117, "y": 42, "w": 60, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 60, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0053.png", - "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0054.png", - "frame": { "x": 132, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0055.png", - "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0056.png", - "frame": { "x": 0, "y": 0, "w": 68, "h": 40 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 6, "w": 68, "h": 40 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0057.png", - "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0058.png", - "frame": { "x": 195, "y": 0, "w": 63, "h": 42 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 63, "h": 42 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0059.png", - "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0060.png", - "frame": { "x": 258, "y": 0, "w": 61, "h": 43 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 61, "h": 43 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0061.png", - "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0062.png", - "frame": { "x": 58, "y": 42, "w": 59, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 59, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0063.png", - "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0064.png", - "frame": { "x": 0, "y": 40, "w": 58, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 58, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0065.png", - "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0066.png", - "frame": { "x": 177, "y": 84, "w": 55, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 55, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0067.png", - "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0068.png", - "frame": { "x": 0, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0069.png", - "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0070.png", - "frame": { "x": 112, "y": 129, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0071.png", - "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0072.png", - "frame": { "x": 167, "y": 130, "w": 55, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 55, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0073.png", - "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0074.png", - "frame": { "x": 0, "y": 173, "w": 54, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 54, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0075.png", - "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0076.png", - "frame": { "x": 54, "y": 177, "w": 52, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 2, "w": 52, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0077.png", - "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0078.png", - "frame": { "x": 210, "y": 176, "w": 53, "h": 44 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 53, "h": 44 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0079.png", - "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0080.png", - "frame": { "x": 158, "y": 174, "w": 52, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 1, "w": 52, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0081.png", - "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0082.png", - "frame": { "x": 222, "y": 131, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0083.png", - "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0084.png", - "frame": { "x": 275, "y": 132, "w": 53, "h": 45 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 53, "h": 45 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0085.png", - "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0086.png", - "frame": { "x": 55, "y": 131, "w": 52, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 52, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0087.png", - "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - }, - { - "filename": "0088.png", - "frame": { "x": 107, "y": 173, "w": 51, "h": 46 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 51, "h": 46 }, - "sourceSize": { "w": 71, "h": 46 } - } - ], - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.8.1-x64", - "image": "451.png", - "format": "I8", - "size": { "w": 339, "h": 221 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "451.png", + "format": "RGBA8888", + "size": { + "w": 281, + "h": 281 + }, + "scale": 1, + "frames": [ + { + "filename": "0033.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0034.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0077.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0078.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 5, + "w": 69, + "h": 41 + }, + "frame": { + "x": 0, + "y": 0, + "w": 69, + "h": 41 + } + }, + { + "filename": "0009.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0010.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0013.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0014.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0053.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0054.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0057.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0058.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 63, + "h": 43 + }, + "frame": { + "x": 69, + "y": 0, + "w": 63, + "h": 43 + } + }, + { + "filename": "0011.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0012.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0055.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0056.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 3, + "w": 66, + "h": 43 + }, + "frame": { + "x": 132, + "y": 0, + "w": 66, + "h": 43 + } + }, + { + "filename": "0031.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0032.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0075.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0076.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 198, + "y": 0, + "w": 65, + "h": 43 + } + }, + { + "filename": "0035.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0036.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0079.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0080.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 3, + "w": 65, + "h": 43 + }, + "frame": { + "x": 0, + "y": 41, + "w": 65, + "h": 43 + } + }, + { + "filename": "0007.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0008.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0015.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0016.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0051.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0052.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0059.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0060.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 61, + "h": 44 + }, + "frame": { + "x": 65, + "y": 43, + "w": 61, + "h": 44 + } + }, + { + "filename": "0029.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0030.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0073.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0074.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 4, + "y": 2, + "w": 62, + "h": 44 + }, + "frame": { + "x": 126, + "y": 43, + "w": 62, + "h": 44 + } + }, + { + "filename": "0037.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0038.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0081.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0082.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 2, + "w": 63, + "h": 44 + }, + "frame": { + "x": 188, + "y": 43, + "w": 63, + "h": 44 + } + }, + { + "filename": "0005.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0006.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0017.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0018.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0049.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0050.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0061.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0062.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 0, + "y": 84, + "w": 59, + "h": 45 + } + }, + { + "filename": "0027.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0028.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0071.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0072.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 1, + "w": 59, + "h": 45 + }, + "frame": { + "x": 59, + "y": 87, + "w": 59, + "h": 45 + } + }, + { + "filename": "0039.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0040.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0083.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0084.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 1, + "w": 61, + "h": 45 + }, + "frame": { + "x": 118, + "y": 87, + "w": 61, + "h": 45 + } + }, + { + "filename": "0089.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 179, + "y": 87, + "w": 57, + "h": 45 + } + }, + { + "filename": "0090.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 179, + "y": 87, + "w": 57, + "h": 45 + } + }, + { + "filename": "0091.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 0, + "y": 129, + "w": 57, + "h": 45 + } + }, + { + "filename": "0092.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 0, + "y": 129, + "w": 57, + "h": 45 + } + }, + { + "filename": "0093.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 57, + "y": 132, + "w": 57, + "h": 45 + } + }, + { + "filename": "0094.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 57, + "h": 45 + }, + "frame": { + "x": 57, + "y": 132, + "w": 57, + "h": 45 + } + }, + { + "filename": "0095.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 56, + "h": 45 + }, + "frame": { + "x": 114, + "y": 132, + "w": 56, + "h": 45 + } + }, + { + "filename": "0096.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 56, + "h": 45 + }, + "frame": { + "x": 114, + "y": 132, + "w": 56, + "h": 45 + } + }, + { + "filename": "0097.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 170, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0098.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 170, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0099.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 224, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0100.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 0, + "y": 1, + "w": 54, + "h": 45 + }, + "frame": { + "x": 224, + "y": 132, + "w": 54, + "h": 45 + } + }, + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0002.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0021.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0022.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0023.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0024.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0045.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0046.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0065.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0066.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0067.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0068.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 174, + "w": 54, + "h": 46 + } + }, + { + "filename": "0003.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0004.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0019.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0020.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0047.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0048.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0063.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0064.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0025.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0026.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0069.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0070.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 111, + "y": 177, + "w": 57, + "h": 46 + } + }, + { + "filename": "0041.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0042.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0085.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0086.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 60, + "h": 46 + }, + "frame": { + "x": 168, + "y": 177, + "w": 60, + "h": 46 + } + }, + { + "filename": "0109.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 228, + "y": 177, + "w": 53, + "h": 46 + } + }, + { + "filename": "0110.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 6, + "y": 0, + "w": 53, + "h": 46 + }, + "frame": { + "x": 228, + "y": 177, + "w": 53, + "h": 46 + } + }, + { + "filename": "0101.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 220, + "w": 54, + "h": 46 + } + }, + { + "filename": "0102.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 1, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 0, + "y": 220, + "w": 54, + "h": 46 + } + }, + { + "filename": "0043.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0044.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0087.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0088.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 57, + "h": 46 + }, + "frame": { + "x": 54, + "y": 223, + "w": 57, + "h": 46 + } + }, + { + "filename": "0103.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 111, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0104.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 2, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 111, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0105.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 166, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0106.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 3, + "y": 0, + "w": 55, + "h": 46 + }, + "frame": { + "x": 166, + "y": 223, + "w": 55, + "h": 46 + } + }, + { + "filename": "0107.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 221, + "y": 223, + "w": 54, + "h": 46 + } + }, + { + "filename": "0108.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 71, + "h": 46 + }, + "spriteSourceSize": { + "x": 5, + "y": 0, + "w": 54, + "h": 46 + }, + "frame": { + "x": 221, + "y": 223, + "w": 54, + "h": 46 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:9097bf5ffed4b93401c65aa14299faaa:d22b7c7f6e33b1453fda428e689d4529:c79e17c206de27e3b7f1ce96f7df8e51$" + } } diff --git a/public/images/pokemon/shiny/451.png b/public/images/pokemon/shiny/451.png index 4f8120ce668..69d165c9ae8 100644 Binary files a/public/images/pokemon/shiny/451.png and b/public/images/pokemon/shiny/451.png differ diff --git a/public/images/pokemon/shiny/658-ash.json b/public/images/pokemon/shiny/658-ash.json index 7ac419b1686..c2b8eede9ef 100644 --- a/public/images/pokemon/shiny/658-ash.json +++ b/public/images/pokemon/shiny/658-ash.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658-ash.png", - "format": "RGBA8888", - "size": { - "w": 79, - "h": 79 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 79, - "h": 74 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - }, - "frame": { - "x": 0, - "y": 0, - "w": 79, - "h": 74 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:3dd081ba5490f090a73de8423aac2f6b:f088fafaea755476f2abf488e7340cab:bfbf521a5c7bd80bcd95a96d9789c0dd$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 74 }, + "sourceSize": { "w": 79, "h": 74 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 74 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/658-ash.png b/public/images/pokemon/shiny/658-ash.png index 0d65f0bb900..f5de608708e 100644 Binary files a/public/images/pokemon/shiny/658-ash.png and b/public/images/pokemon/shiny/658-ash.png differ diff --git a/public/images/pokemon/shiny/658.json b/public/images/pokemon/shiny/658.json index 92f9b29175c..219645ec240 100644 --- a/public/images/pokemon/shiny/658.json +++ b/public/images/pokemon/shiny/658.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "658.png", - "format": "RGBA8888", - "size": { - "w": 75, - "h": 75 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 75, - "h": 65 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - }, - "frame": { - "x": 0, - "y": 0, - "w": 75, - "h": 65 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:be07c062265a19e890f1e2d2d1b5527d:ad4583a5a0498c496e9a93574c55ee03:5affcab976148657d36bf4ff3410f92d$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 85, "h": 67 }, + "sourceSize": { "w": 85, "h": 67 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 85, "h": 67 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/658.png b/public/images/pokemon/shiny/658.png index 6fb80fd57cc..100d2a02f4a 100644 Binary files a/public/images/pokemon/shiny/658.png and b/public/images/pokemon/shiny/658.png differ diff --git a/public/images/pokemon/shiny/688.json b/public/images/pokemon/shiny/688.json index 8d34a857f65..3d9aa902a54 100644 --- a/public/images/pokemon/shiny/688.json +++ b/public/images/pokemon/shiny/688.json @@ -1,41 +1,18 @@ -{ - "textures": [ - { - "image": "688.png", - "format": "RGBA8888", - "size": { - "w": 52, - "h": 52 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 41, - "h": 52 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - }, - "frame": { - "x": 0, - "y": 0, - "w": 41, - "h": 52 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:e78487a241bfd62ebbe53b20c731d2c3:77b6de2bb0929c9cd5328c501256413b:176060351d0044923af938ba7932a6ef$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 64, "h": 63 }, + "sourceSize": { "w": 64, "h": 63 } + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 64, "h": 63 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/688.png b/public/images/pokemon/shiny/688.png index e87b981aa45..42565cb09b2 100644 Binary files a/public/images/pokemon/shiny/688.png and b/public/images/pokemon/shiny/688.png differ diff --git a/public/images/pokemon/shiny/689.json b/public/images/pokemon/shiny/689.json index c388441a207..488ef54de71 100644 --- a/public/images/pokemon/shiny/689.json +++ b/public/images/pokemon/shiny/689.json @@ -1,41 +1,19 @@ -{ - "textures": [ - { - "image": "689.png", - "format": "RGBA8888", - "size": { - "w": 86, - "h": 86 - }, - "scale": 1, - "frames": [ - { - "filename": "0001.png", - "rotated": false, - "trimmed": false, - "sourceSize": { - "w": 86, - "h": 79 - }, - "spriteSourceSize": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - }, - "frame": { - "x": 0, - "y": 0, - "w": 86, - "h": 79 - } - } - ] - } - ], - "meta": { - "app": "https://www.codeandweb.com/texturepacker", - "version": "3.0", - "smartupdate": "$TexturePacker:SmartUpdate:182cf1643b5020735212d8aa4db1c48e:ceb6ea59b420d8893e991d5545fbb7c7:bd0c58ecddcb4af9a0c6e7b39821d971$" - } +{ "frames": [ + { + "filename": "0001.png", + "frame": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 79, "h": 82 }, + "sourceSize": { "w": 79, "h": 82 }, + "duration": 100 + } + ], + "meta": { + "app": "https://www.aseprite.org/", + "version": "1.3.7-x64", + "format": "I8", + "size": { "w": 79, "h": 82 }, + "scale": "1" + } } diff --git a/public/images/pokemon/shiny/689.png b/public/images/pokemon/shiny/689.png index faf533459d0..c58ed341e75 100644 Binary files a/public/images/pokemon/shiny/689.png and b/public/images/pokemon/shiny/689.png differ diff --git a/public/images/pokemon/shiny/944.png b/public/images/pokemon/shiny/944.png index 5b5a264755f..e410629b535 100644 Binary files a/public/images/pokemon/shiny/944.png and b/public/images/pokemon/shiny/944.png differ diff --git a/public/images/pokemon/shiny/945.png b/public/images/pokemon/shiny/945.png index f458bf630d6..ab3fb485bb2 100644 Binary files a/public/images/pokemon/shiny/945.png and b/public/images/pokemon/shiny/945.png differ diff --git a/public/images/pokemon/shiny/female/194.png b/public/images/pokemon/shiny/female/194.png index 01c071ee41d..23e55c52190 100644 Binary files a/public/images/pokemon/shiny/female/194.png and b/public/images/pokemon/shiny/female/194.png differ diff --git a/public/images/pokemon/variant/1012-counterfeit.json b/public/images/pokemon/variant/1012-counterfeit.json new file mode 100644 index 00000000000..114c3811ba1 --- /dev/null +++ b/public/images/pokemon/variant/1012-counterfeit.json @@ -0,0 +1,44 @@ +{ + "1": { + "5d9e4a": "dda08a", + "a09750": "acbedf", + "423232": "626a96", + "827b74": "848fb8", + "613f19": "7b86ad", + "ccc374": "def7ff", + "a7ba72": "c87079", + "c1b9ae": "c8ddf1", + "69441b": "3a44a4", + "878278": "8a96c0", + "f7da67": "94386a", + "78c463": "f7dfc5", + "ede9e4": "f5fdff", + "261919": "222078", + "396725": "b0654a", + "251b1b": "404ec8", + "4d3635": "174593", + "87847e": "a1b0e6", + "4c3a3a": "667fe9" + }, + "2": { + "5d9e4a": "978dc7", + "a09750": "1b2556", + "423232": "020109", + "827b74": "6fbb45", + "613f19": "0d1030", + "ccc374": "242f66", + "a7ba72": "647c9a", + "c1b9ae": "111039", + "69441b": "44244b", + "878278": "070722", + "f7da67": "0f5627", + "78c463": "c3b4e0", + "ede9e4": "212b5e", + "261919": "1c0b1f", + "396725": "7a5aa7", + "251b1b": "37183f", + "4d3635": "aae16c", + "87847e": "443666", + "4c3a3a": "563f5b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/1013-unremarkable.json b/public/images/pokemon/variant/1013-unremarkable.json new file mode 100644 index 00000000000..cd988febd87 --- /dev/null +++ b/public/images/pokemon/variant/1013-unremarkable.json @@ -0,0 +1,48 @@ +{ + "1": { + "5d9e4a": "dda08a", + "786354": "7987bd", + "403030": "1c4b9c", + "7b8764": "c58c85", + "ccc374": "eefbff", + "a7ba72": "b75267", + "7b6f6c": "939ec4", + "c1b9ae": "cbe1f5", + "69441b": "3a44a4", + "342405": "616a8a", + "78c463": "f7dfc5", + "453636": "667fe9", + "988975": "acbedf", + "295217": "b0654a", + "e6e1db": "e6f9ff", + "9e8574": "b36171", + "251b1b": "404ec8", + "6a5b20": "8a96c0", + "a09750": "c3d7eb", + "291a0d": "222078", + "f7da67": "94386a" + }, + "2": { + "5d9e4a": "978dc7", + "786354": "5fb352", + "403030": "aae16c", + "7b8764": "716d99", + "ccc374": "263665", + "a7ba72": "647c9a", + "7b6f6c": "0f102d", + "c1b9ae": "111039", + "69441b": "44244b", + "342405": "08081f", + "78c463": "c3b4e0", + "453636": "563f5b", + "988975": "212e57", + "295217": "7a5aa7", + "e6e1db": "212b5e", + "9e8574": "585d81", + "251b1b": "37183f", + "6a5b20": "0b0c21", + "a09750": "131238", + "291a0d": "170d26", + "f7da67": "0f5627" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/102.json b/public/images/pokemon/variant/102.json new file mode 100644 index 00000000000..987f6046458 --- /dev/null +++ b/public/images/pokemon/variant/102.json @@ -0,0 +1,20 @@ +{ + "1": { + "ffce4a": "cea573", + "e69c00": "a0694c", + "ffe6ce": "7ae49f", + "943131": "193662", + "ffb58c": "369b96", + "ef8463": "26647e", + "ffd6ad": "4fba94" + }, + "2": { + "ffce4a": "92394b", + "e69c00": "6d2341", + "ffe6ce": "ebb6f8", + "943131": "414189", + "ffb58c": "9475ce", + "ef8463": "6c5fb6", + "ffd6ad": "b98fe4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/103.json b/public/images/pokemon/variant/103.json new file mode 100644 index 00000000000..2b6a1f13f79 --- /dev/null +++ b/public/images/pokemon/variant/103.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffde6b": "a3c4ed", + "e6ad5a": "869fdc", + "8c7342": "283f5b", + "73ad31": "dea44c", + "526329": "c8592a", + "9cd64a": "f4e774", + "a56b21": "6072ba", + "b59c4a": "426378", + "734210": "373e85", + "ffefa5": "d3efff", + "524210": "131d33" + }, + "2": { + "ffde6b": "eb748d", + "e6ad5a": "c84e7f", + "8c7342": "d59cba", + "73ad31": "3d324b", + "526329": "1f1a31", + "9cd64a": "6a5b73", + "a56b21": "83295f", + "b59c4a": "ffdbe7", + "734210": "4e1044", + "ffefa5": "ffa29d", + "524210": "925b81" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/128.json b/public/images/pokemon/variant/128.json new file mode 100644 index 00000000000..cd6a7d64f3a --- /dev/null +++ b/public/images/pokemon/variant/128.json @@ -0,0 +1,32 @@ +{ + "1": { + "dea54a": "56b393", + "634a31": "173e0d", + "9c9cad": "997059", + "e6c57b": "8fcaaa", + "4a3a29": "072b05", + "8c6321": "215c72", + "8c6b52": "355816", + "b58431": "2e8a85", + "ad8c73": "5f722a", + "3a3a4a": "4d2324", + "6b6b84": "75413b", + "cecede": "c2a082", + "523a10": "102d4b" + }, + "2": { + "dea54a": "872b3b", + "634a31": "bc9681", + "9c9cad": "edda95", + "e6c57b": "a84d52", + "4a3a29": "966959", + "8c6321": "461029", + "8c6b52": "d6c3aa", + "b58431": "5e172e", + "ad8c73": "faf9ed", + "3a3a4a": "996537", + "6b6b84": "cca45e", + "cecede": "fffcc1", + "523a10": "2f0e21" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/152.json b/public/images/pokemon/variant/152.json new file mode 100644 index 00000000000..f3c1d446fa7 --- /dev/null +++ b/public/images/pokemon/variant/152.json @@ -0,0 +1,28 @@ +{ + "1": { + "efffc5": "f7f1fb", + "849452": "7373b4", + "c52929": "77b3af", + "b5ce6b": "aca1d7", + "d6f78c": "ded2f1", + "84e631": "8074fa", + "ef7b7b": "9bd5c1", + "6bb529": "6f4be2", + "425a19": "505d8d", + "426319": "5d2398", + "638c29": "6633bc" + }, + "2": { + "efffc5": "f4b2ad", + "849452": "a62775", + "c52929": "4eac60", + "b5ce6b": "c83c74", + "d6f78c": "e7617d", + "84e631": "feeeaf", + "ef7b7b": "71cf71", + "6bb529": "f0d187", + "425a19": "801a69", + "426319": "b4814b", + "638c29": "d8a864" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/153.json b/public/images/pokemon/variant/153.json new file mode 100644 index 00000000000..3456ca16513 --- /dev/null +++ b/public/images/pokemon/variant/153.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffff8c": "cbe0fa", + "a58419": "5961ce", + "6b5200": "493fa6", + "ad3100": "47d0d1", + "8cbd31": "8251dc", + "debd29": "7b8ce6", + "527b08": "4d36be", + "6b9c10": "6740c9", + "295208": "232699", + "f7e64a": "a2bbf8", + "d68c52": "80f5e6" + }, + "2": { + "ffff8c": "f5c095", + "a58419": "a8244d", + "6b5200": "891b4f", + "ad3100": "439227", + "8cbd31": "fae084", + "debd29": "ca333d", + "527b08": "e8bc5e", + "6b9c10": "edc870", + "295208": "c58c48", + "f7e64a": "ea704a", + "d68c52": "8ec349" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/154.json b/public/images/pokemon/variant/154.json new file mode 100644 index 00000000000..90311122029 --- /dev/null +++ b/public/images/pokemon/variant/154.json @@ -0,0 +1,30 @@ +{ + "1": { + "634a00": "519aa7", + "f7a59c": "739ed4", + "e6ad00": "7bcfc6", + "ff3a5a": "3542a7", + "ffde21": "b1f2dc", + "ce213a": "27217d", + "63bd42": "9d86d9", + "bdff7b": "dadffe", + "7b103a": "23124e", + "107b31": "8057b2", + "fefefe": "9cfeff", + "9ce652": "b7afee" + }, + "2": { + "634a00": "488939", + "f7a59c": "fff6a9", + "e6ad00": "6bac4b", + "ff3a5a": "f9db74", + "ffde21": "92c462", + "ce213a": "e5b650", + "63bd42": "a31f60", + "bdff7b": "f57382", + "7b103a": "b7873b", + "107b31": "761858", + "fefefe": "ffffee", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/158.json b/public/images/pokemon/variant/158.json new file mode 100644 index 00000000000..779c7ea69b4 --- /dev/null +++ b/public/images/pokemon/variant/158.json @@ -0,0 +1,27 @@ +{ + "1": { + "7b1900": "4f0332", + "6bb5e6": "dd8e59", + "94d6ff": "fdc17e", + "ffc552": "99d4d9", + "ad8429": "4798ab", + "3184c5": "ae5139", + "e67b7b": "749e9e", + "b54a52": "1d5d6c", + "ce4221": "772c52", + "315a84": "73131e" + }, + "2": { + "000000": "ffffff", + "7b1900": "a66b14", + "6bb5e6": "97ac5b", + "94d6ff": "ccd198", + "ffc552": "2f5365", + "ad8429": "1c314f", + "3184c5": "4f854a", + "e67b7b": "e4b843", + "b54a52": "c48b27", + "ce4221": "ce8c20", + "315a84": "2b4a30" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/159.json b/public/images/pokemon/variant/159.json new file mode 100644 index 00000000000..c6563e4204c --- /dev/null +++ b/public/images/pokemon/variant/159.json @@ -0,0 +1,33 @@ +{ + "1": { + "3a4a84": "973027", + "e64221": "749e9e", + "ce293a": "682c4e", + "5aade6": "e5a354", + "84ceff": "ffcf72", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "3184c5": "cd6537", + "6b5200": "085d75", + "840009": "1d5d6c", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "3a4a84": "26472b", + "e64221": "e4b843", + "ce293a": "ce8c20", + "5aade6": "8fa54e", + "84ceff": "c2c78a", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "3184c5": "468040", + "6b5200": "112034", + "840009": "c48b27", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/160.json b/public/images/pokemon/variant/160.json new file mode 100644 index 00000000000..adb897ae5f5 --- /dev/null +++ b/public/images/pokemon/variant/160.json @@ -0,0 +1,27 @@ +{ + "1": { + "8cd6ff": "ffcf72", + "6b5200": "085d75", + "5ab5f7": "eda857", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "294a8c": "973027", + "3a8cce": "d26738", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "8cd6ff": "d1d692", + "6b5200": "112034", + "5ab5f7": "9ab350", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "294a8c": "274c2d", + "3a8cce": "498a42", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/167.json b/public/images/pokemon/variant/167.json new file mode 100644 index 00000000000..20f954a4a55 --- /dev/null +++ b/public/images/pokemon/variant/167.json @@ -0,0 +1,31 @@ +{ + "1": { + "52b56b": "e06c19", + "b5424a": "861d1d", + "ef5a5a": "b92222", + "7b3142": "651218", + "c5b519": "3f2e71", + "314a10": "732202", + "846b29": "231a58", + "8ce631": "f1b940", + "527b29": "d54f19", + "ffe64a": "624095", + "adef63": "f5da68" + }, + "2": { + "52b56b": "8c2848", + "b5424a": "1f1d3f", + "bdc5c5": "a1b7de", + "ef5a5a": "313659", + "7b3142": "181729", + "c5b519": "7d95b9", + "314a10": "481229", + "846b29": "565e8d", + "8ce631": "b54158", + "527b29": "6a1b37", + "ffe64a": "aac3d6", + "ffffff": "cde6fc", + "6b6b73": "62657d", + "adef63": "dd7081" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/168.json b/public/images/pokemon/variant/168.json new file mode 100644 index 00000000000..4c8fcf5f4f5 --- /dev/null +++ b/public/images/pokemon/variant/168.json @@ -0,0 +1,32 @@ +{ + "1": { + "c54242": "62b943", + "6b5219": "043435", + "63319c": "af4900", + "9c5ac5": "e28220", + "bdbdbd": "b5d3dc", + "ffffff": "fffef9", + "ff8c73": "dce24b", + "c5b54a": "15463c", + "ff5a4a": "a8d919", + "ffde42": "186c45", + "8c2100": "317945", + "bd84e6": "f1b940", + "6b6b6b": "552718" + }, + "2": { + "c54242": "7ca5c6", + "6b5219": "161437", + "63319c": "291013", + "9c5ac5": "96304a", + "bdbdbd": "c09fa1", + "ffffff": "fae8e7", + "ff8c73": "c4e8e7", + "c5b54a": "1f2150", + "ff5a4a": "a3c8d1", + "ffde42": "313b60", + "8c2100": "2d3d72", + "bd84e6": "c8545d", + "6b6b6b": "3e538a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/170.json b/public/images/pokemon/variant/170.json new file mode 100644 index 00000000000..c83ca6836db --- /dev/null +++ b/public/images/pokemon/variant/170.json @@ -0,0 +1,34 @@ +{ + "1": { + "08295a": "691f03", + "ffce52": "a1dbba", + "b50000": "efde5a", + "94cee6": "ffeabf", + "295294": "a14713", + "ffef84": "ccffd7", + "5a73c5": "bf6924", + "c59400": "609a8a", + "522919": "052b38", + "ffffde": "f2fff5", + "7bbde6": "f6e37f", + "846352": "45757a", + "6ba5e6": "dda13d", + "e6b529": "84bda9" + }, + "2": { + "08295a": "1b072f", + "ffce52": "e25765", + "b50000": "f0d050", + "94cee6": "a15b8d", + "295294": "321648", + "ffef84": "f97f7f", + "5a73c5": "441e56", + "c59400": "931b3c", + "522919": "720b3a", + "ffffde": "ffc4be", + "7bbde6": "89498d", + "846352": "720b3a", + "6ba5e6": "693373", + "e6b529": "b62b51" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/171.json b/public/images/pokemon/variant/171.json new file mode 100644 index 00000000000..8a9cafe4265 --- /dev/null +++ b/public/images/pokemon/variant/171.json @@ -0,0 +1,30 @@ +{ + "1": { + "a5314a": "bf882c", + "4a7bce": "bc3c4c", + "423110": "05333a", + "ef635a": "efde5a", + "7badef": "f6907f", + "a5ceff": "fbcdb3", + "e6b552": "82ca4f", + "6394e6": "e86062", + "ffde63": "c3e875", + "ad9442": "2a8d3d", + "293173": "872341", + "7b634a": "0c5540" + }, + "2": { + "a5314a": "c3851d", + "4a7bce": "9781b3", + "423110": "040529", + "ef635a": "f0d050", + "7badef": "eecfed", + "a5ceff": "fbf5fa", + "e6b552": "3294b8", + "6394e6": "c5a5d0", + "ffde63": "4dd5d9", + "ad9442": "23689e", + "293173": "4b426c", + "7b634a": "0c1d4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/172-spiky.json b/public/images/pokemon/variant/172-spiky.json new file mode 100644 index 00000000000..81a1d9bdcd6 --- /dev/null +++ b/public/images/pokemon/variant/172-spiky.json @@ -0,0 +1,30 @@ +{ + "1": { + "f7ef94": "c4e3c3", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "e36481": "d45976", + "292929": "242424", + "c5ad10": "6cab9a", + "845a29": "45818a", + "f7e652": "a3d1a8", + "a57b08": "5ca390", + "634a10": "30536b" + }, + "2": { + "f7ef94": "8aa5ad", + "7d1c1c": "c38218", + "212131": "d48d61", + "e77b94": "f5dd94", + "e36481": "b35b6d", + "292929": "242424", + "c5ad10": "4a6a90", + "845a29": "283567", + "8c2121": "772c49", + "424252": "e7c17c", + "f7e652": "7095ab", + "171721": "9a4440", + "a57b08": "486a8e", + "634a10": "2f335b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/172.json b/public/images/pokemon/variant/172.json new file mode 100644 index 00000000000..7df41b99457 --- /dev/null +++ b/public/images/pokemon/variant/172.json @@ -0,0 +1,29 @@ +{ + "1": { + "f7ef94": "c4e3c3", + "a57b08": "5ca390", + "d1667f": "d45976", + "e77b94": "bd4d5e", + "292929": "242424", + "c5ad10": "6cab9a", + "845a29": "45818a", + "f7e652": "a3d1a8", + "7d1c1c": "992424", + "634a10": "30536b" + }, + "2": { + "f7ef94": "8aa5ad", + "a57b08": "486a8e", + "d1667f": "b35b6d", + "8c2121": "772c49", + "e77b94": "f5dd94", + "c5ad10": "4a6a90", + "845a29": "283567", + "212131": "d48d61", + "424252": "e7c17c", + "f7e652": "7095ab", + "7d1c1c": "c38218", + "171721": "9a4440", + "634a10": "2f335b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/174.json b/public/images/pokemon/variant/174.json new file mode 100644 index 00000000000..65b9af81dde --- /dev/null +++ b/public/images/pokemon/variant/174.json @@ -0,0 +1,20 @@ +{ + "1": { + "9c1952": "3a6472", + "e6849c": "81c2b8", + "bd0000": "f18fc4", + "630000": "6f305b", + "b55273": "43737d", + "e62910": "ae93d9", + "ffced6": "e5ffec", + "ffadbd": "c5ebd5" + }, + "2": { + "9c1952": "9c5200", + "e6849c": "f5c45b", + "b55273": "a16b30", + "e62910": "c43f3f", + "ffced6": "fff9bf", + "ffadbd": "f5e884" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/194.json b/public/images/pokemon/variant/194.json new file mode 100644 index 00000000000..47604b8228d --- /dev/null +++ b/public/images/pokemon/variant/194.json @@ -0,0 +1,24 @@ +{ + "1": { + "104a84": "7a150a", + "b54242": "23768d", + "ff6b73": "52c1e0", + "633a6b": "204954", + "3a7bc5": "d5682e", + "ef73e6": "81e2f7", + "73bdff": "ffc355", + "d65ad6": "65b1c2", + "529ce6": "e8983d" + }, + "2": { + "104a84": "180d42", + "b54242": "b96228", + "ff6b73": "e9cb52", + "633a6b": "80301c", + "3a7bc5": "3f377e", + "ef73e6": "e9cb52", + "73bdff": "5c66c4", + "d65ad6": "cf933b", + "529ce6": "564daa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/195.json b/public/images/pokemon/variant/195.json new file mode 100644 index 00000000000..3bf5ea7844a --- /dev/null +++ b/public/images/pokemon/variant/195.json @@ -0,0 +1,26 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "f7f7f7": "fffbea", + "637ba5": "936e66", + "639cbd": "dc6a4d", + "3194a5": "81e2f7", + "19423a": "204954", + "425284": "b03844", + "195a6b": "54aec2", + "6b5a8c": "23768d" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "f7f7f7": "e8b6ff", + "637ba5": "6f2d4b", + "639cbd": "493a8d", + "3194a5": "e9cb52", + "19423a": "b96228", + "425284": "240830", + "195a6b": "cf933b", + "6b5a8c": "80301c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/198.json b/public/images/pokemon/variant/198.json new file mode 100644 index 00000000000..ab9084619f3 --- /dev/null +++ b/public/images/pokemon/variant/198.json @@ -0,0 +1,34 @@ +{ + "1": { + "d94352": "7a101c", + "314263": "462b20", + "d64252": "b3986b", + "73293a": "755237", + "ffad8c": "ad2e24", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "a6a6b3", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "752a3c": "4d0419", + "d6bd52": "838098" + }, + "2": { + "d94352": "5939a9", + "314263": "0e4333", + "d64252": "bc4b84", + "73293a": "7b2363", + "ffad8c": "b164e6", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "c2723a", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "752a3c": "1e1764", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2026.json b/public/images/pokemon/variant/2026.json new file mode 100644 index 00000000000..995e3a1a6e8 --- /dev/null +++ b/public/images/pokemon/variant/2026.json @@ -0,0 +1,34 @@ +{ + "1": { + "e3882d": "3d7375", + "965821": "2f4e6b", + "846b5b": "467f85", + "fffdfb": "d6d9ca", + "552720": "142c48", + "602c24": "162f4b", + "fef443": "c48081", + "b45f25": "2d5261", + "fef652": "eb999a", + "1a73cc": "b85346", + "174680": "2b1307", + "e9be14": "945c7b", + "646124": "492652", + "9c5430": "1d3a57", + "ecd8b7": "b4c2a5" + }, + "2": { + "e3882d": "d3b06f", + "965821": "9cb3ca", + "846b5b": "202746", + "fffdfb": "6d8297", + "552720": "43617f", + "fef443": "3a5873", + "b45f25": "bd8551", + "fef652": "faee9e", + "1a73cc": "c26400", + "174680": "2b0606", + "e9be14": "1a3551", + "646124": "122140", + "ecd8b7": "5a6f90" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/2103.json b/public/images/pokemon/variant/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/211.json b/public/images/pokemon/variant/211.json new file mode 100644 index 00000000000..cc2b3ba9209 --- /dev/null +++ b/public/images/pokemon/variant/211.json @@ -0,0 +1,28 @@ +{ + "1": { + "940000": "1c6449", + "194a52": "321128", + "dede94": "f1c17c", + "428494": "80294b", + "c5c57b": "dc9565", + "a5ad6b": "ad6643", + "3a6363": "611a42", + "d65263": "48be87", + "ffa594": "9ee79b", + "6b5231": "6d2c2c", + "73adb5": "a0415e" + }, + "2": { + "940000": "385881", + "194a52": "1c2f5b", + "dede94": "365492", + "428494": "60abdc", + "c5c57b": "2b3e7b", + "a5ad6b": "1e275b", + "3a6363": "396796", + "d65263": "a9cfd7", + "ffa594": "cafefd", + "6b5231": "181f46", + "73adb5": "8bd9ee" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-beauty-cosplay.json b/public/images/pokemon/variant/25-beauty-cosplay.json new file mode 100644 index 00000000000..0e5a6a1bad2 --- /dev/null +++ b/public/images/pokemon/variant/25-beauty-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "c52119": "ad4e76", + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "e65137": "c95578", + "fffabf": "f4f7ab", + "b52821": "ad4469", + "292929": "1e1526", + "39509d": "47449c", + "f7e860": "f2ea50", + "e65a42": "cf6182", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "242323": "282030", + "585861": "443e6c", + "fff7a5": "c4e3c3", + "9c5200": "315c75", + "f7cc2f": "f7bd21", + "fffdea": "f8ffe3" + }, + "2": { + "c52119": "ebc67c", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "52525a": "f1b571", + "cecab9": "b84084", + "e65137": "b95b6e", + "fffabf": "f5efd1", + "b52821": "6a253f", + "292929": "a45233", + "39509d": "9ec4cd", + "f7e860": "eddc78", + "e65a42": "eedd9c", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "242323": "282030", + "585861": "3f4246", + "fff7a5": "7b96aa", + "9c5200": "283361", + "965b0e": "96500e", + "f7cc2f": "d5ac44", + "fffdea": "ea82a6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cool-cosplay.json b/public/images/pokemon/variant/25-cool-cosplay.json new file mode 100644 index 00000000000..de4a138b690 --- /dev/null +++ b/public/images/pokemon/variant/25-cool-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "171717": "2a1d36", + "e8b127": "f5ca2f", + "52525a": "55555e", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "2baf23": "76a848", + "f7bd21": "79b5a5", + "e65a42": "cf6182", + "ba2b23": "b73850", + "f5e193": "f4f7ab", + "e66953": "b95b6e", + "6f6c8e": "656f86", + "a6adb6": "a5b0b6", + "8c4e22": "965b0e", + "9c5200": "1c4f75", + "c43129": "6a253f", + "d95b45": "cf6887", + "45484d": "443e6c", + "3b3b40": "4a3e46", + "292929": "272b2b" + }, + "2": { + "171717": "a45233", + "e8b127": "e7b432", + "52525a": "8f4b32", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "2baf23": "572626", + "f7bd21": "445f8a", + "e65a42": "eedd9c", + "ba2b23": "2c2c47", + "f5e193": "eadbb3", + "e66953": "b95b6e", + "6f6c8e": "cf752b", + "a6adb6": "f0b541", + "8c4e22": "b1632b", + "9c5200": "22325c", + "c43129": "6a253f", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "292929": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cosplay.json b/public/images/pokemon/variant/25-cosplay.json new file mode 100644 index 00000000000..e324c094019 --- /dev/null +++ b/public/images/pokemon/variant/25-cosplay.json @@ -0,0 +1,36 @@ +{ + "1": { + "f7e652": "a3d1a8", + "212121": "30263b", + "c43129": "6a253f", + "171717": "1e1526", + "292929": "282030", + "e65a42": "cf6182", + "c52119": "ad4e76", + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "45454a": "4f454c", + "9c5200": "315c75", + "633108": "09406b", + "e66953": "b95b6e", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "212121": "d8805b", + "c43129": "6a253f", + "171717": "a45233", + "292929": "282030", + "e65a42": "eedd9c", + "c52119": "ebc67c", + "42424a": "3f4246", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "45454a": "f1b571", + "9c5200": "23345e", + "633108": "22244f", + "e66953": "b95b6e", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-cute-cosplay.json b/public/images/pokemon/variant/25-cute-cosplay.json new file mode 100644 index 00000000000..251530a0892 --- /dev/null +++ b/public/images/pokemon/variant/25-cute-cosplay.json @@ -0,0 +1,53 @@ +{ + "1": { + "e65a42": "cf6182", + "cf4770": "cf4a59", + "52525a": "30263b", + "c52119": "ad4e76", + "292929": "30263b", + "fff7a5": "f0eaa8", + "9c5200": "255e8a", + "752bd0": "5452b7", + "e66953": "b95b6e", + "c43129": "6a253f", + "42424a": "443e6c", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "29292a": "1e1526", + "f3bace": "f2bbbb", + "853247": "85323c", + "52525c": "bab699", + "fff7a6": "c4e3c3", + "101011": "101010", + "baa998": "bab699", + "f7bd21": "79b5a5", + "101010": "1e1526", + "52525b": "4f454c" + }, + "2": { + "e65a42": "eedd9c", + "cf4770": "739b55", + "52525a": "d8805b", + "52525d": "d3ab5a", + "c52119": "ebc67c", + "292929": "d8805b", + "fff7a5": "ebe7b7", + "9c5200": "1e2d52", + "752bd0": "7751c2", + "e66953": "b95b6e", + "c43129": "6a253f", + "42424a": "373d45", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "29292a": "a45233", + "f3bace": "c5cc85", + "853247": "254b30", + "52525c": "706053", + "fff7a6": "7b96aa", + "101011": "101010", + "baa998": "d3ab5a", + "f7bd21": "445f8a", + "101010": "a45233", + "52525b": "f1b571" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-gigantamax.json b/public/images/pokemon/variant/25-gigantamax.json new file mode 100644 index 00000000000..554b93c5bfa --- /dev/null +++ b/public/images/pokemon/variant/25-gigantamax.json @@ -0,0 +1,35 @@ +{ + "1": { + "212121": "1e1526", + "c52018": "ad4e76", + "f6e652": "a3d1a8", + "f6bd20": "79b5a5", + "fff9c2": "b8ffd9", + "e65a41": "cf6182", + "de9400": "338087", + "623108": "09406b", + "fff6a4": "c4e3c3", + "292929": "282030", + "323133": "30263b", + "f8fc4b": "5bc28b", + "9c5200": "315c75", + "41414a": "4f454c", + "61616d": "443e6c" + }, + "2": { + "212121": "a45233", + "c52018": "ebc67c", + "f6e652": "577b98", + "f6bd20": "445f8a", + "fff9c2": "83b1d2", + "e65a41": "eedd9c", + "de9400": "324472", + "623108": "09406b", + "fff6a4": "7b96aa", + "323133": "d8805b", + "695d65": "737383", + "f8fc4b": "326a9f", + "9c5200": "23345e", + "41414a": "d99362" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-partner.json b/public/images/pokemon/variant/25-partner.json new file mode 100644 index 00000000000..4363facf947 --- /dev/null +++ b/public/images/pokemon/variant/25-partner.json @@ -0,0 +1,36 @@ +{ + "1": { + "212121": "30263b", + "c52119": "ad4e76", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "633108": "09406b", + "de9400": "338087", + "42424a": "443e6c", + "c43129": "6a253f", + "45454a": "4f454c", + "9c5200": "315c75", + "e66953": "b95b6e", + "e65a42": "cf6182", + "171717": "1e1526", + "f7bd21": "79b5a5", + "292929": "282030" + }, + "2": { + "212121": "d8805b", + "c52119": "ebc67c", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "633108": "22244f", + "de9400": "324472", + "42424a": "3f4246", + "c43129": "6a253f", + "45454a": "f1b571", + "9c5200": "23345e", + "e66953": "b95b6e", + "e65a42": "eedd9c", + "171717": "a45233", + "f7bd21": "445f8a", + "292929": "282030" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-smart-cosplay.json b/public/images/pokemon/variant/25-smart-cosplay.json new file mode 100644 index 00000000000..4ba98883f16 --- /dev/null +++ b/public/images/pokemon/variant/25-smart-cosplay.json @@ -0,0 +1,42 @@ +{ + "1": { + "212121": "30263b", + "b7a599": "bab699", + "60b553": "76a848", + "366635": "3e5b2f", + "e35252": "d16b9a", + "c52119": "ad4e76", + "292929": "272b2b", + "9c5200": "315c75", + "f7e652": "a3d1a8", + "95635b": "91685f", + "171717": "1e1526", + "ba2525": "993f70", + "e65a42": "cf6182", + "54545c": "55555e", + "52525a": "4f454c", + "fffdea": "f8ffe3", + "f7bd21": "79b5a5", + "5f3434": "573b38" + }, + "2": { + "212121": "d8805b", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "366635": "ab5130", + "e35252": "3a3f5e", + "c52119": "ebc67c", + "292929": "202937", + "9c5200": "23345e", + "f7e652": "577b98", + "95635b": "a09ea3", + "171717": "a45233", + "ba2525": "2b2b45", + "e65a42": "eedd9c", + "54545c": "45525c", + "52525a": "f1b571", + "fffdea": "f2f0df", + "f7bd21": "445f8a", + "5f3434": "666060" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25-tough-cosplay.json b/public/images/pokemon/variant/25-tough-cosplay.json new file mode 100644 index 00000000000..620ac882643 --- /dev/null +++ b/public/images/pokemon/variant/25-tough-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "bf3638", + "303030": "30263b", + "b8282b": "753652", + "8d2b1d": "8e2525", + "424242": "443e6c", + "c52119": "ad4e76", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "db4a37": "ad4c60", + "e65a42": "cf6182", + "9c5200": "315c75", + "db5b42": "cf6a59", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "f7e652": "a3d1a8" + }, + "2": { + "e37511": "644794", + "bf2629": "8e6fa1", + "f8ffe3": "e8e3e4", + "303030": "d8805b", + "b8282b": "6a253f", + "8d2b1d": "242866", + "424242": "3f4246", + "c52119": "e8be68", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "db4a37": "b95b6e", + "e65a42": "edda8c", + "9c5200": "23345e", + "db5b42": "624780", + "52525a": "f1b571", + "4d4d4d": "2b3340", + "272b2b": "162231", + "cecab9": "cfc0c3", + "f7e652": "577b98" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/25.json b/public/images/pokemon/variant/25.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/25.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/26.json b/public/images/pokemon/variant/26.json new file mode 100644 index 00000000000..c078c38570f --- /dev/null +++ b/public/images/pokemon/variant/26.json @@ -0,0 +1,36 @@ +{ + "1": { + "ffefd6": "c8d4ba", + "bd1908": "ad4e76", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "8d5911": "983e50", + "734231": "6e2f33", + "63636b": "4f454c", + "de7b31": "539190", + "f7ad29": "76a68b" + }, + "2": { + "ffefd6": "cfc4b5", + "542127": "905331", + "bd1908": "a44c5d", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "8d5911": "dea96e", + "734231": "bd8447", + "de7b31": "4d6f98", + "f7ad29": "6385ab", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/276.json b/public/images/pokemon/variant/276.json new file mode 100644 index 00000000000..d7c6c1268ec --- /dev/null +++ b/public/images/pokemon/variant/276.json @@ -0,0 +1,32 @@ +{ + "1": { + "bdbdce": "26523c", + "ffffff": "3c6a3d", + "efbd63": "e7a562", + "524a29": "4b210d", + "bdbdcd": "b5b5d5", + "a57331": "784524", + "212952": "12223d", + "3a3a31": "3e3e3e", + "314a7b": "1a385a", + "e69410": "bc7532", + "943a52": "ad8634", + "5a6b9c": "2a596b", + "ce5273": "cebf49" + }, + "2": { + "bdbdce": "453f63", + "ffffff": "635d81", + "efbd63": "89787c", + "524a29": "381f2c", + "bdbdcd": "b5b5d5", + "a57331": "4a323a", + "212952": "191222", + "3a3a31": "442c34", + "314a7b": "282037", + "e69410": "63414f", + "943a52": "8ec08b", + "5a6b9c": "3c2f48", + "ce5273": "bcd59d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/277.json b/public/images/pokemon/variant/277.json new file mode 100644 index 00000000000..84d689cab9a --- /dev/null +++ b/public/images/pokemon/variant/277.json @@ -0,0 +1,34 @@ +{ + "1": { + "dea531": "bc7532", + "425a7b": "2a596b", + "ffffff": "3c6a3d", + "b5b5d6": "26523c", + "9c3152": "ad8634", + "945a10": "784524", + "5a5a5a": "b58251", + "63213a": "603c1d", + "c55a73": "cebf49", + "31313a": "89572a", + "e6b563": "e7a562", + "524221": "4b210d", + "292952": "12223d", + "294263": "1a385a" + }, + "2": { + "dea531": "63414f", + "425a7b": "3c2f48", + "ffffff": "635d81", + "b5b5d6": "453f63", + "9c3152": "8ec08b", + "945a10": "4a323a", + "5a5a5a": "5d454d", + "63213a": "5d9469", + "c55a73": "bcd59d", + "31313a": "442c34", + "e6b563": "89787c", + "524221": "381f2c", + "292952": "191222", + "294263": "282037" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/359-mega.json b/public/images/pokemon/variant/359-mega.json new file mode 100644 index 00000000000..3e76a8e6ee6 --- /dev/null +++ b/public/images/pokemon/variant/359-mega.json @@ -0,0 +1,30 @@ +{ + "1": { + "273535": "2b3266", + "7b2931": "c9824b", + "414a6a": "421e4a", + "b4b4d5": "458196", + "cd2920": "f7c26d", + "293939": "27122b", + "fdfdfd": "61a8ab", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "8b8bac": "3b6987", + "626283": "2a3163" + }, + "2": { + "273535": "420918", + "7b2931": "0f4391", + "414a6a": "b39279", + "b4b4d5": "752f40", + "cd2920": "2a96ce", + "293939": "996e5f", + "fdfdfd": "9e363b", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "8b8bac": "59213b", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/359.json b/public/images/pokemon/variant/359.json new file mode 100644 index 00000000000..936b3567c67 --- /dev/null +++ b/public/images/pokemon/variant/359.json @@ -0,0 +1,34 @@ +{ + "1": { + "424a6b": "421e4a", + "293a3a": "27122b", + "ce2921": "f7c26d", + "7b2931": "c9824b", + "ff7b73": "fff291", + "737bad": "874267", + "d6deef": "589aa6", + "283838": "101f30", + "525a7b": "612b54", + "b5b5d6": "458196", + "636384": "2a3163", + "7179ab": "2b3266", + "ffffff": "61a8ab", + "8c8cad": "3b6987" + }, + "2": { + "424a6b": "b39279", + "293a3a": "996e5f", + "ce2921": "2a96ce", + "7b2931": "0f4391", + "ff7b73": "96eeff", + "737bad": "f5f1cb", + "d6deef": "8f2f41", + "283838": "31101f", + "525a7b": "e0c79f", + "b5b5d6": "752f40", + "636384": "42122d", + "7179ab": "7d1d36", + "ffffff": "9e363b", + "8c8cad": "59213b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/377.json b/public/images/pokemon/variant/377.json new file mode 100644 index 00000000000..84f8851b9a8 --- /dev/null +++ b/public/images/pokemon/variant/377.json @@ -0,0 +1,28 @@ +{ + "1": { + "b54200": "13512f", + "efad6b": "aac669", + "948c73": "2e4e7b", + "cec5ad": "4d8ba8", + "bd633a": "22773f", + "ef733a": "72b645", + "ef843a": "56963a", + "524a29": "182238", + "e6dead": "659db5", + "b5ad94": "3d6d8d", + "efe6de": "84c7ca" + }, + "2": { + "b54200": "3d0933", + "efad6b": "a54c5e", + "948c73": "262847", + "cec5ad": "303353", + "bd633a": "561934", + "ef733a": "c1271f", + "ef843a": "722a41", + "524a29": "161129", + "e6dead": "383e6a", + "b5ad94": "394170", + "efe6de": "4d5784" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/378.json b/public/images/pokemon/variant/378.json new file mode 100644 index 00000000000..c7d2816a024 --- /dev/null +++ b/public/images/pokemon/variant/378.json @@ -0,0 +1,38 @@ +{ + "0": { + "ffffff": "d7b6f1", + "293a7b": "101238", + "9cceff": "6f66a7", + "ceb521": "ca5846", + "6bb5d6": "414184", + "ffffad": "ffd6a7", + "ffe600": "e58b64", + "5a84ad": "282e64", + "3a6b8c": "191d4c", + "bdefff": "9983c4" + }, + "1": { + "6bb5d6": "bf344a", + "bdefff": "ffb88d", + "293a7b": "400b1c", + "ffe600": "7a5d98", + "5a84ad": "981d43", + "ffffff": "fff7d3", + "ffffad": "c39bd0", + "ceb521": "43356c", + "3a6b8c": "64132c", + "9cceff": "eb5d56" + }, + "2": { + "6bb5d6": "323232", + "bdefff": "5b5b5b", + "293a7b": "100f17", + "ffe600": "73e6f6", + "5a84ad": "212121", + "ffffff": "8c8c8c", + "ffffad": "e5fffd", + "ceb521": "319ce2", + "3a6b8c": "14131a", + "9cceff": "424242" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/379.json b/public/images/pokemon/variant/379.json new file mode 100644 index 00000000000..926acc7d987 --- /dev/null +++ b/public/images/pokemon/variant/379.json @@ -0,0 +1,30 @@ +{ + "1": { + "4a5a5a": "34366f", + "ff4242": "5cbed3", + "3a4252": "292960", + "ff9ca5": "d2d3c9", + "d6ced6": "cc9c65", + "b5adad": "a66f52", + "ffffff": "fff3aa", + "dedede": "f0d185", + "848c84": "4c5c91", + "4a4a4a": "533329", + "84847b": "80503b", + "bdbdbd": "7a9ee5" + }, + "2": { + "4a5a5a": "df8533", + "ff4242": "1e1e1e", + "3a4252": "e29631", + "ff9ca5": "a0a0a0", + "d6ced6": "cd5521", + "b5adad": "ad2d1e", + "ffffff": "ffb056", + "dedede": "e87537", + "848c84": "ffcd49", + "4a4a4a": "521328", + "84847b": "81222b", + "bdbdbd": "ffff7e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/39.json b/public/images/pokemon/variant/39.json new file mode 100644 index 00000000000..c72887bdf9d --- /dev/null +++ b/public/images/pokemon/variant/39.json @@ -0,0 +1,26 @@ +{ + "1": { + "d63a31": "f18fc4", + "a53100": "6f305b", + "ffada5": "c5ebd5", + "e67384": "81c2b8", + "10b5ef": "a17ed9", + "ffcec5": "e5ffec", + "104a8c": "393178", + "1973c5": "604ea1", + "a51021": "3a6472", + "6b5263": "153427", + "ceefff": "d9d3e3" + }, + "2": { + "ffada5": "f5e884", + "e67384": "f5c45b", + "10b5ef": "d14b4b", + "ffcec5": "fff9bf", + "104a8c": "8a2f2f", + "1973c5": "c45c54", + "a51021": "9c5200", + "6b5263": "737454", + "ceefff": "ffe9ed" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/390.json b/public/images/pokemon/variant/390.json new file mode 100644 index 00000000000..ba0119974de --- /dev/null +++ b/public/images/pokemon/variant/390.json @@ -0,0 +1,34 @@ +{ + "1": { + "e63131": "1db978", + "b56b29": "64464d", + "9c3131": "174c48", + "947308": "a86256", + "7b4210": "382029", + "ef6b6b": "5db95b", + "ffd631": "eafe67", + "f06e6e": "81dc3f", + "ffe6ad": "edc6a4", + "7e4410": "994943", + "ffad52": "a88d8d", + "e63a42": "2d8766", + "de8400": "876766", + "deb552": "cc9176" + }, + "2": { + "e63131": "b5b0f3", + "b56b29": "293b69", + "9c3131": "422e6f", + "947308": "818596", + "7b4210": "171f46", + "ef6b6b": "cb96e5", + "ffd631": "f3f8fe", + "f06e6e": "cbcfff", + "ffe6ad": "d3d5e0", + "7e4410": "626678", + "ffad52": "6995b5", + "e63a42": "8457b0", + "de8400": "3e5f8a", + "deb552": "a5a9b8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/391.json b/public/images/pokemon/variant/391.json new file mode 100644 index 00000000000..c3503dec40a --- /dev/null +++ b/public/images/pokemon/variant/391.json @@ -0,0 +1,40 @@ +{ + "1": { + "8c7342": "994943", + "dfe5e7": "dac99d", + "c59463": "cc9176", + "cf3419": "2d8766", + "9c5219": "64464d", + "ffffff": "faf7d4", + "735a10": "a86256", + "cf2b19": "c9537e", + "ffce47": "f69044", + "efa542": "cd5528", + "ffce42": "eafe67", + "1052b5": "751a2f", + "1073de": "cc3140", + "6b3a08": "382029", + "d68c29": "876766", + "ce4219": "1db978", + "efce94": "edc6a4" + }, + "2": { + "8c7342": "818596", + "dfe5e7": "dca15d", + "c59463": "a5a9b8", + "cf3419": "8457b0", + "9c5219": "293b69", + "ffffff": "ffe175", + "735a10": "626678", + "cf2b19": "552b94", + "ffce47": "e8fdff", + "efa542": "b0cbd4", + "ffce42": "f3f8fe", + "1052b5": "e09f2f", + "1073de": "ffd745", + "6b3a08": "171f46", + "d68c29": "3e5f8a", + "ce4219": "b5b0f3", + "efce94": "d3d5e0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/392.json b/public/images/pokemon/variant/392.json new file mode 100644 index 00000000000..78a9777736a --- /dev/null +++ b/public/images/pokemon/variant/392.json @@ -0,0 +1,54 @@ +{ + "1": { + "000000": "ffffff", + "a96442": "1a8251", + "a56240": "10916d", + "e68c5a": "876766", + "6b3a10": "382029", + "cfa423": "c9601e", + "bdc5de": "dac99d", + "a56342": "64464d", + "c9a022": "b7e350", + "737384": "9f8876", + "e63a42": "1db978", + "c59c21": "cd5528", + "875d08": "b03813", + "ffde4a": "e8a82a", + "ffde52": "f69044", + "e6353e": "2d8766", + "19427b": "581225", + "f88c49": "5db95b", + "ffffff": "faf7d4", + "845a08": "9b2719", + "3a73a5": "972733", + "f78c4a": "81dc3f", + "ffde4d": "eafe67", + "842931": "174c48" + }, + "2": { + "000000": "ffffff", + "a96442": "4c2985", + "a56240": "9595db", + "e68c5a": "3e5f8a", + "6b3a10": "171f46", + "cfa423": "c8af9b", + "bdc5de": "dca15d", + "a56342": "293b69", + "c9a022": "cbd0e3", + "737384": "a15a34", + "e63a42": "b5b0f3", + "c59c21": "a0c0cd", + "875d08": "8a5954", + "ffde4a": "fff8e5", + "ffde52": "e8fdff", + "e6353e": "8457b0", + "19427b": "4d5196", + "f88c49": "cb96e5", + "ffffff": "ffe175", + "845a08": "617995", + "3a73a5": "9c96e2", + "f78c4a": "cbcfff", + "ffde4d": "f3f8fe", + "842931": "422e6f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/40.json b/public/images/pokemon/variant/40.json new file mode 100644 index 00000000000..9ec866694ca --- /dev/null +++ b/public/images/pokemon/variant/40.json @@ -0,0 +1,27 @@ +{ + "1": { + "737373": "1f2e3b", + "ffb3db": "f18fc4", + "9c6b21": "153139", + "8c4242": "3a6472", + "52a58c": "a17ed9", + "f77b94": "81c2b8", + "734219": "214f4f", + "ffadbd": "c5ebd5", + "ce6b63": "82b8a9", + "215a63": "393178" + }, + "2": { + "737373": "3b1f24", + "e6dee6": "bc4e24", + "9c6b21": "612719", + "8c4242": "9c5200", + "52a58c": "c45c54", + "f77b94": "f5c45b", + "ffffff": "d07439", + "734219": "68311a", + "ffadbd": "f5e884", + "ce6b63": "e6a54c", + "215a63": "8a2f2f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/430.json b/public/images/pokemon/variant/430.json new file mode 100644 index 00000000000..e6771e34524 --- /dev/null +++ b/public/images/pokemon/variant/430.json @@ -0,0 +1,40 @@ +{ + "1": { + "31313a": "1d1d2b", + "efeff7": "b9382d", + "8c313a": "b3986b", + "5a5a3a": "1e1e2c", + "545454": "3c3b4d", + "29213a": "271b1a", + "3a5a9c": "694c30", + "8c3039": "9e2933", + "de5057": "bd392d", + "a3a3b5": "60606c", + "a5a5b5": "7a1e21", + "de525a": "f3e3b3", + "4a2121": "755237", + "ad943a": "3f3e50", + "3a3a5a": "422e26", + "525252": "380514", + "f7de3a": "61616d" + }, + "2": { + "31313a": "521a16", + "efeff7": "975bc2", + "8c313a": "bc4b84", + "5a5a3a": "4e1915", + "545454": "87432e", + "29213a": "091e16", + "3a5a9c": "1d6e47", + "8c3039": "9e2933", + "de5057": "bd392d", + "a3a3b5": "c4743b", + "a5a5b5": "4f358e", + "de525a": "f17f9c", + "4a2121": "7b2363", + "ad943a": "85412d", + "3a3a5a": "0e4333", + "525252": "1c1754", + "f7de3a": "c2723a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/455.json b/public/images/pokemon/variant/455.json new file mode 100644 index 00000000000..1483b02ef5b --- /dev/null +++ b/public/images/pokemon/variant/455.json @@ -0,0 +1,35 @@ +{ + "1": { + "f7ce31": "7c5d53", + "c59c31": "4d3432", + "9c214a": "451e14", + "2b453d": "523b3c", + "3a5a3a": "b34a82", + "5a6342": "826660", + "8c9452": "b89d8c", + "846b31": "301e20", + "bdc57b": "efd9ba", + "422919": "300c0c", + "e62919": "775331", + "63843a": "e880ab", + "29423a": "7e3b67", + "8f9653": "e2b0bc" + }, + "2": { + "f7ce31": "518078", + "ffffff": "affffe", + "c59c31": "244a45", + "9c214a": "1e4340", + "2b453d": "151926", + "3a5a3a": "37818a", + "5a6342": "2d304e", + "8c9452": "424d6e", + "846b31": "122e2f", + "bdc57b": "6679a1", + "422919": "0d2626", + "e62919": "406b64", + "63843a": "74ddcd", + "29423a": "123247", + "8f9653": "3d909b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/486.json b/public/images/pokemon/variant/486.json new file mode 100644 index 00000000000..32082b03337 --- /dev/null +++ b/public/images/pokemon/variant/486.json @@ -0,0 +1,41 @@ +{ + "1": { + "364859": "611d2a", + "adadc5": "ca7426", + "374859": "6b76a4", + "3a4a5a": "5e1e33", + "4aa563": "e2f2ff", + "5f6d7d": "7b2a19", + "ef7b8c": "7741a1", + "b5bdc5": "0d6696", + "5ac5f7": "5f94d9", + "d6ced6": "e89b34", + "3c4d5e": "3f031d", + "ffffff": "eb8746", + "21846b": "90a7cd", + "fafafa": "ffc245", + "c59c52": "a12612", + "f7d65a": "ce5129", + "7b6321": "3d021b", + "8c94ad": "13081a" + }, + "2": { + "364859": "24293f", + "adadc5": "4f673a", + "374859": "2f1a18", + "3a4a5a": "3b1930", + "4aa563": "755648", + "5f6d7d": "374427", + "ef7b8c": "811745", + "b5bdc5": "f1c832", + "5ac5f7": "d3271a", + "d6ced6": "6e884b", + "ffffff": "a8afaf", + "21846b": "492f29", + "fafafa": "88b06f", + "c59c52": "5d717a", + "f7d65a": "8f9b9e", + "7b6321": "384751", + "8c94ad": "494922" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/501.json b/public/images/pokemon/variant/501.json new file mode 100644 index 00000000000..e70d0319842 --- /dev/null +++ b/public/images/pokemon/variant/501.json @@ -0,0 +1,33 @@ +{ + "1": { + "c59429": "ff9ef3", + "efce84": "f2d5ee", + "294252": "241e44", + "c49529": "b73891", + "215a63": "1e1a35", + "c5c5ce": "e3c2ca", + "4a6bad": "9660d1", + "21949c": "373049", + "29bdc5": "5d4a70", + "8c5a31": "af62ac", + "31426b": "4b349e", + "8a5830": "681d49" + }, + "2": { + "8c8c9c": "8f7491", + "c59429": "4e8787", + "efce84": "8abfb1", + "4a4a4a": "715b72", + "294252": "104432", + "c49529": "4e8787", + "215a63": "000000", + "c5c5ce": "ba9bc1", + "4a6bad": "589787", + "21949c": "321e1e", + "ffffff": "f5e9f4", + "29bdc5": "5e3e38", + "8c5a31": "0c4848", + "31426b": "3c706b", + "8a5830": "0c4848" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/502.json b/public/images/pokemon/variant/502.json new file mode 100644 index 00000000000..4227d277216 --- /dev/null +++ b/public/images/pokemon/variant/502.json @@ -0,0 +1,33 @@ +{ + "1": { + "7b5a10": "d877cd", + "31528c": "9d5bc9", + "4a4a4a": "20193d", + "efd68c": "f2d5ee", + "293a6b": "503e8e", + "c5525a": "b73891", + "52bdbd": "624060", + "c59429": "ff9ef3", + "733a3a": "6b1d42", + "313131": "120f33", + "315a73": "1e1624", + "218c94": "39273d", + "fffdfd": "ebb9c4" + }, + "2": { + "7b5a10": "0d5656", + "31528c": "5e3e38", + "4a4a4a": "2c3940", + "efd68c": "63c7bd", + "293a6b": "321e1e", + "c5525a": "519785", + "52bdbd": "8b7566", + "c59429": "488383", + "733a3a": "377667", + "313131": "1f2b36", + "315a73": "483026", + "218c94": "684f44", + "fffdfd": "ffffc2", + "ffffff": "ffffc2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/503.json b/public/images/pokemon/variant/503.json new file mode 100644 index 00000000000..16447be5cca --- /dev/null +++ b/public/images/pokemon/variant/503.json @@ -0,0 +1,37 @@ +{ + "1": { + "84a5a5": "563785", + "4a4a4a": "5e283e", + "215a9c": "4c234a", + "c5c5ce": "b57ea1", + "8aa3a3": "a05982", + "d65263": "b73891", + "8da8a8": "a58b90", + "7b6342": "975fad", + "fffeff": "ebb9c4", + "213a63": "28142c", + "4a4a4c": "6b3e51", + "d6c57b": "f2d5ee", + "5a7373": "332a59", + "ad945a": "db87d1" + }, + "2": { + "84a5a5": "41857b", + "4a4a4a": "c2700d", + "215a9c": "5e3e38", + "c5c5ce": "efa838", + "8aa3a3": "d3a51f", + "d65263": "41857b", + "8da8a8": "bdbdbd", + "7b6342": "0d5656", + "fdfdff": "ffffff", + "fffeff": "f9df58", + "213a63": "321e1e", + "4a4a4c": "c2700d", + "d6c57b": "63c7bd", + "5a7373": "2a5c57", + "9ab2af": "2a5c57", + "494644": "1a5451", + "ad945a": "488383" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/527.json b/public/images/pokemon/variant/527.json new file mode 100644 index 00000000000..460a954874f --- /dev/null +++ b/public/images/pokemon/variant/527.json @@ -0,0 +1,28 @@ +{ + "1": { + "191921": "24224f", + "424a5a": "866ca1", + "6b94ad": "6e315e", + "f7adb5": "8ffff9", + "73adc5": "853d6f", + "292931": "55457a", + "ce2942": "a3ffed", + "8c4a52": "4874b8", + "84193a": "5fd4d0", + "c56b7b": "6bc7e8", + "4a6b7b": "361538", + "addef7": "914a6e" + }, + "2": { + "191921": "45234d", + "424a5a": "bf3f75", + "6b94ad": "db843d", + "f7adb5": "b682e0", + "73adc5": "e8b04f", + "292931": "8c2961", + "8c4a52": "393582", + "c56b7b": "7b5ebf", + "4a6b7b": "994d22", + "addef7": "f7e05c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/528.json b/public/images/pokemon/variant/528.json new file mode 100644 index 00000000000..86dd66a4344 --- /dev/null +++ b/public/images/pokemon/variant/528.json @@ -0,0 +1,38 @@ +{ + "1": { + "bdbdce": "76debd", + "313131": "55457a", + "ceefff": "a6ffd7", + "425aa5": "451b41", + "4a4a52": "866ca1", + "2b2b2b": "2b4182", + "2e2e2e": "2f1236", + "f7a59c": "8ffff9", + "317b94": "6e315e", + "54546d": "582253", + "de8c84": "6bc7e8", + "19a5ce": "914a6e", + "944a4a": "4874b8", + "494950": "3b53a3", + "6b7b84": "439ca1", + "363636": "2e6f7a" + }, + "2": { + "bdbdce": "db843d", + "313131": "701c4c", + "ceefff": "f7e05c", + "425aa5": "d6a178", + "4a4a52": "bf3f75", + "2b2b2b": "1d1c4f", + "2e2e2e": "a6705e", + "f7a59c": "b682e0", + "317b94": "e0b49a", + "54546d": "a87354", + "de8c84": "7b5ebf", + "19a5ce": "f9fae3", + "944a4a": "393582", + "494950": "1b1f4d", + "6b7b84": "994d22", + "363636": "6b2314" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/587.json b/public/images/pokemon/variant/587.json new file mode 100644 index 00000000000..34831752444 --- /dev/null +++ b/public/images/pokemon/variant/587.json @@ -0,0 +1,33 @@ +{ + "1": { + "d6a531": "a84223", + "fffbf6": "8bd5dc", + "917d53": "16223d", + "ffd600": "d55b19", + "313131": "1d352a", + "212121": "091814", + "b58c08": "681c0e", + "cec5ad": "5a9fbf", + "6b5a31": "3b1c1b", + "a09478": "406da4", + "414141": "2b5d3f", + "434141": "2b5d3f" + }, + "2": { + "c56b63": "5046a7", + "d6a531": "6597cd", + "fffbf6": "c4658e", + "917d53": "321832", + "ffd600": "8bcaee", + "943a42": "462060", + "313131": "372a5b", + "212121": "15132f", + "e69484": "8166c6", + "b58c08": "4879af", + "cec5ad": "9b4072", + "6b5a31": "28273d", + "a09478": "7b3760", + "414141": "5e3a86", + "434141": "5e3a86" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/588.json b/public/images/pokemon/variant/588.json new file mode 100644 index 00000000000..86aa0e118f7 --- /dev/null +++ b/public/images/pokemon/variant/588.json @@ -0,0 +1,33 @@ +{ + "1": { + "213a5a": "2f185b", + "316bff": "8150a7", + "73d6ff": "e8aa48", + "313131": "38131d", + "736321": "8188b0", + "c55200": "b9262c", + "528cff": "c682d6", + "b59c19": "b8c5e5", + "4a4a4a": "64242d", + "000000": "ffffff", + "3a5284": "492c72", + "ffde19": "eef5ff", + "4294ad": "cd6a31" + }, + "2": { + "213a5a": "44446f", + "316bff": "d2cdeb", + "73d6ff": "ffe28d", + "313131": "182138", + "736321": "6f1b34", + "c55200": "ffe8c3", + "528cff": "f9f3ff", + "ce5263": "df6b99", + "b59c19": "a42641", + "4a4a4a": "28334f", + "000000": "ffffff", + "3a5284": "7777a7", + "ffde19": "d0413f", + "4294ad": "d9a35c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/589.json b/public/images/pokemon/variant/589.json new file mode 100644 index 00000000000..486088d13d3 --- /dev/null +++ b/public/images/pokemon/variant/589.json @@ -0,0 +1,32 @@ +{ + "1": { + "c5c5c5": "f9c347", + "ef2952": "eb8343", + "e65a10": "614593", + "bd2152": "c44126", + "736321": "7b8bb3", + "840808": "931119", + "000000": "ffffff", + "6b6b6b": "b34516", + "bd9c19": "b8c5e5", + "195abd": "7436a4", + "94949c": "dc862d", + "ffde19": "eef5ff", + "3a424a": "69130d" + }, + "2": { + "c5c5c5": "6e8e99", + "ef2952": "f7efff", + "e65a10": "ffe8c3", + "bd2152": "beb7df", + "736321": "6f1b34", + "840808": "72709e", + "000000": "ffffff", + "6b6b6b": "293a52", + "bd9c19": "a42641", + "195abd": "4f3d33", + "94949c": "3f6372", + "ffde19": "d0413f", + "3a424a": "1b253d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/590.json b/public/images/pokemon/variant/590.json new file mode 100644 index 00000000000..d17924e966c --- /dev/null +++ b/public/images/pokemon/variant/590.json @@ -0,0 +1,30 @@ +{ + "1": { + "826b61": "348999", + "9c3a3a": "71de8c", + "846b63": "348999", + "6b4a31": "0d9999", + "684b30": "0d9999", + "422929": "0a5870", + "9c3a7b": "88af70", + "de5a52": "e6ffc1", + "d6639c": "f4ebba", + "7b3131": "49ad77", + "c5b59c": "47d1b5", + "fff7e6": "afecc6" + }, + "2": { + "826b61": "86b8cc", + "9c3a3a": "e098cd", + "846b63": "404f6b", + "6b4a31": "f2f7f9", + "684b30": "2b5caf", + "422929": "b9d9e5", + "9c3a7b": "b1c4dd", + "de5a52": "ffbfcb", + "d6639c": "f2f7f9", + "7b3131": "ce88bb", + "c5b59c": "498cd3", + "fff7e6": "6ac2e2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/591.json b/public/images/pokemon/variant/591.json new file mode 100644 index 00000000000..d0290501b39 --- /dev/null +++ b/public/images/pokemon/variant/591.json @@ -0,0 +1,42 @@ +{ + "1": { + "423231": "0c7588", + "533f3a": "094164", + "604740": "0b7f79", + "6b314a": "49ad77", + "423131": "0a5870", + "8c735a": "348999", + "cec5c5": "afecc6", + "634b42": "094164", + "9c9484": "47d1b5", + "423331": "0c7588", + "634c42": "348999", + "291919": "094164", + "ad3163": "71de8c", + "de8ca5": "d8cfa0", + "634a42": "0d9999", + "6b314c": "749660", + "ffadce": "f4ebba", + "de528c": "e6ffc1" + }, + "2": { + "423231": "404f6b", + "533f3a": "223656", + "604740": "3b6aa0", + "6b314a": "ad629a", + "423131": "9bb6c1", + "8c735a": "2b5caf", + "cec5c5": "6ac2e2", + "634b42": "223656", + "9c9484": "56a1e2", + "423331": "9bb6c1", + "634c42": "3f7dc7", + "291919": "5e718e", + "ad3163": "e098cd", + "de8ca5": "b1c4dd", + "634a42": "f2f7f9", + "6b314c": "65788e", + "ffadce": "f4f8f9", + "de528c": "ffbfcb" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/616.json b/public/images/pokemon/variant/616.json new file mode 100644 index 00000000000..184360b3734 --- /dev/null +++ b/public/images/pokemon/variant/616.json @@ -0,0 +1,30 @@ +{ + "1": { + "3a8442": "4e3671", + "42bd31": "775998", + "313131": "491722", + "c5c5d6": "f9c347", + "9494ad": "dc862d", + "ff4a7b": "6ba779", + "630021": "204b4f", + "b5214a": "346c65", + "de3163": "4a8474", + "000000": "ffffff", + "29315a": "69130d", + "5a5a7b": "b34516" + }, + "2": { + "3a8442": "dfa75c", + "42bd31": "fff07e", + "313131": "171e2f", + "c5c5d6": "6e8e99", + "9494ad": "3f6372", + "ff4a7b": "8cb0d6", + "630021": "2e3469", + "b5214a": "4f62a4", + "de3163": "6b8bbf", + "000000": "ffffff", + "29315a": "1b253d", + "5a5a7b": "293a52" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/617.json b/public/images/pokemon/variant/617.json new file mode 100644 index 00000000000..7c2951b5571 --- /dev/null +++ b/public/images/pokemon/variant/617.json @@ -0,0 +1,30 @@ +{ + "1": { + "ffffff": "fff47e", + "a5846b": "5a6675", + "42b55a": "4e3671", + "c53a6b": "427b6b", + "bdbdce": "df9847", + "527b42": "362658", + "732931": "214c49", + "ff4a7b": "6ba779", + "6b84c5": "eef5ff", + "3a2919": "192638", + "000000": "ffffff", + "293a6b": "69719e", + "5a6384": "b8c5e5" + }, + "2": { + "a5846b": "637974", + "42b55a": "415c69", + "c53a6b": "dcaa47", + "527b42": "1d2a3b", + "732931": "8a5727", + "ff4a7b": "ffee72", + "6b84c5": "b43d40", + "3a2919": "2a2235", + "000000": "ffffff", + "293a6b": "461b2e", + "5a6384": "7b2c3d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/621.json b/public/images/pokemon/variant/621.json new file mode 100644 index 00000000000..1c347dcadc8 --- /dev/null +++ b/public/images/pokemon/variant/621.json @@ -0,0 +1,28 @@ +{ + "1": { + "d6bd6b": "ac8b5e", + "940042": "1a2248", + "635231": "605127", + "104a8c": "7e231b", + "8c7b5a": "73654b", + "efc500": "5c7886", + "103163": "601111", + "521031": "0f1330", + "d60042": "26335d", + "316bad": "a13b2c", + "d65273": "be5b5e" + }, + "2": { + "d6bd6b": "ffbc30", + "940042": "177297", + "635231": "be6e18", + "104a8c": "c9bb9a", + "8c7b5a": "da8921", + "efc500": "ffd437", + "103163": "a0896b", + "521031": "0f4973", + "d60042": "24aec0", + "316bad": "e3ddbd", + "d65273": "c583a5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/6503.json b/public/images/pokemon/variant/6503.json new file mode 100644 index 00000000000..c6cc21b45db --- /dev/null +++ b/public/images/pokemon/variant/6503.json @@ -0,0 +1,34 @@ +{ + "1": { + "282f62": "f7d9de", + "c4c5cf": "e3c2ca", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "6b415b", + "494a48": "3d2439", + "1d3962": "28142c", + "d75063": "b73891", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "181531": "a26579", + "6b1c34": "8f3396", + "597471": "332a59", + "8da8a8": "a58b90" + }, + "2": { + "282f62": "efdfee", + "c4c5cf": "232d2e", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "181f20", + "faf9f9": "2c3940", + "494a48": "0b0f18", + "1d3962": "321e1e", + "d75063": "8f65d8", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "181531": "715b72", + "6b1c34": "6d9d9a", + "597471": "2a5c57" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/656.json b/public/images/pokemon/variant/656.json new file mode 100644 index 00000000000..68743a4c9f1 --- /dev/null +++ b/public/images/pokemon/variant/656.json @@ -0,0 +1,32 @@ +{ + "1": { + "838394": "4d7dc5", + "62ace6": "8363af", + "7bcdff": "9c75c2", + "ffec8c": "ddfff9", + "a1a1c4": "7ab7ec", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "37408c", + "fdfdfd": "b1e5ff", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "396a83": "362864", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "62ace6": "c44848", + "7bcdff": "dd6155", + "ffec8c": "ddfff9", + "a1a1c4": "f7c685", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "198158", + "fdfdfd": "fff4bd", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "396a83": "5c0d33", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/657.json b/public/images/pokemon/variant/657.json new file mode 100644 index 00000000000..773b4d2efc1 --- /dev/null +++ b/public/images/pokemon/variant/657.json @@ -0,0 +1,32 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "efc653": "abd7db", + "737373": "0f3f82", + "0b566a": "281f52", + "ffec72": "c9fff5", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "009dd5": "61255e", + "0b4a7a": "340f3d", + "e1a03a": "78c7c7", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "efc653": "abd7db", + "737373": "df6a50", + "0b566a": "7e1628", + "ffec72": "ddfff9", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "009dd5": "37b8ac", + "0b4a7a": "156f78", + "e1a03a": "86abbb", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/658-ash.json b/public/images/pokemon/variant/658-ash.json new file mode 100644 index 00000000000..29b5bd2560b --- /dev/null +++ b/public/images/pokemon/variant/658-ash.json @@ -0,0 +1,44 @@ +{ + "1": { + "265595": "432b6c", + "3f4447": "466698", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "4ebdd9": "41a7b0", + "bfb169": "165e78", + "bfbfbf": "8cc7d4", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "fff0a6": "271f4c", + "3e7acc": "6b4592", + "18335c": "170738", + "f2798d": "8dcfff", + "f01818": "39b88f", + "7ddeff": "7ddcd6", + "268794": "1c3e58", + "282c35": "271f4c" + }, + "2": { + "265595": "cc7251", + "3f4447": "466698", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "4ebdd9": "2f6e74", + "bfb169": "431022", + "bfbfbf": "8cc7d4", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "fff0a6": "4d2637", + "3e7acc": "ecbb7a", + "18335c": "9f2727", + "f2798d": "5eb4a9", + "f01818": "ffe88d", + "7ddeff": "46988d", + "268794": "1c3e58", + "282c35": "4d2637" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/658.json b/public/images/pokemon/variant/658.json new file mode 100644 index 00000000000..25a6dad359d --- /dev/null +++ b/public/images/pokemon/variant/658.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "66d9ff": "7ddcd6", + "3d61cc": "6b4592", + "fff0a6": "208698", + "c92e2e": "73c5ff", + "937f69": "406695", + "c2c1bc": "89b0d7", + "f2798d": "8dcfff", + "f7f7f7": "d8ffff", + "2e4999": "432b6c", + "bfb169": "165e78", + "803340": "0e3e81", + "1b2a59": "170738" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "66d9ff": "48968c", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "c92e2e": "63bf9b", + "937f69": "466698", + "c2c1bc": "8cc7d4", + "f2798d": "5eb4a9", + "f7f7f7": "d7eff4", + "2e4999": "cc7251", + "bfb169": "431022", + "803340": "152a5c", + "1b2a59": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-dandy.json b/public/images/pokemon/variant/676-dandy.json new file mode 100644 index 00000000000..ac18c8446d9 --- /dev/null +++ b/public/images/pokemon/variant/676-dandy.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "30552b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "9c9f94": "42090e", + "4b4b46": "2b040f", + "508a3c": "aa9999", + "816e64": "a6afb3", + "6eb92b": "eddddd", + "453434": "313439" + }, + "2": { + "594d46": "9c7aca", + "30552b": "6a102e", + "b8bcaf": "ce9ede", + "f1f2ee": "e6c3f8", + "376277": "314173", + "fe3c31": "8362b4", + "9c9f94": "ad76bc", + "4b4b46": "6b3f77", + "508a3c": "ac254b", + "a83c31": "473085", + "816e64": "ae95dc", + "6eb92b": "e44a62", + "453434": "593173" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-debutante.json b/public/images/pokemon/variant/676-debutante.json new file mode 100644 index 00000000000..bf3d0dfe212 --- /dev/null +++ b/public/images/pokemon/variant/676-debutante.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "f8f9f7": "8a1d1d", + "dfb76a": "aa9999", + "4b4b46": "2b040f", + "bcc0b3": "5e0f16", + "453434": "313439", + "816e64": "a6afb3", + "ac6d40": "423839", + "fbf588": "e3d6d6" + }, + "2": { + "594d46": "48a7d0", + "376277": "717171", + "fe3c31": "762ea8", + "9c9f94": "122a39", + "f8f9f7": "0e728e", + "dfb76a": "c6a65c", + "4b4b46": "021a2f", + "bcc0b3": "0b4b68", + "453434": "122a39", + "a83c31": "521073", + "816e64": "74ccec", + "ac6d40": "684d24", + "fbf588": "ffe998" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-diamond.json b/public/images/pokemon/variant/676-diamond.json new file mode 100644 index 00000000000..72e19d6a853 --- /dev/null +++ b/public/images/pokemon/variant/676-diamond.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "aa3e2b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "645e55": "2b040f", + "d95b37": "aa9999", + "e68a4d": "eddddd", + "453434": "313439", + "816e64": "a6afb3" + }, + "2": { + "594d46": "bd9462", + "aa3e2b": "642c0a", + "b8bcaf": "319c6a", + "f1f2ee": "6abd81", + "376277": "c56e34", + "fe3c31": "b37e47", + "645e55": "1b684b", + "d95b37": "935927", + "e68a4d": "b37e47", + "453434": "6c4b2d", + "a83c31": "642c0a", + "816e64": "eed59c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-heart.json b/public/images/pokemon/variant/676-heart.json new file mode 100644 index 00000000000..895b5b49e99 --- /dev/null +++ b/public/images/pokemon/variant/676-heart.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "f18598": "48474c", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "e0546c": "2a2a2f", + "376277": "4f8fe3", + "645e55": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "a73f4f": "19181f" + }, + "2": { + "594d46": "aca49c", + "f18598": "5f5953", + "b8bcaf": "bfc7e8", + "f1f2ee": "e4eafc", + "e0546c": "4c413c", + "376277": "1b1c21", + "fe3c31": "9475de", + "645e55": "7a81b7", + "453434": "837373", + "a83c31": "7249b7", + "816e64": "dadace", + "a73f4f": "2c2320" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-kabuki.json b/public/images/pokemon/variant/676-kabuki.json new file mode 100644 index 00000000000..9d57fc830be --- /dev/null +++ b/public/images/pokemon/variant/676-kabuki.json @@ -0,0 +1,36 @@ +{ + "1": { + "816e64": "a6afb3", + "8f2121": "19181f", + "b01a1a": "2a2a2f", + "d02f2e": "262629", + "594d46": "788087", + "f44b3d": "48474c", + "376277": "4f8fe3", + "68675c": "2b040f", + "453434": "313439", + "8a7d79": "a6afb3", + "9c9f94": "42090e", + "534343": "313439", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d" + }, + "2": { + "816e64": "506e7b", + "8f2121": "1b1d39", + "b01a1a": "305d9e", + "d02f2e": "48578e", + "594d46": "3e5368", + "f66559": "9890ec", + "f44b3d": "4c89d9", + "376277": "436ca1", + "68675c": "192b42", + "453434": "17242f", + "8a7d79": "425a70", + "9c9f94": "468197", + "534343": "233342", + "bcc0b3": "549ab8", + "f1f2ee": "6bcfd9", + "b32524": "8067c6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-la-reine.json b/public/images/pokemon/variant/676-la-reine.json new file mode 100644 index 00000000000..ae73038cfb2 --- /dev/null +++ b/public/images/pokemon/variant/676-la-reine.json @@ -0,0 +1,32 @@ +{ + "1": { + "816e64": "a6afb3", + "31a7bb": "aa9999", + "594d46": "788087", + "2f7387": "423839", + "453434": "313439", + "4b4b46": "2b040f", + "8a7d79": "a6afb3", + "9c9f94": "42090e", + "376277": "4f8fe3", + "56d1d8": "eddddd", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d" + }, + "2": { + "816e64": "973721", + "a83c31": "3041b7", + "31a7bb": "e3b876", + "594d46": "711e1e", + "2f7387": "8e673e", + "453434": "360608", + "4b4b46": "550b0c", + "8a7d79": "a11e24", + "9c9f94": "c63b31", + "376277": "221755", + "56d1d8": "ffec9b", + "bcc0b3": "d9533c", + "f1f2ee": "ee724b", + "fe3c31": "4b77e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-matron.json b/public/images/pokemon/variant/676-matron.json new file mode 100644 index 00000000000..8fdf48c14a8 --- /dev/null +++ b/public/images/pokemon/variant/676-matron.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "b8bcaf": "5e0f16", + "873a5b": "19181f", + "376277": "4f8fe3", + "9c9f94": "42090e", + "f8f9f7": "8a1d1d", + "d07da9": "48474c", + "5f5951": "2b040f", + "816e64": "a6afb3", + "453434": "313439", + "b95b83": "2a2a2f" + }, + "2": { + "594d46": "d0b5b5", + "b8bcaf": "d95e7e", + "873a5b": "1b447b", + "376277": "2246aa", + "fe3c31": "64edf3", + "9c9f94": "bd4d6a", + "f8f9f7": "fa8c9f", + "d07da9": "64c8f3", + "5f5951": "8a2843", + "a83c31": "45a6d0", + "816e64": "e3d6d6", + "453434": "715456", + "b95b83": "528fcc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-pharaoh.json b/public/images/pokemon/variant/676-pharaoh.json new file mode 100644 index 00000000000..cf6694aa348 --- /dev/null +++ b/public/images/pokemon/variant/676-pharaoh.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "25559c": "2a2a2f", + "217fc4": "48474c", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "9c9f94": "42090e", + "bcc0b3": "5e0f16", + "68675c": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "243a6f": "19181f" + }, + "2": { + "594d46": "1c1c30", + "25559c": "d0902d", + "217fc4": "eed552", + "f1f2ee": "5e5e75", + "376277": "5e0808", + "fe3c31": "ec4d3e", + "9c9f94": "332b48", + "bcc0b3": "3b3955", + "68675c": "17122f", + "453434": "130b1c", + "a83c31": "a11717", + "816e64": "312c42", + "243a6f": "a15317" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676-star.json b/public/images/pokemon/variant/676-star.json new file mode 100644 index 00000000000..e0b0e330676 --- /dev/null +++ b/public/images/pokemon/variant/676-star.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "645e55": "2b040f", + "b8bcaf": "5e0f16", + "3e8ebf": "2a2a2f", + "f1f2ee": "8a1d1d", + "453434": "313439", + "3a5078": "19181f", + "816e64": "a6afb3", + "7dc2e8": "48474c" + }, + "2": { + "594d46": "d7bc4d", + "376277": "647bb1", + "fe3c31": "b5e0f3", + "645e55": "848e75", + "a83c31": "6192aa", + "b8bcaf": "d6dec2", + "3e8ebf": "ac802f", + "f1f2ee": "fcfef5", + "453434": "836329", + "3a5078": "613d11", + "816e64": "f7e784", + "7dc2e8": "cdac4a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/676.json b/public/images/pokemon/variant/676.json new file mode 100644 index 00000000000..8c9199960c9 --- /dev/null +++ b/public/images/pokemon/variant/676.json @@ -0,0 +1,21 @@ +{ + "1": { + "bcbca8": "5e0f16", + "606056": "2b040f", + "8e8e7b": "42090e", + "f2f2da": "8a1d1d", + "3f6273": "4f8fe3", + "494340": "788087", + "736b67": "a6afb3" + }, + "2": { + "bcbca8": "a4624a", + "cc2929": "3a240e", + "606056": "4a281b", + "8e8e7b": "805145", + "f2f2da": "c18960", + "3f6273": "4a281b", + "494340": "e6c594", + "736b67": "ffe6ac" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/682.json b/public/images/pokemon/variant/682.json new file mode 100644 index 00000000000..03337345194 --- /dev/null +++ b/public/images/pokemon/variant/682.json @@ -0,0 +1,26 @@ +{ + "1": { + "661f1f": "cd6132", + "bf5f9f": "7c48a1", + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "f24949": "ffa24f", + "7f4d59": "20644e" + }, + "2": { + "661f1f": "daa235", + "bf5f9f": "f0ebdd", + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "a6a6a6": "503851", + "f24949": "ffe664", + "e5e5e5": "6b4767", + "737373": "422f46", + "4d4d4d": "332539", + "7f4d59": "a23812" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/683.json b/public/images/pokemon/variant/683.json new file mode 100644 index 00000000000..42abc0856ad --- /dev/null +++ b/public/images/pokemon/variant/683.json @@ -0,0 +1,32 @@ +{ + "1": { + "661f1f": "b64d29", + "cc7087": "318759", + "ff99b3": "48ab61", + "fff0a6": "fec04b", + "f24949": "ffa24f", + "6b3962": "30185d", + "e5c37e": "d6872c", + "993d80": "4f297e", + "404040": "2c283b", + "b33636": "f4863f", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "661f1f": "c78925", + "cc7087": "c3561a", + "ff99b3": "da7e29", + "fff0a6": "6d8719", + "a6a6a6": "503851", + "f24949": "ffe664", + "6b3962": "b89477", + "e5c37e": "376d11", + "993d80": "d2bfa1", + "e5e5e5": "6b4767", + "404040": "2a2234", + "b33636": "f0c150", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/684.json b/public/images/pokemon/variant/684.json new file mode 100644 index 00000000000..df4240c57d6 --- /dev/null +++ b/public/images/pokemon/variant/684.json @@ -0,0 +1,24 @@ +{ + "1": { + "805963": "2d0c42", + "661a2d": "205025", + "e53964": "689b52", + "ffccd9": "814db1", + "f8f8f8": "caff90", + "cc99a6": "613b84", + "fff2f2": "f39f62", + "7b5760": "b13924", + "ccadad": "df6b40" + }, + "2": { + "805963": "679baa", + "661a2d": "26061b", + "e53964": "612747", + "ffccd9": "cbf6da", + "f8f8f8": "e4819d", + "cc99a6": "93d6ce", + "fff2f2": "746998", + "7b5760": "3c2f51", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/685.json b/public/images/pokemon/variant/685.json new file mode 100644 index 00000000000..99d52263178 --- /dev/null +++ b/public/images/pokemon/variant/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "7b5760": "b13924", + "a62949": "26592b", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "805963": "2d0c42" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "7b5760": "3c2f51", + "a62949": "441838", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "805963": "679baa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/688.json b/public/images/pokemon/variant/688.json new file mode 100644 index 00000000000..e5749f6bb3f --- /dev/null +++ b/public/images/pokemon/variant/688.json @@ -0,0 +1,33 @@ +{ + "1": { + "5890b0": "a9582e", + "385860": "70240f", + "372e27": "220a56", + "6b503b": "373295", + "d0d0d0": "d3bc8c", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "101010": "37160a", + "b7653f": "459aac", + "fcffff": "e8e5c6", + "808080": "7c582e", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "5890b0": "4b0038", + "385860": "2c052a", + "372e27": "1e1324", + "6b503b": "ba9fba", + "d0d0d0": "7eac4e", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "101010": "0a391b", + "b7653f": "332149", + "fcffff": "caea77", + "f8f8f8": "ffffff", + "808080": "2a5524", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/689.json b/public/images/pokemon/variant/689.json new file mode 100644 index 00000000000..cd6db09c8d2 --- /dev/null +++ b/public/images/pokemon/variant/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "cc7f70": "459aac", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "cc7f70": "332149", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/807.json b/public/images/pokemon/variant/807.json new file mode 100644 index 00000000000..bfb72f3cd42 --- /dev/null +++ b/public/images/pokemon/variant/807.json @@ -0,0 +1,28 @@ +{ + "1": { + "ef8a4e": "4f7bb6", + "484f57": "243058", + "000000": "ffffff", + "727678": "3e5277", + "2759a5": "736599", + "5bd0f2": "ebceff", + "daa936": "5a96b6", + "9d682d": "3c648d", + "f9e455": "7fc7d9", + "2394d8": "b298d8", + "31343e": "14193f" + }, + "2": { + "ef8a4e": "834b95", + "484f57": "cda4cb", + "000000": "ffffff", + "727678": "e8cae3", + "2759a5": "a4378a", + "5bd0f2": "e17197", + "daa936": "331b53", + "9d682d": "1d1044", + "f9e455": "56306f", + "2394d8": "c05192", + "31343e": "a981b1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/894.json b/public/images/pokemon/variant/894.json new file mode 100644 index 00000000000..99756eea4d5 --- /dev/null +++ b/public/images/pokemon/variant/894.json @@ -0,0 +1,28 @@ +{ + "1": { + "fffbfc": "fefaef", + "e5ee1a": "6ad7f3", + "8eacdd": "caffd1", + "7d542a": "2769aa", + "fefac7": "dffff6", + "bc8b2f": "124b78", + "fffbfb": "dffff6", + "2e3967": "357b84", + "4e7cc9": "9bf1c4", + "375395": "5fcaad", + "ff9dc2": "2c3072", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "8eacdd": "c693d8", + "7d542a": "429877", + "fefac7": "ffffff", + "bc8b2f": "2a6f5d", + "2e3967": "514199", + "4e7cc9": "b67cd6", + "375395": "815bad", + "ff9dc2": "382875", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/895.json b/public/images/pokemon/variant/895.json new file mode 100644 index 00000000000..90e3ec96f99 --- /dev/null +++ b/public/images/pokemon/variant/895.json @@ -0,0 +1,32 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "872c3c": "93372d", + "608d99": "fae5bf", + "2b3d40": "754f47", + "2261ca": "561a5b", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "242e35": "512c25", + "f27a99": "efb55a", + "76dff5": "ffe8f7", + "3f545f": "ad8473", + "139ee1": "9b407f" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "872c3c": "227843", + "608d99": "9b7ebc", + "2b3d40": "241951", + "2261ca": "640e0b", + "4b6f78": "5a4382", + "e05276": "8aea41", + "242e35": "0f0c1e", + "f27a99": "dfff75", + "76dff5": "fffcdf", + "3f545f": "3a2a67", + "139ee1": "98301c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/944.json b/public/images/pokemon/variant/944.json new file mode 100644 index 00000000000..56fc21986f7 --- /dev/null +++ b/public/images/pokemon/variant/944.json @@ -0,0 +1,42 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "ffe269", + "774d9b": "d09139", + "97859b": "3f8d59", + "afc6d8": "8056a7", + "efeee1": "88eeab", + "869fad": "5e4090", + "918772": "1c9b8d", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "6974ad", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "97859b": "5582a4", + "afc6d8": "c23f4f", + "efeee1": "e2f3ff", + "869fad": "902a4b", + "918772": "6777aa", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/945.json b/public/images/pokemon/variant/945.json new file mode 100644 index 00000000000..e22743030f9 --- /dev/null +++ b/public/images/pokemon/variant/945.json @@ -0,0 +1,53 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "ebe4e2": "ade273", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "584698": "18153d", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "8ac2a2": "1a355d", + "d73875": "29ad89", + "e0ebf1": "7ddfee", + "2481b0": "d09139", + "4b616b": "473869", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375", + "cedaaa": "2f5b7b" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "ebe4e2": "c23f4f", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "584698": "1f1e43", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "8ac2a2": "8397c4", + "7c6a84": "965b6f", + "d73875": "68adca", + "2481b0": "2c2c46", + "4b616b": "8a2029", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa", + "cedaaa": "bad4e8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json index 60ef635b862..11f8e9cb7ec 100644 --- a/public/images/pokemon/variant/_masterlist.json +++ b/public/images/pokemon/variant/_masterlist.json @@ -1,11113 +1,2474 @@ { - "1": [ - 0, - 1, - 1 - ], - "2": [ - 0, - 2, - 1 - ], - "3-gigantamax": [ - 0, - 1, - 1 - ], - "3-mega": [ - 0, - 2, - 2 - ], - "3": [ - 0, - 1, - 1 - ], - "4": [ - 0, - 1, - 1 - ], - "5": [ - 0, - 1, - 1 - ], - "6-mega-x": [ - 0, - 1, - 2 - ], - "6-gigantamax": [ - 0, - 1, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "6": [ - 0, - 2, - 2 - ], - "7": [ - 0, - 2, - 2 - ], - "8": [ - 0, - 2, - 2 - ], - "9-gigantamax": [ - 0, - 1, - 2 - ], - "9-mega": [ - 0, - 2, - 2 - ], - "9": [ - 0, - 2, - 2 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "23": [ - 0, - 1, - 1 - ], - "24": [ - 0, - 1, - 1 - ], - "29": [ - 0, - 1, - 1 - ], - "30": [ - 0, - 1, - 1 - ], - "31": [ - 1, - 1, - 1 - ], - "35": [ - 0, - 1, - 2 - ], - "36": [ - 0, - 1, - 1 - ], - "37": [ - 0, - 1, - 1 - ], - "38": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "43": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "46": [ - 1, - 1, - 1 - ], - "47": [ - 1, - 1, - 1 - ], - "50": [ - 0, - 1, - 1 - ], - "51": [ - 0, - 1, - 1 - ], - "52-gigantamax": [ - 1, - 1, - 1 - ], - "52": [ - 1, - 1, - 1 - ], - "53": [ - 1, - 1, - 1 - ], - "56": [ - 1, - 2, - 2 - ], - "57": [ - 2, - 2, - 2 - ], - "69": [ - 0, - 2, - 2 - ], - "70": [ - 0, - 1, - 1 - ], - "71": [ - 0, - 1, - 1 - ], - "77": [ - 0, - 1, - 1 - ], - "78": [ - 0, - 1, - 1 - ], - "79": [ - 1, - 1, - 1 - ], - "80": [ - 0, - 1, - 1 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "81": [ - 0, - 1, - 1 - ], - "82": [ - 0, - 1, - 1 - ], - "83": [ - 0, - 2, - 2 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "86": [ - 1, - 1, - 1 - ], - "87": [ - 1, - 1, - 1 - ], - "92": [ - 2, - 2, - 2 - ], - "93": [ - 1, - 1, - 1 - ], - "94-gigantamax": [ - 1, - 2, - 2 - ], - "94-mega": [ - 2, - 2, - 2 - ], - "94": [ - 1, - 1, - 1 - ], - "98": [ - 0, - 1, - 1 - ], - "99": [ - 0, - 1, - 1 - ], - "99-gigantamax": [ - 0, - 1, - 1 - ], - "100": [ - 0, - 1, - 1 - ], - "101": [ - 0, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "113": [ - 2, - 2, - 2 - ], - "114": [ - 0, - 1, - 1 - ], - "116": [ - 0, - 1, - 1 - ], - "117": [ - 0, - 1, - 1 - ], - "118": [ - 1, - 1, - 1 - ], - "119": [ - 1, - 1, - 1 - ], - "120": [ - 0, - 1, - 1 - ], - "121": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "125": [ - 1, - 1, - 2 - ], - "126": [ - 0, - 2, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "127": [ - 0, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "131-gigantamax": [ - 0, - 1, - 1 - ], - "131": [ - 0, - 1, - 1 - ], - "132": [ - 0, - 1, - 1 - ], - "133": [ - 0, - 1, - 1 - ], - "133-partner": [ - 0, - 1, - 1 - ], - "134": [ - 0, - 1, - 1 - ], - "135": [ - 1, - 1, - 1 - ], - "136": [ - 1, - 1, - 1 - ], - "137": [ - 0, - 1, - 1 - ], - "138": [ - 0, - 1, - 1 - ], - "139": [ - 0, - 1, - 2 - ], - "140": [ - 0, - 1, - 1 - ], - "141": [ - 0, - 2, - 2 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "142": [ - 0, - 1, - 1 - ], - "144": [ - 1, - 2, - 2 - ], - "145": [ - 1, - 1, - 1 - ], - "146": [ - 1, - 1, - 1 - ], - "147": [ - 0, - 1, - 1 - ], - "148": [ - 0, - 1, - 1 - ], - "149": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "150": [ - 0, - 1, - 1 - ], - "151": [ - 0, - 1, - 1 - ], - "161": [ - 0, - 1, - 2 - ], - "162": [ - 0, - 1, - 1 - ], - "163": [ - 0, - 1, - 1 - ], - "164": [ - 0, - 2, - 2 - ], - "169": [ - 0, - 1, - 1 - ], - "173": [ - 0, - 1, - 2 - ], - "175": [ - 1, - 1, - 1 - ], - "176": [ - 1, - 1, - 1 - ], - "177": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "179": [ - 0, - 1, - 1 - ], - "180": [ - 0, - 2, - 2 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "181": [ - 0, - 1, - 1 - ], - "182": [ - 0, - 1, - 1 - ], - "183": [ - 0, - 1, - 2 - ], - "184": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "193": [ - 0, - 1, - 1 - ], - "196": [ - 1, - 1, - 1 - ], - "197": [ - 0, - 1, - 1 - ], - "199": [ - 2, - 1, - 1 - ], - "200": [ - 1, - 1, - 1 - ], - "201-m": [ - 0, - 1, - 1 - ], - "201-question": [ - 0, - 1, - 1 - ], - "201-j": [ - 0, - 1, - 1 - ], - "201-l": [ - 0, - 1, - 1 - ], - "201-h": [ - 0, - 1, - 1 - ], - "201-x": [ - 0, - 1, - 1 - ], - "201-exclamation": [ - 0, - 1, - 1 - ], - "201-q": [ - 0, - 1, - 1 - ], - "201-s": [ - 0, - 1, - 1 - ], - "201-c": [ - 0, - 1, - 1 - ], - "201-u": [ - 0, - 1, - 1 - ], - "201-t": [ - 0, - 1, - 1 - ], - "201-z": [ - 0, - 1, - 1 - ], - "201-d": [ - 0, - 1, - 1 - ], - "201-b": [ - 0, - 1, - 1 - ], - "201-g": [ - 0, - 1, - 1 - ], - "201-k": [ - 0, - 1, - 1 - ], - "201-i": [ - 0, - 1, - 1 - ], - "201-p": [ - 0, - 1, - 1 - ], - "201-e": [ - 0, - 1, - 1 - ], - "201-y": [ - 0, - 1, - 1 - ], - "201-r": [ - 0, - 1, - 1 - ], - "201-f": [ - 0, - 1, - 1 - ], - "201-n": [ - 0, - 1, - 1 - ], - "201-v": [ - 0, - 1, - 1 - ], - "201-a": [ - 0, - 1, - 1 - ], - "201-w": [ - 0, - 1, - 1 - ], - "201-o": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "206": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "212-mega": [ - 1, - 1, - 1 - ], - "212": [ - 1, - 1, - 1 - ], - "213": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "216": [ - 1, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "222": [ - 0, - 1, - 1 - ], - "226": [ - 0, - 2, - 2 - ], - "227": [ - 0, - 1, - 1 - ], - "228": [ - 0, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "230": [ - 0, - 1, - 1 - ], - "231": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "233": [ - 0, - 1, - 1 - ], - "235": [ - 0, - 1, - 1 - ], - "239": [ - 1, - 1, - 2 - ], - "240": [ - 0, - 1, - 1 - ], - "242": [ - 2, - 2, - 2 - ], - "243": [ - 0, - 1, - 1 - ], - "244": [ - 0, - 2, - 2 - ], - "245": [ - 0, - 1, - 1 - ], - "246": [ - 0, - 1, - 1 - ], - "247": [ - 0, - 1, - 1 - ], - "248": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 2, - 1 - ], - "249": [ - 0, - 2, - 2 - ], - "250": [ - 0, - 2, - 2 - ], - "251": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 2 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "261": [ - 0, - 1, - 1 - ], - "262": [ - 0, - 1, - 1 - ], - "263": [ - 0, - 1, - 1 - ], - "264": [ - 0, - 1, - 1 - ], - "278": [ - 1, - 1, - 1 - ], - "279": [ - 1, - 1, - 1 - ], - "280": [ - 0, - 1, - 1 - ], - "281": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 2, - 2 - ], - "282": [ - 0, - 1, - 1 - ], - "285": [ - 0, - 1, - 1 - ], - "286": [ - 0, - 1, - 1 - ], - "290": [ - 1, - 1, - 1 - ], - "291": [ - 2, - 2, - 2 - ], - "292": [ - 2, - 1, - 2 - ], - "298": [ - 0, - 2, - 2 - ], - "300": [ - 1, - 1, - 1 - ], - "301": [ - 1, - 1, - 1 - ], - "302": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 1, - 1, - 1 - ], - "303": [ - 0, - 1, - 1 - ], - "304": [ - 1, - 1, - 1 - ], - "305": [ - 1, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "306": [ - 1, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 2, - 1 - ], - "309": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "310": [ - 0, - 1, - 1 - ], - "311": [ - 1, - 1, - 1 - ], - "312": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "320": [ - 0, - 1, - 1 - ], - "321": [ - 0, - 1, - 1 - ], - "327": [ - 0, - 1, - 1 - ], - "328": [ - 0, - 1, - 1 - ], - "329": [ - 0, - 1, - 2 - ], - "330": [ - 0, - 1, - 1 - ], - "333": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 2, - 1 - ], - "334": [ - 0, - 2, - 2 - ], - "335": [ - 0, - 2, - 2 - ], - "336": [ - 0, - 1, - 1 - ], - "337": [ - 0, - 1, - 1 - ], - "338": [ - 0, - 1, - 1 - ], - "339": [ - 0, - 1, - 1 - ], - "340": [ - 0, - 1, - 2 - ], - "341": [ - 0, - 2, - 2 - ], - "342": [ - 0, - 2, - 2 - ], - "351-rainy": [ - 1, - 2, - 2 - ], - "351-snowy": [ - 1, - 1, - 1 - ], - "351-sunny": [ - 1, - 2, - 2 - ], - "351": [ - 0, - 2, - 2 - ], - "352": [ - 1, - 1, - 1 - ], - "353": [ - 0, - 1, - 1 - ], - "354": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "357": [ - 0, - 1, - 1 - ], - "358": [ - 2, - 1, - 1 - ], - "361": [ - 0, - 1, - 1 - ], - "362": [ - 0, - 2, - 2 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "370": [ - 0, - 1, - 1 - ], - "371": [ - 0, - 1, - 1 - ], - "372": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 2, - 2 - ], - "373": [ - 0, - 1, - 1 - ], - "374": [ - 0, - 1, - 1 - ], - "375": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "376": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "380": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "381": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "382": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "383": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 2, - 1 - ], - "384": [ - 0, - 1, - 1 - ], - "385": [ - 1, - 1, - 1 - ], - "387": [ - 0, - 1, - 1 - ], - "388": [ - 0, - 1, - 1 - ], - "389": [ - 0, - 1, - 1 - ], - "393": [ - 0, - 1, - 1 - ], - "394": [ - 0, - 1, - 1 - ], - "395": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 1, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "406": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "412-sandy": [ - 2, - 2, - 2 - ], - "412-plant": [ - 1, - 1, - 1 - ], - "412-trash": [ - 1, - 1, - 1 - ], - "413-plant": [ - 2, - 2, - 2 - ], - "413-trash": [ - 1, - 1, - 1 - ], - "413-sandy": [ - 1, - 1, - 1 - ], - "414": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 1, - 1 - ], - "422-west": [ - 1, - 1, - 1 - ], - "422-east": [ - 1, - 1, - 1 - ], - "423-west": [ - 1, - 1, - 1 - ], - "423-east": [ - 1, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "425": [ - 0, - 1, - 1 - ], - "426": [ - 0, - 1, - 1 - ], - "427": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "428": [ - 0, - 1, - 1 - ], - "429": [ - 1, - 1, - 1 - ], - "433": [ - 1, - 1, - 1 - ], - "436": [ - 0, - 1, - 1 - ], - "437": [ - 0, - 1, - 1 - ], - "438": [ - 0, - 1, - 1 - ], - "440": [ - 1, - 1, - 2 - ], - "441": [ - 0, - 1, - 1 - ], - "442": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "447": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "448": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "458": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "462": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "466": [ - 1, - 1, - 2 - ], - "467": [ - 0, - 1, - 1 - ], - "468": [ - 1, - 1, - 1 - ], - "469": [ - 0, - 1, - 1 - ], - "470": [ - 1, - 1, - 1 - ], - "471": [ - 1, - 2, - 2 - ], - "472": [ - 0, - 1, - 1 - ], - "474": [ - 0, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "475": [ - 0, - 1, - 1 - ], - "478": [ - 0, - 2, - 1 - ], - "479-heat": [ - 0, - 1, - 1 - ], - "479-wash": [ - 0, - 1, - 1 - ], - "479-mow": [ - 0, - 1, - 1 - ], - "479-frost": [ - 0, - 1, - 1 - ], - "479": [ - 0, - 1, - 1 - ], - "479-fan": [ - 0, - 1, - 1 - ], - "480": [ - 1, - 1, - 1 - ], - "481": [ - 1, - 1, - 1 - ], - "482": [ - 1, - 1, - 1 - ], - "485": [ - 0, - 1, - 1 - ], - "487-altered": [ - 0, - 1, - 1 - ], - "487-origin": [ - 0, - 1, - 1 - ], - "488": [ - 0, - 1, - 1 - ], - "489": [ - 1, - 1, - 1 - ], - "490": [ - 1, - 1, - 1 - ], - "491": [ - 0, - 1, - 1 - ], - "492-land": [ - 0, - 2, - 1 - ], - "492-sky": [ - 0, - 1, - 1 - ], - "494": [ - 0, - 1, - 1 - ], - "495": [ - 0, - 1, - 1 - ], - "496": [ - 0, - 1, - 1 - ], - "497": [ - 0, - 1, - 1 - ], - "517": [ - 0, - 1, - 1 - ], - "518": [ - 0, - 1, - 1 - ], - "524": [ - 0, - 1, - 1 - ], - "525": [ - 0, - 1, - 1 - ], - "526": [ - 0, - 2, - 2 - ], - "529": [ - 0, - 2, - 2 - ], - "530": [ - 0, - 2, - 2 - ], - "531": [ - 0, - 1, - 1 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "532": [ - 0, - 1, - 1 - ], - "533": [ - 0, - 1, - 1 - ], - "534": [ - 0, - 1, - 1 - ], - "538": [ - 0, - 1, - 1 - ], - "539": [ - 0, - 2, - 2 - ], - "540": [ - 0, - 1, - 1 - ], - "541": [ - 0, - 1, - 1 - ], - "542": [ - 0, - 1, - 1 - ], - "543": [ - 0, - 1, - 2 - ], - "544": [ - 0, - 1, - 2 - ], - "545": [ - 0, - 1, - 1 - ], - "546": [ - 0, - 1, - 1 - ], - "547": [ - 0, - 1, - 1 - ], - "548": [ - 1, - 1, - 1 - ], - "549": [ - 0, - 1, - 2 - ], - "551": [ - 0, - 1, - 1 - ], - "552": [ - 0, - 1, - 1 - ], - "553": [ - 0, - 1, - 1 - ], - "556": [ - 0, - 1, - 1 - ], - "559": [ - 1, - 1, - 1 - ], - "560": [ - 1, - 1, - 1 - ], - "562": [ - 0, - 1, - 1 - ], - "563": [ - 0, - 1, - 1 - ], - "568": [ - 0, - 2, - 2 - ], - "569-gigantamax": [ - 0, - 1, - 1 - ], - "569": [ - 0, - 1, - 1 - ], - "570": [ - 0, - 1, - 1 - ], - "571": [ - 0, - 1, - 1 - ], - "572": [ - 0, - 1, - 1 - ], - "577": [ - 1, - 1, - 1 - ], - "578": [ - 1, - 1, - 1 - ], - "579": [ - 1, - 1, - 1 - ], - "585-autumn": [ - 2, - 0, - 0 - ], - "585-spring": [ - 2, - 0, - 0 - ], - "585-summer": [ - 2, - 0, - 0 - ], - "585-winter": [ - 2, - 0, - 0 - ], - "586-autumn": [ - 1, - 0, - 0 - ], - "586-spring": [ - 1, - 0, - 0 - ], - "586-summer": [ - 1, - 0, - 0 - ], - "586-winter": [ - 1, - 0, - 0 - ], - "592": [ - 0, - 1, - 2 - ], - "593": [ - 0, - 1, - 1 - ], - "594": [ - 0, - 1, - 2 - ], - "595": [ - 0, - 1, - 1 - ], - "596": [ - 0, - 1, - 1 - ], - "602": [ - 0, - 1, - 1 - ], - "603": [ - 0, - 1, - 1 - ], - "604": [ - 0, - 1, - 1 - ], - "605": [ - 1, - 1, - 1 - ], - "606": [ - 1, - 1, - 1 - ], - "607": [ - 0, - 1, - 1 - ], - "608": [ - 0, - 1, - 1 - ], - "609": [ - 0, - 1, - 1 - ], - "610": [ - 0, - 1, - 1 - ], - "611": [ - 0, - 1, - 1 - ], - "612": [ - 0, - 1, - 2 - ], - "618": [ - 0, - 1, - 1 - ], - "619": [ - 0, - 1, - 1 - ], - "620": [ - 0, - 1, - 1 - ], - "622": [ - 0, - 1, - 1 - ], - "623": [ - 0, - 1, - 1 - ], - "631": [ - 0, - 2, - 2 - ], - "632": [ - 0, - 1, - 1 - ], - "633": [ - 0, - 1, - 1 - ], - "634": [ - 0, - 1, - 1 - ], - "635": [ - 0, - 1, - 1 - ], - "636": [ - 0, - 1, - 1 - ], - "637": [ - 0, - 1, - 1 - ], - "640": [ - 0, - 1, - 1 - ], - "647-resolute": [ - 0, - 1, - 1 - ], - "647-ordinary": [ - 0, - 1, - 1 - ], - "648-aria": [ - 0, - 1, - 1 - ], - "648-pirouette": [ - 0, - 1, - 1 - ], - "649-burn": [ - 0, - 1, - 1 - ], - "649-chill": [ - 0, - 1, - 1 - ], - "649-douse": [ - 0, - 1, - 1 - ], - "649-shock": [ - 0, - 1, - 1 - ], - "649": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 2 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 1, - 1 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 2 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 2, - 1 - ], - "669-blue": [ - 0, - 2, - 2 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 2, - 1 - ], - "669-orange": [ - 0, - 2, - 1 - ], - "670-white": [ - 0, - 2, - 2 - ], - "670-blue": [ - 0, - 2, - 2 - ], - "670-orange": [ - 0, - 2, - 2 - ], - "670-red": [ - 0, - 2, - 2 - ], - "670-yellow": [ - 0, - 2, - 2 - ], - "671-red": [ - 0, - 1, - 2 - ], - "671-blue": [ - 0, - 1, - 2 - ], - "671-yellow": [ - 0, - 1, - 2 - ], - "671-white": [ - 0, - 1, - 2 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 2 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 2 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 1, - 1 - ], - "730": [ - 0, - 1, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 1, - 1 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 1, - 1 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 2 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791-radiant-sun": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792-full-moon": [ - 0, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809-gigantamax": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818-gigantamax": [ - 1, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823-gigantamax": [ - 0, - 2, - 2 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 2, - 2 - ], - "850": [ - 0, - 1, - 1 - ], - "851-gigantamax": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858-gigantamax": [ - 0, - 1, - 1 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 2, - 2 - ], - "860": [ - 0, - 1, - 1 - ], - "861-gigantamax": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884-gigantamax": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 2, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-gigantamax-rapid": [ - 1, - 2, - 2 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "892-gigantamax-single": [ - 1, - 2, - 2 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 2, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 2 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 2, - 2 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 2, - 2 - ], - "914": [ - 0, - 2, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 2, - 2, - 2 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 1, - 1 - ], - "925-three": [ - 1, - 1, - 1 - ], - "932": [ - 0, - 1, - 2 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 2, - 2 - ], - "958": [ - 2, - 2, - 1 - ], - "959": [ - 2, - 2, - 2 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 2, - 2 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 2, - 2, - 2 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 2, - 2 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 2, - 2 - ], - "979": [ - 2, - 2, - 2 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 2 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "1010": [ - 0, - 1, - 1 - ], - "1018": [ - 0, - 1, - 1 - ], - "1022": [ - 0, - 1, - 1 - ], - "1023": [ - 0, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "2670": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ], - "8901": [ - 1, - 1, - 1 - ], + "1": [0, 1, 1], + "2": [0, 2, 1], + "3-gigantamax": [0, 1, 1], + "3-mega": [0, 2, 2], + "3": [0, 1, 1], + "4": [0, 1, 1], + "5": [0, 1, 1], + "6-mega-x": [0, 1, 2], + "6-gigantamax": [0, 1, 2], + "6-mega-y": [0, 1, 2], + "6": [0, 2, 2], + "7": [0, 2, 2], + "8": [0, 2, 2], + "9-gigantamax": [0, 1, 2], + "9-mega": [0, 2, 2], + "9": [0, 2, 2], + "19": [0, 1, 1], + "20": [0, 1, 1], + "23": [0, 1, 1], + "24": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-gigantamax": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "29": [0, 1, 1], + "30": [0, 1, 1], + "31": [1, 1, 1], + "35": [0, 1, 2], + "36": [0, 1, 1], + "37": [0, 1, 1], + "38": [0, 1, 1], + "39": [0, 1, 1], + "40": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "43": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "46": [1, 1, 1], + "47": [1, 1, 1], + "50": [0, 1, 1], + "51": [0, 1, 1], + "52-gigantamax": [1, 1, 1], + "52": [1, 1, 1], + "53": [1, 1, 1], + "56": [1, 2, 2], + "57": [2, 2, 2], + "69": [0, 2, 2], + "70": [0, 1, 1], + "71": [0, 1, 1], + "77": [0, 1, 1], + "78": [0, 1, 1], + "79": [1, 1, 1], + "80": [0, 1, 1], + "80-mega": [0, 1, 1], + "81": [0, 1, 1], + "82": [0, 1, 1], + "83": [0, 2, 2], + "84": [1, 1, 1], + "85": [1, 1, 1], + "86": [1, 1, 1], + "87": [1, 1, 1], + "92": [2, 2, 2], + "93": [1, 1, 1], + "94-gigantamax": [1, 2, 2], + "94-mega": [2, 2, 2], + "94": [1, 1, 1], + "98": [0, 1, 1], + "99": [0, 1, 1], + "99-gigantamax": [0, 1, 1], + "100": [0, 1, 1], + "101": [0, 1, 1], + "102": [0, 1, 1], + "103": [0, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "113": [2, 2, 2], + "114": [0, 1, 1], + "116": [0, 1, 1], + "117": [0, 1, 1], + "118": [1, 1, 1], + "119": [1, 1, 1], + "120": [0, 1, 1], + "121": [0, 1, 1], + "123": [1, 1, 1], + "125": [1, 1, 2], + "126": [0, 2, 1], + "127-mega": [0, 1, 1], + "127": [0, 1, 1], + "128": [0, 1, 1], + "129": [0, 1, 1], + "130-mega": [0, 1, 1], + "130": [0, 1, 1], + "131-gigantamax": [0, 1, 1], + "131": [0, 1, 1], + "132": [0, 1, 1], + "133": [0, 1, 1], + "133-partner": [0, 1, 1], + "134": [0, 1, 1], + "135": [1, 1, 1], + "136": [1, 1, 1], + "137": [0, 1, 1], + "138": [0, 1, 1], + "139": [0, 1, 2], + "140": [0, 1, 1], + "141": [0, 2, 2], + "142-mega": [0, 1, 1], + "142": [0, 1, 1], + "144": [1, 2, 2], + "145": [1, 1, 1], + "146": [1, 1, 1], + "147": [0, 1, 1], + "148": [0, 1, 1], + "149": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "150": [0, 1, 1], + "151": [0, 1, 1], + "152": [0, 1, 1], + "153": [0, 1, 1], + "154": [0, 1, 1], + "158": [0, 1, 1], + "159": [0, 1, 1], + "160": [0, 1, 1], + "161": [0, 1, 2], + "162": [0, 1, 1], + "163": [0, 1, 1], + "164": [0, 2, 2], + "167": [0, 1, 1], + "168": [0, 1, 1], + "169": [0, 1, 1], + "170": [0, 1, 1], + "171": [0, 1, 1], + "172": [0, 1, 1], + "172-spiky": [0, 1, 1], + "173": [0, 1, 2], + "174": [0, 1, 1], + "175": [1, 1, 1], + "176": [1, 1, 1], + "177": [0, 1, 1], + "178": [0, 2, 2], + "179": [0, 1, 1], + "180": [0, 2, 2], + "181-mega": [0, 1, 2], + "181": [0, 1, 1], + "182": [0, 1, 1], + "183": [0, 1, 2], + "184": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "193": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "196": [1, 1, 1], + "197": [0, 1, 1], + "198": [0, 1, 1], + "199": [2, 1, 1], + "200": [1, 1, 1], + "201-m": [0, 1, 1], + "201-question": [0, 1, 1], + "201-j": [0, 1, 1], + "201-l": [0, 1, 1], + "201-h": [0, 1, 1], + "201-x": [0, 1, 1], + "201-exclamation": [0, 1, 1], + "201-q": [0, 1, 1], + "201-s": [0, 1, 1], + "201-c": [0, 1, 1], + "201-u": [0, 1, 1], + "201-t": [0, 1, 1], + "201-z": [0, 1, 1], + "201-d": [0, 1, 1], + "201-b": [0, 1, 1], + "201-g": [0, 1, 1], + "201-k": [0, 1, 1], + "201-i": [0, 1, 1], + "201-p": [0, 1, 1], + "201-e": [0, 1, 1], + "201-y": [0, 1, 1], + "201-r": [0, 1, 1], + "201-f": [0, 1, 1], + "201-n": [0, 1, 1], + "201-v": [0, 1, 1], + "201-a": [0, 1, 1], + "201-w": [0, 1, 1], + "201-o": [0, 1, 1], + "203": [0, 1, 1], + "206": [0, 1, 1], + "207": [0, 1, 1], + "211": [0, 1, 1], + "212-mega": [1, 1, 1], + "212": [1, 1, 1], + "213": [0, 1, 1], + "215": [0, 1, 1], + "216": [1, 1, 1], + "217": [1, 1, 1], + "222": [0, 1, 1], + "226": [0, 2, 2], + "227": [0, 1, 1], + "228": [0, 1, 1], + "229": [0, 1, 1], + "229-mega": [0, 1, 1], + "230": [0, 1, 1], + "231": [0, 1, 1], + "232": [0, 1, 1], + "233": [0, 1, 1], + "235": [0, 1, 1], + "239": [1, 1, 2], + "240": [0, 1, 1], + "242": [2, 2, 2], + "243": [0, 1, 1], + "244": [0, 2, 2], + "245": [0, 1, 1], + "246": [0, 1, 1], + "247": [0, 1, 1], + "248": [0, 1, 1], + "248-mega": [0, 2, 1], + "249": [0, 2, 2], + "250": [0, 2, 2], + "251": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 2], + "257-mega": [0, 1, 1], + "261": [0, 1, 1], + "262": [0, 1, 1], + "263": [0, 1, 1], + "264": [0, 1, 1], + "276": [0, 1, 1], + "277": [0, 1, 1], + "278": [1, 1, 1], + "279": [1, 1, 1], + "280": [0, 1, 1], + "281": [0, 1, 1], + "282-mega": [0, 2, 2], + "282": [0, 1, 1], + "285": [0, 1, 1], + "286": [0, 1, 1], + "290": [1, 1, 1], + "291": [2, 2, 2], + "292": [2, 1, 2], + "298": [0, 2, 2], + "300": [1, 1, 1], + "301": [1, 1, 1], + "302": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [1, 1, 1], + "303": [0, 1, 1], + "304": [1, 1, 1], + "305": [1, 1, 1], + "306-mega": [1, 1, 1], + "306": [1, 1, 1], + "307": [0, 1, 1], + "308-mega": [0, 1, 1], + "308": [0, 2, 1], + "309": [0, 1, 1], + "310-mega": [0, 1, 1], + "310": [0, 1, 1], + "311": [1, 1, 1], + "312": [0, 1, 1], + "315": [0, 1, 1], + "320": [0, 1, 1], + "321": [0, 1, 1], + "327": [0, 1, 1], + "328": [0, 1, 1], + "329": [0, 1, 2], + "330": [0, 1, 1], + "333": [0, 1, 1], + "334-mega": [0, 2, 1], + "334": [0, 2, 2], + "335": [0, 2, 2], + "336": [0, 1, 1], + "337": [0, 1, 1], + "338": [0, 1, 1], + "339": [0, 1, 1], + "340": [0, 1, 2], + "341": [0, 2, 2], + "342": [0, 2, 2], + "351-rainy": [1, 2, 2], + "351-snowy": [1, 1, 1], + "351-sunny": [1, 2, 2], + "351": [0, 2, 2], + "352": [1, 1, 1], + "353": [0, 1, 1], + "354": [0, 1, 1], + "354-mega": [0, 1, 1], + "357": [0, 1, 1], + "358": [2, 1, 1], + "359": [0, 1, 1], + "359-mega": [0, 1, 1], + "361": [0, 1, 1], + "362": [0, 2, 2], + "362-mega": [0, 1, 1], + "369": [0, 1, 1], + "370": [0, 1, 1], + "371": [0, 1, 1], + "372": [0, 1, 1], + "373-mega": [0, 2, 2], + "373": [0, 1, 1], + "374": [0, 1, 1], + "375": [0, 1, 1], + "376-mega": [0, 1, 1], + "376": [0, 1, 1], + "377": [0, 1, 1], + "378": [1, 1, 1], + "379": [0, 1, 1], + "380-mega": [0, 1, 1], + "380": [0, 1, 1], + "381-mega": [0, 1, 1], + "381": [0, 1, 1], + "382-primal": [0, 1, 1], + "382": [0, 1, 1], + "383-primal": [0, 1, 1], + "383": [0, 1, 1], + "384-mega": [0, 2, 1], + "384": [0, 1, 1], + "385": [1, 1, 1], + "387": [0, 1, 1], + "388": [0, 1, 1], + "389": [0, 1, 1], + "390": [0, 1, 1], + "391": [0, 1, 1], + "392": [0, 1, 1], + "393": [0, 1, 1], + "394": [0, 1, 1], + "395": [0, 1, 1], + "399": [0, 1, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "406": [0, 1, 1], + "407": [0, 1, 1], + "412-sandy": [2, 2, 2], + "412-plant": [1, 1, 1], + "412-trash": [1, 1, 1], + "413-plant": [2, 2, 2], + "413-trash": [1, 1, 1], + "413-sandy": [1, 1, 1], + "414": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 1, 1], + "422-west": [1, 1, 1], + "422-east": [1, 1, 1], + "423-west": [1, 1, 1], + "423-east": [1, 1, 1], + "424": [0, 1, 1], + "425": [0, 1, 1], + "426": [0, 1, 1], + "427": [0, 1, 1], + "428-mega": [0, 1, 1], + "428": [0, 1, 1], + "429": [1, 1, 1], + "430": [0, 1, 1], + "433": [1, 1, 1], + "436": [0, 1, 1], + "437": [0, 1, 1], + "438": [0, 1, 1], + "440": [1, 1, 2], + "441": [0, 1, 1], + "442": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445-mega": [1, 1, 1], + "445": [1, 1, 1], + "447": [1, 1, 1], + "448-mega": [1, 1, 1], + "448": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "455": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "458": [0, 1, 1], + "461": [0, 1, 1], + "462": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "466": [1, 1, 2], + "467": [0, 1, 1], + "468": [1, 1, 1], + "469": [0, 1, 1], + "470": [1, 1, 1], + "471": [1, 2, 2], + "472": [0, 1, 1], + "474": [0, 1, 1], + "475-mega": [0, 2, 2], + "475": [0, 1, 1], + "478": [0, 2, 1], + "479-heat": [0, 1, 1], + "479-wash": [0, 1, 1], + "479-mow": [0, 1, 1], + "479-frost": [0, 1, 1], + "479": [0, 1, 1], + "479-fan": [0, 1, 1], + "480": [1, 1, 1], + "481": [1, 1, 1], + "482": [1, 1, 1], + "485": [0, 1, 1], + "486": [0, 1, 1], + "487-altered": [0, 1, 1], + "487-origin": [0, 1, 1], + "488": [0, 1, 1], + "489": [1, 1, 1], + "490": [1, 1, 1], + "491": [0, 1, 1], + "492-land": [0, 2, 1], + "492-sky": [0, 1, 1], + "494": [0, 1, 1], + "495": [0, 1, 1], + "496": [0, 1, 1], + "497": [0, 1, 1], + "501": [0, 1, 1], + "502": [0, 1, 1], + "503": [0, 1, 1], + "517": [0, 1, 1], + "518": [0, 1, 1], + "524": [0, 1, 1], + "525": [0, 1, 1], + "526": [0, 2, 2], + "527": [0, 1, 1], + "528": [0, 1, 1], + "529": [0, 2, 2], + "530": [0, 2, 2], + "531": [0, 1, 1], + "531-mega": [0, 1, 1], + "532": [0, 1, 1], + "533": [0, 1, 1], + "534": [0, 1, 1], + "538": [0, 1, 1], + "539": [0, 2, 2], + "540": [0, 1, 1], + "541": [0, 1, 1], + "542": [0, 1, 1], + "543": [0, 1, 2], + "544": [0, 1, 2], + "545": [0, 1, 1], + "546": [0, 1, 1], + "547": [0, 1, 1], + "548": [1, 1, 1], + "549": [0, 1, 2], + "551": [0, 1, 1], + "552": [0, 1, 1], + "553": [0, 1, 1], + "556": [0, 1, 1], + "559": [1, 1, 1], + "560": [1, 1, 1], + "562": [0, 1, 1], + "563": [0, 1, 1], + "568": [0, 2, 2], + "569-gigantamax": [0, 1, 1], + "569": [0, 1, 1], + "570": [0, 1, 1], + "571": [0, 1, 1], + "572": [0, 1, 1], + "577": [1, 1, 1], + "578": [1, 1, 1], + "579": [1, 1, 1], + "585-autumn": [2, 0, 0], + "585-spring": [2, 0, 0], + "585-summer": [2, 0, 0], + "585-winter": [2, 0, 0], + "586-autumn": [1, 0, 0], + "586-spring": [1, 0, 0], + "586-summer": [1, 0, 0], + "586-winter": [1, 0, 0], + "587": [0, 1, 1], + "588": [0, 1, 1], + "589": [0, 1, 1], + "590": [0, 1, 1], + "591": [0, 1, 1], + "592": [0, 1, 2], + "593": [0, 1, 1], + "594": [0, 1, 2], + "595": [0, 1, 1], + "596": [0, 1, 1], + "602": [0, 1, 1], + "603": [0, 1, 1], + "604": [0, 1, 1], + "605": [1, 1, 1], + "606": [1, 1, 1], + "607": [0, 1, 1], + "608": [0, 1, 1], + "609": [0, 1, 1], + "610": [0, 1, 1], + "611": [0, 1, 1], + "612": [0, 1, 2], + "616": [0, 1, 1], + "617": [0, 1, 1], + "618": [0, 1, 1], + "619": [0, 1, 1], + "620": [0, 1, 1], + "621": [0, 1, 1], + "622": [0, 1, 1], + "623": [0, 1, 1], + "631": [0, 2, 2], + "632": [0, 1, 1], + "633": [0, 1, 1], + "634": [0, 1, 1], + "635": [0, 1, 1], + "636": [0, 1, 1], + "637": [0, 1, 1], + "640": [0, 1, 1], + "647-resolute": [0, 1, 1], + "647-ordinary": [0, 1, 1], + "648-aria": [0, 1, 1], + "648-pirouette": [0, 1, 1], + "649-burn": [0, 1, 1], + "649-chill": [0, 1, 1], + "649-douse": [0, 1, 1], + "649-shock": [0, 1, 1], + "649": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 2], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 2, 2], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 2], + "666-polar": [0, 1, 1], + "666-river": [0, 2, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 2, 1], + "669-blue": [0, 2, 2], + "669-white": [0, 1, 1], + "669-yellow": [0, 2, 1], + "669-orange": [0, 2, 1], + "670-white": [0, 2, 2], + "670-blue": [0, 2, 2], + "670-orange": [0, 2, 2], + "670-red": [0, 2, 2], + "670-yellow": [0, 2, 2], + "671-red": [0, 1, 2], + "671-blue": [0, 1, 2], + "671-yellow": [0, 1, 2], + "671-white": [0, 1, 2], + "671-orange": [0, 1, 1], + "672": [0, 1, 2], + "673": [0, 1, 1], + "676": [0, 1, 1], + "676-dandy": [0, 1, 1], + "676-debutante": [0, 1, 1], + "676-diamond": [0, 1, 1], + "676-heart": [0, 1, 1], + "676-kabuki": [0, 1, 1], + "676-la-reine": [0, 1, 1], + "676-matron": [0, 1, 1], + "676-pharaoh": [0, 1, 1], + "676-star": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 2, 2], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 1, 1], + "730": [0, 1, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 1, 1], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 1, 1], + "755": [0, 1, 1], + "756": [0, 1, 2], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791-radiant-sun": [0, 1, 1], + "791": [2, 1, 1], + "792-full-moon": [0, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809-gigantamax": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818-gigantamax": [1, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823-gigantamax": [0, 2, 2], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 2, 2], + "850": [0, 1, 1], + "851-gigantamax": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858-gigantamax": [0, 1, 1], + "858": [0, 1, 1], + "859": [0, 2, 2], + "860": [0, 1, 1], + "861-gigantamax": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884-gigantamax": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [2, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890-eternamax": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-gigantamax-rapid": [1, 2, 2], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "892-gigantamax-single": [1, 2, 2], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [2, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 2], + "903": [0, 1, 1], + "909": [0, 2, 2], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 2, 2], + "914": [0, 2, 1], + "919": [1, 1, 1], + "920": [2, 2, 2], + "924": [1, 1, 1], + "925-four": [1, 1, 1], + "925-three": [1, 1, 1], + "932": [0, 1, 2], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 2, 2], + "958": [2, 2, 1], + "959": [2, 2, 2], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 2, 2], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [2, 2, 2], + "974": [0, 1, 1], + "975": [0, 2, 2], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 2, 2], + "979": [2, 2, 2], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 2], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "1010": [0, 1, 1], + "1012-counterfeit": [0, 1, 1], + "1013-unremarkable": [0, 1, 1], + "1018": [0, 1, 1], + "1022": [0, 1, 1], + "1023": [0, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "2670": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "8901": [1, 1, 1], "female": { - "3": [ - 0, - 2, - 1 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "118": [ - 0, - 1, - 1 - ], - "119": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 1, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 2, - 2 - ], - "407": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 2, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "592": [ - 1, - 1, - 1 - ], - "593": [ - 1, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ] + "3": [0, 2, 1], + "19": [0, 1, 1], + "20": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "84": [1, 1, 1], + "85": [1, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "118": [0, 1, 1], + "119": [0, 1, 1], + "123": [1, 1, 1], + "129": [0, 1, 1], + "130": [0, 1, 1], + "154": [0, 1, 1], + "178": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "198": [0, 1, 1], + "203": [0, 1, 1], + "207": [0, 1, 1], + "215": [0, 1, 1], + "217": [1, 1, 1], + "229": [0, 1, 1], + "232": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "307": [0, 1, 1], + "308": [0, 1, 1], + "315": [0, 1, 1], + "369": [0, 1, 1], + "399": [0, 1, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 2, 2], + "407": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 2, 1], + "424": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "461": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "592": [1, 1, 1], + "593": [1, 1, 1], + "6215": [0, 1, 1] }, "back": { - "1": [ - 0, - 1, - 1 - ], - "2": [ - 0, - 1, - 1 - ], - "3-gigantamax": [ - 0, - 1, - 1 - ], - "3-mega": [ - 0, - 2, - 2 - ], - "3": [ - 0, - 1, - 1 - ], - "4": [ - 0, - 1, - 1 - ], - "5": [ - 0, - 1, - 1 - ], - "6-mega-x": [ - 0, - 1, - 2 - ], - "6-gigantamax": [ - 0, - 1, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "6": [ - 0, - 2, - 2 - ], - "7": [ - 0, - 2, - 2 - ], - "8": [ - 0, - 2, - 2 - ], - "9-gigantamax": [ - 0, - 1, - 2 - ], - "9-mega": [ - 0, - 2, - 2 - ], - "9": [ - 0, - 2, - 2 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "23": [ - 0, - 1, - 1 - ], - "24": [ - 0, - 1, - 1 - ], - "29": [ - 0, - 1, - 1 - ], - "30": [ - 0, - 1, - 1 - ], - "31": [ - 1, - 1, - 1 - ], - "35": [ - 0, - 1, - 1 - ], - "36": [ - 0, - 2, - 1 - ], - "37": [ - 0, - 1, - 1 - ], - "38": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "43": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "46": [ - 1, - 1, - 1 - ], - "47": [ - 1, - 1, - 1 - ], - "50": [ - 0, - 1, - 1 - ], - "51": [ - 0, - 1, - 1 - ], - "52-gigantamax": [ - 1, - 1, - 1 - ], - "52": [ - 1, - 1, - 1 - ], - "53": [ - 1, - 1, - 1 - ], - "56": [ - 1, - 1, - 1 - ], - "57": [ - 1, - 1, - 1 - ], - "69": [ - 0, - 1, - 1 - ], - "70": [ - 0, - 1, - 1 - ], - "71": [ - 0, - 1, - 1 - ], - "77": [ - 0, - 1, - 1 - ], - "78": [ - 0, - 1, - 1 - ], - "79": [ - 1, - 1, - 1 - ], - "80": [ - 0, - 1, - 1 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "81": [ - 0, - 1, - 1 - ], - "82": [ - 0, - 1, - 1 - ], - "83": [ - 0, - 2, - 2 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "86": [ - 1, - 1, - 1 - ], - "87": [ - 1, - 1, - 1 - ], - "92": [ - 2, - 2, - 2 - ], - "93": [ - 1, - 1, - 1 - ], - "94-gigantamax": [ - 1, - 1, - 1 - ], - "94-mega": [ - 1, - 1, - 1 - ], - "94": [ - 1, - 1, - 1 - ], - "98": [ - 0, - 1, - 1 - ], - "99": [ - 0, - 1, - 1 - ], - "99-gigantamax": [ - 0, - 1, - 1 - ], - "100": [ - 0, - 1, - 1 - ], - "101": [ - 0, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "113": [ - 1, - 1, - 1 - ], - "114": [ - 0, - 1, - 1 - ], - "116": [ - 0, - 1, - 1 - ], - "117": [ - 0, - 1, - 1 - ], - "118": [ - 1, - 1, - 1 - ], - "119": [ - 1, - 1, - 1 - ], - "120": [ - 0, - 1, - 1 - ], - "121": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "125": [ - 1, - 1, - 2 - ], - "126": [ - 0, - 2, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "127": [ - 0, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "131-gigantamax": [ - 0, - 1, - 1 - ], - "131": [ - 0, - 1, - 1 - ], - "132": [ - 0, - 1, - 1 - ], - "133": [ - 0, - 1, - 1 - ], - "133-partner": [ - 0, - 1, - 1 - ], - "134": [ - 0, - 1, - 1 - ], - "135": [ - 1, - 1, - 1 - ], - "136": [ - 1, - 1, - 1 - ], - "137": [ - 0, - 1, - 1 - ], - "138": [ - 0, - 1, - 1 - ], - "139": [ - 0, - 1, - 1 - ], - "140": [ - 0, - 1, - 1 - ], - "141": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "142": [ - 0, - 1, - 1 - ], - "144": [ - 1, - 1, - 1 - ], - "145": [ - 1, - 1, - 1 - ], - "146": [ - 1, - 1, - 1 - ], - "147": [ - 0, - 1, - 1 - ], - "148": [ - 0, - 1, - 1 - ], - "149": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "150": [ - 0, - 1, - 1 - ], - "151": [ - 0, - 1, - 1 - ], - "161": [ - 0, - 1, - 1 - ], - "162": [ - 0, - 1, - 1 - ], - "163": [ - 0, - 1, - 1 - ], - "164": [ - 0, - 1, - 1 - ], - "169": [ - 0, - 1, - 1 - ], - "173": [ - 0, - 1, - 1 - ], - "175": [ - 1, - 1, - 1 - ], - "176": [ - 1, - 1, - 1 - ], - "177": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "179": [ - 0, - 1, - 1 - ], - "180": [ - 0, - 1, - 2 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "181": [ - 0, - 1, - 1 - ], - "182": [ - 0, - 1, - 1 - ], - "183": [ - 0, - 1, - 1 - ], - "184": [ - 0, - 1, - 1 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "193": [ - 0, - 1, - 1 - ], - "196": [ - 1, - 1, - 1 - ], - "197": [ - 0, - 1, - 1 - ], - "199": [ - 2, - 1, - 1 - ], - "200": [ - 1, - 2, - 2 - ], - "201-m": [ - 0, - 1, - 1 - ], - "201-question": [ - 0, - 1, - 1 - ], - "201-j": [ - 0, - 1, - 1 - ], - "201-l": [ - 0, - 1, - 1 - ], - "201-h": [ - 0, - 1, - 1 - ], - "201-x": [ - 0, - 1, - 1 - ], - "201-exclamation": [ - 0, - 1, - 1 - ], - "201-q": [ - 0, - 1, - 1 - ], - "201-s": [ - 0, - 1, - 1 - ], - "201-c": [ - 0, - 1, - 1 - ], - "201-u": [ - 0, - 1, - 1 - ], - "201-t": [ - 0, - 1, - 1 - ], - "201-z": [ - 0, - 1, - 1 - ], - "201-d": [ - 0, - 1, - 1 - ], - "201-b": [ - 0, - 1, - 1 - ], - "201-g": [ - 0, - 1, - 1 - ], - "201-k": [ - 0, - 1, - 1 - ], - "201-i": [ - 0, - 1, - 1 - ], - "201-p": [ - 0, - 1, - 1 - ], - "201-e": [ - 0, - 1, - 1 - ], - "201-y": [ - 0, - 1, - 1 - ], - "201-r": [ - 0, - 1, - 1 - ], - "201-f": [ - 0, - 1, - 1 - ], - "201-n": [ - 0, - 1, - 1 - ], - "201-v": [ - 0, - 1, - 1 - ], - "201-a": [ - 0, - 1, - 1 - ], - "201-w": [ - 0, - 1, - 1 - ], - "201-o": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "206": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "212-mega": [ - 1, - 2, - 1 - ], - "212": [ - 1, - 1, - 1 - ], - "213": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "216": [ - 1, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "222": [ - 0, - 1, - 1 - ], - "226": [ - 0, - 1, - 1 - ], - "227": [ - 0, - 1, - 1 - ], - "228": [ - 0, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "230": [ - 0, - 1, - 1 - ], - "231": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "233": [ - 0, - 1, - 1 - ], - "235": [ - 0, - 1, - 1 - ], - "239": [ - 1, - 1, - 2 - ], - "240": [ - 0, - 1, - 1 - ], - "242": [ - 1, - 1, - 1 - ], - "243": [ - 0, - 1, - 1 - ], - "244": [ - 0, - 2, - 2 - ], - "245": [ - 0, - 1, - 1 - ], - "246": [ - 0, - 1, - 1 - ], - "247": [ - 0, - 1, - 1 - ], - "248": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 1, - 1 - ], - "249": [ - 0, - 1, - 1 - ], - "250": [ - 0, - 1, - 1 - ], - "251": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "261": [ - 0, - 1, - 1 - ], - "262": [ - 0, - 1, - 1 - ], - "263": [ - 0, - 1, - 1 - ], - "264": [ - 0, - 1, - 1 - ], - "278": [ - 1, - 1, - 1 - ], - "279": [ - 1, - 1, - 1 - ], - "280": [ - 0, - 1, - 1 - ], - "281": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 1, - 1 - ], - "282": [ - 0, - 1, - 1 - ], - "285": [ - 0, - 1, - 1 - ], - "286": [ - 0, - 1, - 1 - ], - "290": [ - 1, - 1, - 1 - ], - "291": [ - 2, - 2, - 2 - ], - "292": [ - 2, - 2, - 2 - ], - "298": [ - 0, - 1, - 1 - ], - "300": [ - 1, - 1, - 1 - ], - "301": [ - 1, - 1, - 1 - ], - "302": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 1, - 1, - 1 - ], - "303": [ - 1, - 1, - 1 - ], - "304": [ - 1, - 1, - 1 - ], - "305": [ - 1, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "306": [ - 1, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "309": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "310": [ - 0, - 1, - 1 - ], - "311": [ - 1, - 1, - 1 - ], - "312": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "320": [ - 0, - 1, - 1 - ], - "321": [ - 0, - 1, - 1 - ], - "327": [ - 0, - 1, - 1 - ], - "328": [ - 0, - 1, - 1 - ], - "329": [ - 0, - 1, - 1 - ], - "330": [ - 0, - 1, - 1 - ], - "333": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 1, - 1 - ], - "334": [ - 0, - 1, - 1 - ], - "335": [ - 0, - 2, - 2 - ], - "336": [ - 0, - 1, - 1 - ], - "337": [ - 0, - 1, - 1 - ], - "338": [ - 0, - 1, - 1 - ], - "339": [ - 0, - 2, - 1 - ], - "340": [ - 0, - 1, - 2 - ], - "341": [ - 0, - 1, - 1 - ], - "342": [ - 0, - 2, - 2 - ], - "351-rainy": [ - 1, - 1, - 1 - ], - "351-snowy": [ - 1, - 1, - 1 - ], - "351-sunny": [ - 1, - 1, - 2 - ], - "351": [ - 0, - 1, - 1 - ], - "352": [ - 1, - 1, - 1 - ], - "353": [ - 0, - 1, - 1 - ], - "354": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "357": [ - 0, - 1, - 1 - ], - "358": [ - 1, - 1, - 1 - ], - "361": [ - 0, - 1, - 1 - ], - "362": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 2, - 2 - ], - "370": [ - 0, - 2, - 2 - ], - "371": [ - 0, - 1, - 1 - ], - "372": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "373": [ - 0, - 1, - 1 - ], - "374": [ - 0, - 1, - 1 - ], - "375": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "376": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "380": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "381": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "382": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "383": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 1, - 1 - ], - "384": [ - 0, - 1, - 1 - ], - "385": [ - 1, - 1, - 1 - ], - "387": [ - 0, - 2, - 1 - ], - "388": [ - 0, - 1, - 1 - ], - "389": [ - 0, - 1, - 1 - ], - "393": [ - 0, - 1, - 1 - ], - "394": [ - 0, - 1, - 1 - ], - "395": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 2, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "406": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "412-sandy": [ - 2, - 2, - 2 - ], - "412-plant": [ - 1, - 1, - 1 - ], - "412-trash": [ - 1, - 1, - 1 - ], - "413-plant": [ - 1, - 1, - 1 - ], - "413-trash": [ - 1, - 1, - 1 - ], - "413-sandy": [ - 1, - 1, - 1 - ], - "414": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 1, - 1 - ], - "419": [ - 0, - 1, - 1 - ], - "422-west": [ - 1, - 1, - 1 - ], - "422-east": [ - 1, - 1, - 1 - ], - "423-west": [ - 1, - 1, - 1 - ], - "423-east": [ - 1, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "425": [ - 0, - 1, - 1 - ], - "426": [ - 0, - 1, - 1 - ], - "427": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "428": [ - 0, - 1, - 1 - ], - "429": [ - 1, - 1, - 1 - ], - "433": [ - 1, - 1, - 1 - ], - "436": [ - 0, - 1, - 1 - ], - "437": [ - 0, - 1, - 1 - ], - "438": [ - 0, - 1, - 1 - ], - "440": [ - 1, - 1, - 1 - ], - "441": [ - 0, - 1, - 2 - ], - "442": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "447": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "448": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 2, - 1 - ], - "458": [ - 0, - 2, - 2 - ], - "461": [ - 0, - 1, - 1 - ], - "462": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "466": [ - 2, - 1, - 1 - ], - "467": [ - 0, - 1, - 1 - ], - "468": [ - 1, - 1, - 1 - ], - "469": [ - 0, - 1, - 1 - ], - "470": [ - 2, - 2, - 1 - ], - "471": [ - 1, - 1, - 1 - ], - "472": [ - 0, - 1, - 1 - ], - "474": [ - 0, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "475": [ - 0, - 1, - 1 - ], - "478": [ - 0, - 2, - 1 - ], - "479-heat": [ - 0, - 1, - 1 - ], - "479-wash": [ - 0, - 1, - 1 - ], - "479-mow": [ - 0, - 1, - 1 - ], - "479-frost": [ - 0, - 1, - 1 - ], - "479": [ - 0, - 1, - 1 - ], - "479-fan": [ - 0, - 1, - 1 - ], - "480": [ - 1, - 1, - 1 - ], - "481": [ - 1, - 1, - 1 - ], - "482": [ - 1, - 1, - 1 - ], - "485": [ - 0, - 1, - 1 - ], - "487-altered": [ - 0, - 1, - 1 - ], - "487-origin": [ - 0, - 1, - 1 - ], - "488": [ - 0, - 1, - 1 - ], - "489": [ - 1, - 1, - 1 - ], - "490": [ - 1, - 1, - 1 - ], - "491": [ - 0, - 1, - 1 - ], - "492-land": [ - 0, - 1, - 1 - ], - "492-sky": [ - 0, - 1, - 1 - ], - "494": [ - 0, - 1, - 1 - ], - "495": [ - 0, - 1, - 1 - ], - "496": [ - 0, - 1, - 1 - ], - "497": [ - 0, - 1, - 1 - ], - "517": [ - 0, - 1, - 1 - ], - "518": [ - 0, - 1, - 1 - ], - "524": [ - 0, - 1, - 1 - ], - "525": [ - 0, - 1, - 1 - ], - "526": [ - 0, - 1, - 1 - ], - "529": [ - 0, - 2, - 2 - ], - "530": [ - 0, - 1, - 2 - ], - "531": [ - 0, - 1, - 1 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "532": [ - 0, - 1, - 1 - ], - "533": [ - 0, - 1, - 1 - ], - "534": [ - 0, - 1, - 1 - ], - "538": [ - 0, - 1, - 1 - ], - "539": [ - 0, - 2, - 2 - ], - "540": [ - 0, - 1, - 1 - ], - "541": [ - 0, - 1, - 1 - ], - "542": [ - 0, - 1, - 1 - ], - "543": [ - 0, - 1, - 1 - ], - "544": [ - 0, - 1, - 1 - ], - "545": [ - 0, - 1, - 1 - ], - "546": [ - 0, - 1, - 1 - ], - "547": [ - 0, - 1, - 1 - ], - "548": [ - 1, - 1, - 1 - ], - "549": [ - 0, - 1, - 1 - ], - "551": [ - 0, - 1, - 1 - ], - "552": [ - 0, - 1, - 1 - ], - "553": [ - 0, - 1, - 1 - ], - "556": [ - 0, - 1, - 1 - ], - "559": [ - 1, - 1, - 1 - ], - "560": [ - 1, - 1, - 1 - ], - "562": [ - 0, - 1, - 1 - ], - "563": [ - 0, - 1, - 1 - ], - "568": [ - 0, - 1, - 1 - ], - "569-gigantamax": [ - 0, - 1, - 1 - ], - "569": [ - 0, - 1, - 1 - ], - "570": [ - 0, - 1, - 1 - ], - "571": [ - 0, - 1, - 1 - ], - "572": [ - 0, - 1, - 1 - ], - "577": [ - 1, - 1, - 1 - ], - "578": [ - 1, - 1, - 1 - ], - "579": [ - 1, - 1, - 1 - ], - "585-autumn": [ - 2, - 0, - 0 - ], - "585-spring": [ - 2, - 0, - 0 - ], - "585-summer": [ - 1, - 0, - 0 - ], - "585-winter": [ - 2, - 0, - 0 - ], - "586-autumn": [ - 1, - 0, - 0 - ], - "586-spring": [ - 1, - 0, - 0 - ], - "586-summer": [ - 1, - 0, - 0 - ], - "586-winter": [ - 1, - 0, - 0 - ], - "592": [ - 0, - 1, - 2 - ], - "593": [ - 0, - 1, - 1 - ], - "594": [ - 0, - 1, - 2 - ], - "595": [ - 0, - 1, - 1 - ], - "596": [ - 0, - 1, - 1 - ], - "602": [ - 0, - 1, - 1 - ], - "603": [ - 0, - 1, - 1 - ], - "604": [ - 0, - 1, - 1 - ], - "605": [ - 1, - 1, - 1 - ], - "606": [ - 1, - 1, - 1 - ], - "607": [ - 0, - 1, - 1 - ], - "608": [ - 0, - 1, - 1 - ], - "609": [ - 0, - 1, - 1 - ], - "610": [ - 0, - 1, - 1 - ], - "611": [ - 0, - 1, - 1 - ], - "612": [ - 0, - 1, - 1 - ], - "618": [ - 0, - 2, - 2 - ], - "619": [ - 0, - 1, - 1 - ], - "620": [ - 0, - 1, - 1 - ], - "622": [ - 0, - 1, - 1 - ], - "623": [ - 0, - 1, - 1 - ], - "631": [ - 0, - 2, - 2 - ], - "632": [ - 0, - 1, - 1 - ], - "633": [ - 0, - 1, - 1 - ], - "634": [ - 0, - 1, - 1 - ], - "635": [ - 0, - 1, - 1 - ], - "636": [ - 0, - 1, - 1 - ], - "637": [ - 0, - 1, - 1 - ], - "640": [ - 0, - 1, - 1 - ], - "641-incarnate": [ - 0, - 0, - 0 - ], - "641-therian": [ - 0, - 0, - 0 - ], - "642-incarnate": [ - 0, - 0, - 0 - ], - "642-therian": [ - 0, - 0, - 0 - ], - "645-incarnate": [ - 0, - 0, - 0 - ], - "645-therian": [ - 0, - 0, - 0 - ], - "647-resolute": [ - 0, - 1, - 1 - ], - "647-ordinary": [ - 0, - 1, - 1 - ], - "648-aria": [ - 0, - 1, - 1 - ], - "648-pirouette": [ - 0, - 1, - 1 - ], - "649-burn": [ - 0, - 1, - 1 - ], - "649-chill": [ - 0, - 1, - 1 - ], - "649-douse": [ - 0, - 1, - 1 - ], - "649-shock": [ - 0, - 1, - 1 - ], - "649": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 1 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 1, - 1 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 1 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 1, - 1 - ], - "669-blue": [ - 0, - 1, - 1 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 1, - 1 - ], - "669-orange": [ - 0, - 1, - 1 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 1, - 1 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 1 - ], - "671-blue": [ - 0, - 1, - 1 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 1 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 2 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 1, - 1 - ], - "730": [ - 0, - 1, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 1, - 1 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791-radiant-sun": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792-full-moon": [ - 0, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809-gigantamax": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818-gigantamax": [ - 1, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823-gigantamax": [ - 0, - 2, - 2 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 1, - 1 - ], - "850": [ - 0, - 1, - 1 - ], - "851-gigantamax": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858-gigantamax": [ - 0, - 1, - 1 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861-gigantamax": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 2, - 2 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884-gigantamax": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-gigantamax-rapid": [ - 1, - 2, - 2 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "892-gigantamax-single": [ - 1, - 2, - 2 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 1, - 1 - ], - "914": [ - 0, - 1, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 1, - 1 - ], - "925-three": [ - 1, - 1, - 1 - ], - "932": [ - 0, - 1, - 1 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 1, - 1, - 1 - ], - "937": [ - 1, - 1, - 1 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 1, - 1 - ], - "958": [ - 1, - 1, - 1 - ], - "959": [ - 1, - 1, - 1 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 1, - 1 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 1, - 1 - ], - "979": [ - 1, - 1, - 1 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 2 - ], - "982-three-segment": [ - 0, - 1, - 2 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 1 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "1010": [ - 0, - 1, - 1 - ], - "1018": [ - 0, - 1, - 1 - ], - "1022": [ - 0, - 2, - 2 - ], - "1023": [ - 0, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "2670": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ], - "8901": [ - 1, - 1, - 1 - ], + "1": [0, 1, 1], + "2": [0, 1, 1], + "3-gigantamax": [0, 1, 1], + "3-mega": [0, 2, 2], + "3": [0, 1, 1], + "4": [0, 1, 1], + "5": [0, 1, 1], + "6-mega-x": [0, 1, 2], + "6-gigantamax": [0, 1, 2], + "6-mega-y": [0, 1, 2], + "6": [0, 2, 2], + "7": [0, 2, 2], + "8": [0, 2, 2], + "9-gigantamax": [0, 1, 2], + "9-mega": [0, 2, 2], + "9": [0, 2, 2], + "19": [0, 1, 1], + "20": [0, 1, 1], + "23": [0, 1, 1], + "24": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-gigantamax": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "29": [0, 1, 1], + "30": [0, 1, 1], + "31": [1, 1, 1], + "35": [0, 1, 1], + "36": [0, 2, 1], + "37": [0, 1, 1], + "38": [0, 1, 1], + "39": [0, 1, 1], + "40": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "43": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "46": [1, 1, 1], + "47": [1, 1, 1], + "50": [0, 1, 1], + "51": [0, 1, 1], + "52-gigantamax": [1, 1, 1], + "52": [1, 1, 1], + "53": [1, 1, 1], + "56": [1, 1, 1], + "57": [1, 1, 1], + "69": [0, 1, 1], + "70": [0, 1, 1], + "71": [0, 1, 1], + "77": [0, 1, 1], + "78": [0, 1, 1], + "79": [1, 1, 1], + "80": [0, 1, 1], + "80-mega": [0, 1, 1], + "81": [0, 1, 1], + "82": [0, 1, 1], + "83": [0, 2, 2], + "84": [1, 1, 1], + "85": [1, 1, 1], + "86": [1, 1, 1], + "87": [1, 1, 1], + "92": [2, 2, 2], + "93": [1, 1, 1], + "94-gigantamax": [1, 1, 1], + "94-mega": [1, 1, 1], + "94": [1, 1, 1], + "98": [0, 1, 1], + "99": [0, 1, 1], + "99-gigantamax": [0, 1, 1], + "100": [0, 1, 1], + "101": [0, 1, 1], + "102": [0, 1, 1], + "103": [0, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "113": [1, 1, 1], + "114": [0, 1, 1], + "116": [0, 1, 1], + "117": [0, 1, 1], + "118": [1, 1, 1], + "119": [1, 1, 1], + "120": [0, 1, 1], + "121": [0, 1, 1], + "123": [1, 1, 1], + "125": [1, 1, 2], + "126": [0, 2, 1], + "127-mega": [0, 1, 1], + "127": [0, 1, 1], + "128": [0, 1, 1], + "129": [0, 1, 1], + "130-mega": [0, 1, 1], + "130": [0, 1, 1], + "131-gigantamax": [0, 1, 1], + "131": [0, 1, 1], + "132": [0, 1, 1], + "133": [0, 1, 1], + "133-partner": [0, 1, 1], + "134": [0, 1, 1], + "135": [1, 1, 1], + "136": [1, 1, 1], + "137": [0, 1, 1], + "138": [0, 1, 1], + "139": [0, 1, 1], + "140": [0, 1, 1], + "141": [0, 1, 1], + "142-mega": [0, 1, 1], + "142": [0, 1, 1], + "144": [1, 1, 1], + "145": [1, 1, 1], + "146": [1, 1, 1], + "147": [0, 1, 1], + "148": [0, 1, 1], + "149": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "150": [0, 1, 1], + "151": [0, 1, 1], + "152": [0, 1, 1], + "153": [0, 1, 1], + "154": [0, 1, 1], + "158": [0, 1, 1], + "159": [0, 1, 1], + "160": [0, 1, 1], + "161": [0, 1, 1], + "162": [0, 1, 1], + "163": [0, 1, 1], + "164": [0, 1, 1], + "167": [0, 1, 1], + "168": [0, 1, 1], + "169": [0, 1, 1], + "170": [0, 1, 1], + "171": [0, 1, 1], + "172": [0, 1, 1], + "172-spiky": [0, 1, 1], + "173": [0, 1, 1], + "174": [0, 1, 1], + "175": [1, 1, 1], + "176": [1, 1, 1], + "177": [0, 1, 1], + "178": [0, 2, 2], + "179": [0, 1, 1], + "180": [0, 1, 2], + "181-mega": [0, 1, 2], + "181": [0, 1, 1], + "182": [0, 1, 1], + "183": [0, 1, 1], + "184": [0, 1, 1], + "185": [0, 1, 1], + "190": [0, 1, 1], + "193": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "196": [1, 1, 1], + "197": [0, 1, 1], + "198": [0, 1, 1], + "199": [2, 1, 1], + "200": [1, 2, 2], + "201-m": [0, 1, 1], + "201-question": [0, 1, 1], + "201-j": [0, 1, 1], + "201-l": [0, 1, 1], + "201-h": [0, 1, 1], + "201-x": [0, 1, 1], + "201-exclamation": [0, 1, 1], + "201-q": [0, 1, 1], + "201-s": [0, 1, 1], + "201-c": [0, 1, 1], + "201-u": [0, 1, 1], + "201-t": [0, 1, 1], + "201-z": [0, 1, 1], + "201-d": [0, 1, 1], + "201-b": [0, 1, 1], + "201-g": [0, 1, 1], + "201-k": [0, 1, 1], + "201-i": [0, 1, 1], + "201-p": [0, 1, 1], + "201-e": [0, 1, 1], + "201-y": [0, 1, 1], + "201-r": [0, 1, 1], + "201-f": [0, 1, 1], + "201-n": [0, 1, 1], + "201-v": [0, 1, 1], + "201-a": [0, 1, 1], + "201-w": [0, 1, 1], + "201-o": [0, 1, 1], + "203": [0, 1, 1], + "206": [0, 1, 1], + "207": [0, 1, 1], + "211": [0, 1, 1], + "212-mega": [1, 2, 1], + "212": [1, 1, 1], + "213": [0, 1, 1], + "215": [0, 1, 1], + "216": [1, 1, 1], + "217": [1, 1, 1], + "222": [0, 1, 1], + "226": [0, 1, 1], + "227": [0, 1, 1], + "228": [0, 1, 1], + "229": [0, 1, 1], + "229-mega": [0, 1, 1], + "230": [0, 1, 1], + "231": [0, 1, 1], + "232": [0, 1, 1], + "233": [0, 1, 1], + "235": [0, 1, 1], + "239": [1, 1, 2], + "240": [0, 1, 1], + "242": [1, 1, 1], + "243": [0, 1, 1], + "244": [0, 2, 2], + "245": [0, 1, 1], + "246": [0, 1, 1], + "247": [0, 1, 1], + "248": [0, 1, 1], + "248-mega": [0, 1, 1], + "249": [0, 1, 1], + "250": [0, 1, 1], + "251": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "257-mega": [0, 1, 1], + "261": [0, 1, 1], + "262": [0, 1, 1], + "263": [0, 1, 1], + "264": [0, 1, 1], + "276": [0, 1, 1], + "277": [0, 1, 1], + "278": [1, 1, 1], + "279": [1, 1, 1], + "280": [0, 1, 1], + "281": [0, 1, 1], + "282-mega": [0, 1, 1], + "282": [0, 1, 1], + "285": [0, 1, 1], + "286": [0, 1, 1], + "290": [1, 1, 1], + "291": [2, 2, 2], + "292": [2, 2, 2], + "298": [0, 1, 1], + "300": [1, 1, 1], + "301": [1, 1, 1], + "302": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [1, 1, 1], + "303": [1, 1, 1], + "304": [1, 1, 1], + "305": [1, 1, 1], + "306-mega": [1, 1, 1], + "306": [1, 1, 1], + "307": [0, 1, 1], + "308-mega": [0, 1, 1], + "308": [0, 1, 1], + "309": [0, 1, 1], + "310-mega": [0, 1, 1], + "310": [0, 1, 1], + "311": [1, 1, 1], + "312": [0, 1, 1], + "315": [0, 1, 1], + "320": [0, 1, 1], + "321": [0, 1, 1], + "327": [0, 1, 1], + "328": [0, 1, 1], + "329": [0, 1, 1], + "330": [0, 1, 1], + "333": [0, 1, 1], + "334-mega": [0, 1, 1], + "334": [0, 1, 1], + "335": [0, 2, 2], + "336": [0, 1, 1], + "337": [0, 1, 1], + "338": [0, 1, 1], + "339": [0, 2, 1], + "340": [0, 1, 2], + "341": [0, 1, 1], + "342": [0, 2, 2], + "351-rainy": [1, 1, 1], + "351-snowy": [1, 1, 1], + "351-sunny": [1, 1, 2], + "351": [0, 1, 1], + "352": [1, 1, 1], + "353": [0, 1, 1], + "354": [0, 1, 1], + "354-mega": [0, 1, 1], + "357": [0, 1, 1], + "358": [1, 1, 1], + "359": [0, 1, 1], + "359-mega": [0, 1, 1], + "361": [0, 1, 1], + "362": [0, 1, 1], + "362-mega": [0, 1, 1], + "369": [0, 2, 2], + "370": [0, 2, 2], + "371": [0, 1, 1], + "372": [0, 1, 1], + "373-mega": [0, 1, 1], + "373": [0, 1, 1], + "374": [0, 1, 1], + "375": [0, 1, 1], + "376-mega": [0, 1, 1], + "376": [0, 1, 1], + "377": [0, 1, 1], + "378": [1, 1, 1], + "379": [0, 1, 1], + "380-mega": [0, 1, 1], + "380": [0, 1, 1], + "381-mega": [0, 1, 1], + "381": [0, 1, 1], + "382-primal": [0, 1, 1], + "382": [0, 1, 1], + "383-primal": [0, 1, 1], + "383": [0, 1, 1], + "384-mega": [0, 1, 1], + "384": [0, 1, 1], + "385": [1, 1, 1], + "387": [0, 2, 1], + "388": [0, 1, 1], + "389": [0, 1, 1], + "390": [0, 1, 1], + "391": [0, 1, 1], + "392": [0, 1, 1], + "393": [0, 1, 1], + "394": [0, 1, 1], + "395": [0, 1, 1], + "399": [0, 2, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "406": [0, 1, 1], + "407": [0, 1, 1], + "412-sandy": [2, 2, 2], + "412-plant": [1, 1, 1], + "412-trash": [1, 1, 1], + "413-plant": [1, 1, 1], + "413-trash": [1, 1, 1], + "413-sandy": [1, 1, 1], + "414": [0, 1, 1], + "418": [0, 1, 1], + "419": [0, 1, 1], + "422-west": [1, 1, 1], + "422-east": [1, 1, 1], + "423-west": [1, 1, 1], + "423-east": [1, 1, 1], + "424": [0, 1, 1], + "425": [0, 1, 1], + "426": [0, 1, 1], + "427": [0, 1, 1], + "428-mega": [0, 1, 1], + "428": [0, 1, 1], + "429": [1, 1, 1], + "430": [0, 1, 1], + "433": [1, 1, 1], + "436": [0, 1, 1], + "437": [0, 1, 1], + "438": [0, 1, 1], + "440": [1, 1, 1], + "441": [0, 1, 2], + "442": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445-mega": [1, 1, 1], + "445": [1, 1, 1], + "447": [1, 1, 1], + "448-mega": [1, 1, 1], + "448": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "455": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 2, 1], + "458": [0, 2, 2], + "461": [0, 1, 1], + "462": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "466": [2, 1, 1], + "467": [0, 1, 1], + "468": [1, 1, 1], + "469": [0, 1, 1], + "470": [2, 2, 1], + "471": [1, 1, 1], + "472": [0, 1, 1], + "474": [0, 1, 1], + "475-mega": [0, 2, 2], + "475": [0, 1, 1], + "478": [0, 2, 1], + "479-heat": [0, 1, 1], + "479-wash": [0, 1, 1], + "479-mow": [0, 1, 1], + "479-frost": [0, 1, 1], + "479": [0, 1, 1], + "479-fan": [0, 1, 1], + "480": [1, 1, 1], + "481": [1, 1, 1], + "482": [1, 1, 1], + "485": [0, 1, 1], "486": [0, 1 , 1 + ] ,"487-altered": [0, 1, 1], + "487-origin": [0, 1, 1], + "488": [0, 1, 1], + "489": [1, 1, 1], + "490": [1, 1, 1], + "491": [0, 1, 1], + "492-land": [0, 1, 1], + "492-sky": [0, 1, 1], + "494": [0, 1, 1], + "495": [0, 1, 1], + "496": [0, 1, 1], + "497": [0, 1, 1], + "501": [0, 1, 1], + "502": [0, 1, 1], + "503": [0, 1, 1], + "517": [0, 1, 1], + "518": [0, 1, 1], + "524": [0, 1, 1], + "525": [0, 1, 1], + "526": [0, 1, 1], + "527": [0, 1, 1], + "528": [0, 1, 1], + "529": [0, 2, 2], + "530": [0, 1, 2], + "531": [0, 1, 1], + "531-mega": [0, 1, 1], + "532": [0, 1, 1], + "533": [0, 1, 1], + "534": [0, 1, 1], + "538": [0, 1, 1], + "539": [0, 2, 2], + "540": [0, 1, 1], + "541": [0, 1, 1], + "542": [0, 1, 1], + "543": [0, 1, 1], + "544": [0, 1, 1], + "545": [0, 1, 1], + "546": [0, 1, 1], + "547": [0, 1, 1], + "548": [1, 1, 1], + "549": [0, 1, 1], + "551": [0, 1, 1], + "552": [0, 1, 1], + "553": [0, 1, 1], + "556": [0, 1, 1], + "559": [1, 1, 1], + "560": [1, 1, 1], + "562": [0, 1, 1], + "563": [0, 1, 1], + "568": [0, 1, 1], + "569-gigantamax": [0, 1, 1], + "569": [0, 1, 1], + "570": [0, 1, 1], + "571": [0, 1, 1], + "572": [0, 1, 1], + "577": [1, 1, 1], + "578": [1, 1, 1], + "579": [1, 1, 1], + "585-autumn": [2, 0, 0], + "585-spring": [2, 0, 0], + "585-summer": [1, 0, 0], + "585-winter": [2, 0, 0], + "586-autumn": [1, 0, 0], + "586-spring": [1, 0, 0], + "586-summer": [1, 0, 0], + "586-winter": [1, 0, 0], + "587": [0, 1, 1], + "588": [0, 1, 1], + "589": [0, 1, 1], + "590": [0, 1, 1], + "591": [0, 1, 1], + "592": [0, 1, 2], + "593": [0, 1, 1], + "594": [0, 1, 2], + "595": [0, 1, 1], + "596": [0, 1, 1], + "602": [0, 1, 1], + "603": [0, 1, 1], + "604": [0, 1, 1], + "605": [1, 1, 1], + "606": [1, 1, 1], + "607": [0, 1, 1], + "608": [0, 1, 1], + "609": [0, 1, 1], + "610": [0, 1, 1], + "611": [0, 1, 1], + "612": [0, 1, 1], + "616": [0, 1, 1], + "617": [0, 1, 1], + "618": [0, 2, 2], + "619": [0, 1, 1], + "620": [0, 1, 1], + "621": [0, 1, 1], + "622": [0, 1, 1], + "623": [0, 1, 1], + "631": [0, 2, 2], + "632": [0, 1, 1], + "633": [0, 1, 1], + "634": [0, 1, 1], + "635": [0, 1, 1], + "636": [0, 1, 1], + "637": [0, 1, 1], + "640": [0, 1, 1], + "641-incarnate": [0, 0, 0], + "641-therian": [0, 0, 0], + "642-incarnate": [0, 0, 0], + "642-therian": [0, 0, 0], + "645-incarnate": [0, 0, 0], + "645-therian": [0, 0, 0], + "647-resolute": [0, 1, 1], + "647-ordinary": [0, 1, 1], + "648-aria": [0, 1, 1], + "648-pirouette": [0, 1, 1], + "649-burn": [0, 1, 1], + "649-chill": [0, 1, 1], + "649-douse": [0, 1, 1], + "649-shock": [0, 1, 1], + "649": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 2, 2], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 1, 1], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 1], + "666-polar": [0, 1, 1], + "666-river": [0, 2, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 1, 1], + "669-blue": [0, 1, 1], + "669-white": [0, 1, 1], + "669-yellow": [0, 1, 1], + "669-orange": [0, 1, 1], + "670-white": [0, 1, 1], + "670-blue": [0, 1, 1], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 1], + "671-blue": [0, 1, 1], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 1], + "671-orange": [0, 1, 1], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "676-dandy": [0, 1, 1], + "676-debutante": [0, 1, 1], + "676-diamond": [0, 1, 1], + "676-heart": [0, 1, 1], + "676-kabuki": [0, 1, 1], + "676-la-reine": [0, 1, 1], + "676-matron": [0, 1, 1], + "676-pharaoh": [0, 1, 1], + "676-star": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 2, 2], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 1, 1], + "730": [0, 1, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 1, 1], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791-radiant-sun": [0, 1, 1], + "791": [2, 1, 1], + "792-full-moon": [0, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809-gigantamax": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818-gigantamax": [1, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823-gigantamax": [0, 2, 2], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 1, 1], + "850": [0, 1, 1], + "851-gigantamax": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858-gigantamax": [0, 1, 1], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861-gigantamax": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 2, 2], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884-gigantamax": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890-eternamax": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-gigantamax-rapid": [1, 2, 2], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "892-gigantamax-single": [1, 2, 2], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 1, 1], + "914": [0, 1, 1], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 1, 1], + "925-three": [1, 1, 1], + "932": [0, 1, 1], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [1, 1, 1], + "937": [1, 1, 1], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 1, 1], + "958": [1, 1, 1], + "959": [1, 1, 1], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 1, 1], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 1, 1], + "979": [1, 1, 1], + "981": [0, 1, 1], + "982": [0, 1, 2], + "982-three-segment": [0, 1, 2], + "987": [1, 1, 1], + "988": [0, 1, 1], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "1010": [0, 1, 1], + "1012-counterfeit": [0, 1, 1], + "1013-unremarkable": [0, 1, 1], + "1018": [0, 1, 1], + "1022": [0, 2, 2], + "1023": [0, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "2670": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], + "8901": [1, 1, 1], "female": { - "3": [ - 0, - 1, - 1 - ], - "19": [ - 0, - 1, - 1 - ], - "20": [ - 0, - 1, - 1 - ], - "41": [ - 0, - 1, - 1 - ], - "42": [ - 0, - 1, - 1 - ], - "44": [ - 0, - 1, - 1 - ], - "45": [ - 0, - 1, - 1 - ], - "84": [ - 1, - 1, - 1 - ], - "85": [ - 1, - 1, - 1 - ], - "111": [ - 0, - 1, - 1 - ], - "112": [ - 0, - 1, - 1 - ], - "118": [ - 0, - 1, - 1 - ], - "119": [ - 0, - 1, - 1 - ], - "123": [ - 1, - 1, - 1 - ], - "129": [ - 0, - 1, - 1 - ], - "130": [ - 0, - 1, - 1 - ], - "178": [ - 0, - 2, - 2 - ], - "185": [ - 0, - 1, - 1 - ], - "190": [ - 0, - 1, - 1 - ], - "203": [ - 0, - 1, - 1 - ], - "207": [ - 0, - 1, - 1 - ], - "215": [ - 0, - 1, - 1 - ], - "217": [ - 1, - 1, - 1 - ], - "229": [ - 0, - 1, - 1 - ], - "232": [ - 0, - 1, - 1 - ], - "255": [ - 0, - 1, - 1 - ], - "256": [ - 0, - 1, - 1 - ], - "257": [ - 0, - 1, - 1 - ], - "307": [ - 0, - 1, - 1 - ], - "308": [ - 0, - 1, - 1 - ], - "315": [ - 0, - 1, - 1 - ], - "369": [ - 0, - 1, - 1 - ], - "399": [ - 0, - 2, - 1 - ], - "400": [ - 0, - 1, - 1 - ], - "401": [ - 0, - 1, - 1 - ], - "402": [ - 0, - 1, - 1 - ], - "407": [ - 0, - 1, - 1 - ], - "418": [ - 0, - 2, - 2 - ], - "419": [ - 0, - 1, - 1 - ], - "424": [ - 0, - 1, - 1 - ], - "443": [ - 1, - 1, - 1 - ], - "444": [ - 1, - 1, - 1 - ], - "445": [ - 1, - 1, - 1 - ], - "453": [ - 0, - 1, - 1 - ], - "454": [ - 0, - 1, - 1 - ], - "456": [ - 0, - 1, - 1 - ], - "457": [ - 0, - 1, - 1 - ], - "461": [ - 0, - 1, - 1 - ], - "464": [ - 0, - 1, - 1 - ], - "465": [ - 0, - 1, - 1 - ], - "592": [ - 1, - 1, - 1 - ], - "593": [ - 1, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ] + "3": [0,1, 1], + "19": [0, 1, 1], + "20": [0, 1, 1], + "25": [0, 1, 1], + "25-beauty-cosplay": [0, 1, 1], + "25-cool-cosplay": [0, 1, 1], + "25-cosplay": [0, 1, 1], + "25-cute-cosplay": [0, 1, 1], + "25-partner": [0, 1, 1], + "25-smart-cosplay": [0, 1, 1], + "25-tough-cosplay": [0, 1, 1], + "26": [0, 1, 1], + "41": [0, 1, 1], + "42": [0, 1, 1], + "44": [0, 1, 1], + "45": [0, 1, 1], + "84": [1, 1, 1], + "85": [1, 1, 1], + "111": [0, 1, 1], + "112": [0, 1, 1], + "118": [0, 1, 1], + "119": [0, 1, 1], + "123": [1, 1, 1], + "129": [0, 1, 1], + "130": [0, 1, 1], + "154": [0, 1, 1], + "178": [0, 2, 2], + "185": [0, 1, 1], + "190": [0, 1, 1], + "194": [0, 1, 1], + "195": [0, 1, 1], + "198": [0, 1, 1], + "203": [0, 1, 1], + "207": [0, 1, 1], + "215": [0, 1, 1], + "217": [1, 1, 1], + "229": [0, 1, 1], + "232": [0, 1, 1], + "255": [0, 1, 1], + "256": [0, 1, 1], + "257": [0, 1, 1], + "307": [0, 1, 1], + "308": [0, 1, 1], + "315": [0, 1, 1], + "369": [0, 1, 1], + "399": [0, 2, 1], + "400": [0, 1, 1], + "401": [0, 1, 1], + "402": [0, 1, 1], + "407": [0, 1, 1], + "418": [0, 2, 2], + "419": [0, 1, 1], + "424": [0, 1, 1], + "443": [1, 1, 1], + "444": [1, 1, 1], + "445": [1, 1, 1], + "453": [0, 1, 1], + "454": [0, 1, 1], + "456": [0, 1, 1], + "457": [0, 1, 1], + "461": [0, 1, 1], + "464": [0, 1, 1], + "465": [0, 1, 1], + "592": [1, 1, 1], + "593": [1, 1, 1], + "6215": [0, 1, 1] } }, "exp": { - "3-mega": [ - 0, - 2, - 2 - ], - "6-mega-x": [ - 0, - 2, - 2 - ], - "6-mega-y": [ - 0, - 2, - 2 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "94-mega": [ - 2, - 2, - 2 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "212-mega": [ - 1, - 1, - 2 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 1, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 2, - 2 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 0, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 2, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 2, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 1, - 1 - ], - "666-archipelago": [ - 0, - 1, - 1 - ], - "666-continental": [ - 0, - 1, - 1 - ], - "666-elegant": [ - 0, - 1, - 1 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 1, - 1 - ], - "666-high-plains": [ - 0, - 1, - 1 - ], - "666-icy-snow": [ - 0, - 1, - 1 - ], - "666-jungle": [ - 0, - 1, - 1 - ], - "666-marine": [ - 0, - 1, - 1 - ], - "666-meadow": [ - 0, - 2, - 2 - ], - "666-modern": [ - 0, - 1, - 1 - ], - "666-monsoon": [ - 0, - 1, - 1 - ], - "666-ocean": [ - 0, - 1, - 1 - ], - "666-poke-ball": [ - 0, - 1, - 2 - ], - "666-polar": [ - 0, - 1, - 1 - ], - "666-river": [ - 0, - 2, - 1 - ], - "666-sandstorm": [ - 0, - 1, - 1 - ], - "666-savanna": [ - 0, - 1, - 1 - ], - "666-sun": [ - 0, - 1, - 1 - ], - "666-tundra": [ - 0, - 1, - 1 - ], - "669-red": [ - 0, - 2, - 2 - ], - "669-blue": [ - 0, - 1, - 1 - ], - "669-white": [ - 0, - 1, - 1 - ], - "669-yellow": [ - 0, - 1, - 1 - ], - "669-orange": [ - 0, - 2, - 2 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 1, - 1 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 2 - ], - "671-blue": [ - 0, - 1, - 2 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 2 - ], - "671-orange": [ - 0, - 1, - 2 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 1, - 1 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 2, - 1 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 2, - 2 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 2, - 2 - ], - "730": [ - 0, - 2, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 2, - 2 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "770": [ - 0, - 0, - 0 - ], - "771": [ - 0, - 2, - 2 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 1, - 1 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791": [ - 2, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 2, - 2 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818": [ - 1, - 1, - 1 - ], - "821": [ - 0, - 2, - 2 - ], - "822": [ - 0, - 1, - 1 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 2, - 2 - ], - "850": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 2, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 2, - 1 - ], - "890-eternamax": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 2, - 2 - ], - "912": [ - 0, - 1, - 2 - ], - "913": [ - 0, - 1, - 2 - ], - "914": [ - 0, - 2, - 1 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 2, - 2 - ], - "925-three": [ - 1, - 2, - 2 - ], - "932": [ - 0, - 2, - 2 - ], - "933": [ - 0, - 2, - 2 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 1, - 1, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 1, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 2, - 2, - 2 - ], - "958": [ - 2, - 2, - 2 - ], - "959": [ - 2, - 2, - 2 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 1, - 1 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 2, - 2 - ], - "979": [ - 2, - 2, - 2 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 2 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 2 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 2, - 2 - ], - "998": [ - 0, - 2, - 2 - ], - "999": [ - 2, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 1 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 0 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 1, - 1 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], + "3-mega": [0, 2, 2], + "6-mega-x": [0, 2, 2], + "6-mega-y": [0, 2, 2], + "80-mega": [0, 1, 1], + "94-mega": [2, 2, 2], + "127-mega": [0, 1, 1], + "130-mega": [0, 1, 1], + "142-mega": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "181-mega": [0, 1, 2], + "212-mega": [1, 1, 2], + "229-mega": [0, 1, 1], + "248-mega": [0, 1, 1], + "257-mega": [0, 1, 1], + "282-mega": [0, 2, 2], + "302-mega": [0, 1, 1], + "303-mega": [0, 1, 1], + "306-mega": [1, 1, 1], + "308-mega": [0, 1, 1], + "310-mega": [0, 1, 1], + "334-mega": [0, 2, 1], + "354-mega": [0, 1, 1], + "359-mega": [0, 1, 1], + "362-mega": [0, 1, 1], + "373-mega": [0, 1, 1], + "376-mega": [0, 1, 1], + "380-mega": [0, 1, 1], + "381-mega": [0, 1, 1], + "382-primal": [0, 1, 1], + "383-primal": [0, 1, 1], + "384-mega": [0, 2, 1], + "428-mega": [0, 1, 1], + "445-mega": [1, 1, 1], + "448-mega": [1, 1, 1], + "475-mega": [0, 2, 2], + "531-mega": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 1, 1], + "666-archipelago": [0, 1, 1], + "666-continental": [0, 1, 1], + "666-elegant": [0, 1, 1], + "666-fancy": [0, 2, 2], + "666-garden": [0, 1, 1], + "666-high-plains": [0, 1, 1], + "666-icy-snow": [0, 1, 1], + "666-jungle": [0, 1, 1], + "666-marine": [0, 1, 1], + "666-meadow": [0, 2, 2], + "666-modern": [0, 1, 1], + "666-monsoon": [0, 1, 1], + "666-ocean": [0, 1, 1], + "666-poke-ball": [0, 1, 2], + "666-polar": [0, 1, 1], + "666-river": [0, 2, 1], + "666-sandstorm": [0, 1, 1], + "666-savanna": [0, 1, 1], + "666-sun": [0, 1, 1], + "666-tundra": [0, 1, 1], + "669-red": [0, 2, 2], + "669-blue": [0, 1, 1], + "669-white": [0, 1, 1], + "669-yellow": [0, 1, 1], + "669-orange": [0, 2, 2], + "670-white": [0, 1, 1], + "670-blue": [0, 1, 1], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 2], + "671-blue": [0, 1, 2], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 2], + "671-orange": [0, 1, 2], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 1, 1], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 2, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 2, 2], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 2, 2], + "730": [0, 2, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 2, 2], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "770": [0, 0, 0], + "771": [0, 2, 2], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 1, 1], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791": [2, 1, 1], + "792": [0, 1, 1], + "793": [0, 2, 2], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818": [1, 1, 1], + "821": [0, 2, 2], + "822": [0, 1, 1], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 2, 2], + "850": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 2, 1], + "883": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890": [0, 2, 1], + "890-eternamax": [0, 1, 1], + "891": [1, 1, 1], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 2, 2], + "912": [0, 1, 2], + "913": [0, 1, 2], + "914": [0, 2, 1], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 2, 2], + "925-three": [1, 2, 2], + "932": [0, 2, 2], + "933": [0, 2, 2], + "934": [0, 1, 1], + "935": [1, 1, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 1, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [2, 2, 2], + "958": [2, 2, 2], + "959": [2, 2, 2], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 1, 1], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 2, 2], + "979": [2, 2, 2], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 2], + "993": [0, 1, 1], + "994": [0, 1, 2], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 2, 2], + "998": [0, 2, 2], + "999": [2, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 1], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 0], + "2103": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 1, 1], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1], "female": {}, "back": { - "3-mega": [ - 0, - 2, - 2 - ], - "6-mega-x": [ - 0, - 2, - 2 - ], - "6-mega-y": [ - 0, - 1, - 2 - ], - "80-mega": [ - 0, - 1, - 1 - ], - "94-mega": [ - 1, - 1, - 1 - ], - "127-mega": [ - 0, - 1, - 1 - ], - "130-mega": [ - 0, - 1, - 1 - ], - "142-mega": [ - 0, - 1, - 1 - ], - "150-mega-x": [ - 0, - 1, - 1 - ], - "150-mega-y": [ - 0, - 1, - 1 - ], - "181-mega": [ - 0, - 1, - 2 - ], - "212-mega": [ - 1, - 2, - 2 - ], - "229-mega": [ - 0, - 1, - 1 - ], - "248-mega": [ - 0, - 2, - 1 - ], - "257-mega": [ - 0, - 1, - 1 - ], - "282-mega": [ - 0, - 1, - 1 - ], - "302-mega": [ - 0, - 1, - 1 - ], - "303-mega": [ - 0, - 1, - 1 - ], - "306-mega": [ - 1, - 1, - 1 - ], - "308-mega": [ - 0, - 1, - 1 - ], - "310-mega": [ - 0, - 1, - 1 - ], - "334-mega": [ - 0, - 1, - 1 - ], - "354-mega": [ - 0, - 1, - 1 - ], - "362-mega": [ - 0, - 1, - 1 - ], - "373-mega": [ - 0, - 1, - 1 - ], - "376-mega": [ - 0, - 1, - 1 - ], - "380-mega": [ - 0, - 1, - 1 - ], - "381-mega": [ - 0, - 1, - 1 - ], - "382-primal": [ - 0, - 1, - 1 - ], - "383-primal": [ - 0, - 1, - 1 - ], - "384-mega": [ - 0, - 1, - 1 - ], - "428-mega": [ - 0, - 1, - 1 - ], - "445-mega": [ - 1, - 1, - 1 - ], - "448-mega": [ - 1, - 1, - 1 - ], - "475-mega": [ - 0, - 2, - 2 - ], - "531-mega": [ - 0, - 1, - 1 - ], - "653": [ - 0, - 1, - 1 - ], - "654": [ - 0, - 1, - 1 - ], - "655": [ - 0, - 1, - 1 - ], - "664": [ - 0, - 1, - 1 - ], - "665": [ - 0, - 2, - 1 - ], - "666-archipelago": [ - 0, - 2, - 2 - ], - "666-continental": [ - 0, - 2, - 2 - ], - "666-elegant": [ - 0, - 2, - 2 - ], - "666-fancy": [ - 0, - 2, - 2 - ], - "666-garden": [ - 0, - 2, - 2 - ], - "666-high-plains": [ - 0, - 2, - 2 - ], - "666-icy-snow": [ - 0, - 2, - 2 - ], - "666-jungle": [ - 0, - 2, - 2 - ], - "666-marine": [ - 0, - 2, - 2 - ], - "666-meadow": [ - 0, - 2, - 2 - ], - "666-modern": [ - 0, - 2, - 2 - ], - "666-monsoon": [ - 0, - 2, - 2 - ], - "666-ocean": [ - 0, - 2, - 2 - ], - "666-poke-ball": [ - 0, - 2, - 2 - ], - "666-polar": [ - 0, - 2, - 2 - ], - "666-river": [ - 0, - 2, - 2 - ], - "666-sandstorm": [ - 0, - 2, - 2 - ], - "666-savanna": [ - 0, - 2, - 2 - ], - "666-sun": [ - 0, - 2, - 2 - ], - "666-tundra": [ - 0, - 2, - 2 - ], - "669-red": [ - 0, - 2, - 2 - ], - "669-blue": [ - 0, - 2, - 2 - ], - "669-white": [ - 0, - 2, - 2 - ], - "669-yellow": [ - 0, - 2, - 2 - ], - "669-orange": [ - 0, - 2, - 2 - ], - "670-white": [ - 0, - 1, - 1 - ], - "670-blue": [ - 0, - 2, - 2 - ], - "670-orange": [ - 0, - 1, - 1 - ], - "670-red": [ - 0, - 1, - 1 - ], - "670-yellow": [ - 0, - 1, - 1 - ], - "671-red": [ - 0, - 1, - 1 - ], - "671-blue": [ - 0, - 1, - 1 - ], - "671-yellow": [ - 0, - 1, - 1 - ], - "671-white": [ - 0, - 1, - 1 - ], - "671-orange": [ - 0, - 1, - 1 - ], - "672": [ - 0, - 1, - 1 - ], - "673": [ - 0, - 1, - 1 - ], - "677": [ - 0, - 1, - 1 - ], - "678-female": [ - 0, - 1, - 1 - ], - "678": [ - 0, - 1, - 1 - ], - "690": [ - 0, - 1, - 1 - ], - "691": [ - 0, - 1, - 1 - ], - "696": [ - 0, - 1, - 1 - ], - "697": [ - 0, - 1, - 1 - ], - "698": [ - 0, - 1, - 1 - ], - "699": [ - 0, - 2, - 2 - ], - "700": [ - 0, - 1, - 1 - ], - "702": [ - 0, - 1, - 1 - ], - "703": [ - 0, - 1, - 1 - ], - "704": [ - 0, - 1, - 1 - ], - "705": [ - 0, - 1, - 1 - ], - "706": [ - 0, - 1, - 1 - ], - "708": [ - 0, - 1, - 1 - ], - "709": [ - 0, - 1, - 1 - ], - "710": [ - 0, - 1, - 1 - ], - "711": [ - 1, - 1, - 1 - ], - "712": [ - 0, - 1, - 1 - ], - "713": [ - 0, - 1, - 1 - ], - "714": [ - 0, - 1, - 1 - ], - "715": [ - 0, - 1, - 1 - ], - "716-active": [ - 0, - 1, - 1 - ], - "716-neutral": [ - 0, - 1, - 1 - ], - "717": [ - 0, - 1, - 1 - ], - "720-unbound": [ - 1, - 1, - 1 - ], - "720": [ - 1, - 1, - 1 - ], - "728": [ - 0, - 1, - 1 - ], - "729": [ - 0, - 2, - 2 - ], - "730": [ - 0, - 2, - 1 - ], - "734": [ - 0, - 1, - 1 - ], - "735": [ - 0, - 1, - 1 - ], - "742": [ - 0, - 2, - 2 - ], - "743": [ - 0, - 2, - 2 - ], - "747": [ - 0, - 2, - 2 - ], - "748": [ - 0, - 1, - 1 - ], - "751": [ - 0, - 1, - 1 - ], - "752": [ - 0, - 1, - 1 - ], - "753": [ - 0, - 1, - 1 - ], - "754": [ - 0, - 2, - 2 - ], - "755": [ - 0, - 1, - 1 - ], - "756": [ - 0, - 1, - 1 - ], - "761": [ - 0, - 1, - 1 - ], - "762": [ - 0, - 1, - 1 - ], - "763": [ - 0, - 1, - 1 - ], - "767": [ - 0, - 1, - 1 - ], - "768": [ - 0, - 1, - 1 - ], - "771": [ - 0, - 1, - 1 - ], - "772": [ - 0, - 1, - 1 - ], - "773-fighting": [ - 0, - 1, - 1 - ], - "773-psychic": [ - 0, - 1, - 1 - ], - "773-poison": [ - 0, - 1, - 1 - ], - "773-ground": [ - 0, - 1, - 1 - ], - "773-ghost": [ - 0, - 1, - 1 - ], - "773-steel": [ - 0, - 1, - 1 - ], - "773-rock": [ - 0, - 1, - 1 - ], - "773-grass": [ - 0, - 1, - 1 - ], - "773-dragon": [ - 0, - 1, - 1 - ], - "773-bug": [ - 0, - 1, - 1 - ], - "773-ice": [ - 0, - 1, - 1 - ], - "773-dark": [ - 0, - 1, - 1 - ], - "773": [ - 0, - 1, - 1 - ], - "773-fairy": [ - 0, - 1, - 1 - ], - "773-water": [ - 0, - 1, - 1 - ], - "773-electric": [ - 0, - 1, - 1 - ], - "773-flying": [ - 0, - 1, - 1 - ], - "773-fire": [ - 0, - 1, - 1 - ], - "776": [ - 0, - 2, - 2 - ], - "777": [ - 0, - 1, - 1 - ], - "778-busted": [ - 0, - 1, - 1 - ], - "778-disguised": [ - 0, - 1, - 1 - ], - "779": [ - 0, - 1, - 1 - ], - "789": [ - 1, - 1, - 1 - ], - "790": [ - 0, - 1, - 1 - ], - "791": [ - 1, - 1, - 1 - ], - "792": [ - 0, - 1, - 1 - ], - "793": [ - 0, - 1, - 1 - ], - "797": [ - 0, - 1, - 1 - ], - "798": [ - 0, - 1, - 1 - ], - "800-dawn-wings": [ - 0, - 1, - 1 - ], - "800-dusk-mane": [ - 0, - 1, - 1 - ], - "800-ultra": [ - 0, - 1, - 1 - ], - "800": [ - 0, - 1, - 1 - ], - "802": [ - 1, - 1, - 1 - ], - "803": [ - 0, - 1, - 1 - ], - "804": [ - 0, - 1, - 1 - ], - "808": [ - 0, - 1, - 1 - ], - "809": [ - 0, - 1, - 1 - ], - "816": [ - 0, - 1, - 1 - ], - "817": [ - 0, - 1, - 1 - ], - "818": [ - 0, - 1, - 1 - ], - "821": [ - 0, - 1, - 1 - ], - "822": [ - 0, - 1, - 1 - ], - "823": [ - 0, - 1, - 1 - ], - "829": [ - 0, - 1, - 1 - ], - "830": [ - 0, - 1, - 1 - ], - "835": [ - 0, - 1, - 1 - ], - "836": [ - 0, - 1, - 1 - ], - "850": [ - 0, - 1, - 1 - ], - "851": [ - 0, - 1, - 1 - ], - "854": [ - 0, - 1, - 1 - ], - "855": [ - 0, - 1, - 1 - ], - "856": [ - 0, - 1, - 1 - ], - "857": [ - 0, - 2, - 2 - ], - "858": [ - 0, - 1, - 1 - ], - "859": [ - 0, - 1, - 1 - ], - "860": [ - 0, - 1, - 1 - ], - "861": [ - 0, - 1, - 1 - ], - "862": [ - 0, - 1, - 1 - ], - "863": [ - 0, - 1, - 1 - ], - "864": [ - 0, - 1, - 1 - ], - "867": [ - 0, - 1, - 1 - ], - "872": [ - 1, - 1, - 1 - ], - "873": [ - 1, - 1, - 1 - ], - "876-female": [ - 0, - 1, - 1 - ], - "876": [ - 0, - 1, - 1 - ], - "877-hangry": [ - 1, - 1, - 1 - ], - "877": [ - 1, - 1, - 1 - ], - "880": [ - 0, - 1, - 1 - ], - "881": [ - 0, - 1, - 1 - ], - "882": [ - 0, - 1, - 1 - ], - "883": [ - 0, - 1, - 1 - ], - "884": [ - 0, - 1, - 1 - ], - "885": [ - 1, - 1, - 1 - ], - "886": [ - 1, - 1, - 1 - ], - "887": [ - 1, - 1, - 1 - ], - "888": [ - 0, - 1, - 1 - ], - "888-crowned": [ - 0, - 1, - 1 - ], - "889": [ - 0, - 1, - 1 - ], - "889-crowned": [ - 0, - 1, - 1 - ], - "890": [ - 0, - 1, - 1 - ], - "891": [ - 1, - 1, - 1 - ], - "892-rapid-strike": [ - 1, - 1, - 1 - ], - "892": [ - 1, - 1, - 1 - ], - "896": [ - 1, - 1, - 1 - ], - "897": [ - 1, - 1, - 1 - ], - "898": [ - 1, - 1, - 1 - ], - "898-ice": [ - 1, - 1, - 1 - ], - "898-shadow": [ - 1, - 1, - 1 - ], - "900": [ - 0, - 1, - 1 - ], - "901": [ - 0, - 1, - 1 - ], - "903": [ - 0, - 1, - 1 - ], - "909": [ - 0, - 1, - 1 - ], - "910": [ - 0, - 2, - 2 - ], - "911": [ - 0, - 1, - 1 - ], - "912": [ - 0, - 1, - 1 - ], - "913": [ - 0, - 1, - 1 - ], - "914": [ - 0, - 2, - 2 - ], - "919": [ - 1, - 1, - 1 - ], - "920": [ - 1, - 1, - 1 - ], - "924": [ - 1, - 1, - 1 - ], - "925-four": [ - 1, - 2, - 2 - ], - "925-three": [ - 1, - 2, - 2 - ], - "932": [ - 0, - 1, - 1 - ], - "933": [ - 0, - 1, - 1 - ], - "934": [ - 0, - 1, - 1 - ], - "935": [ - 2, - 2, - 2 - ], - "936": [ - 2, - 2, - 2 - ], - "937": [ - 2, - 2, - 2 - ], - "940": [ - 0, - 1, - 1 - ], - "941": [ - 0, - 1, - 1 - ], - "948": [ - 0, - 1, - 1 - ], - "949": [ - 0, - 1, - 1 - ], - "951": [ - 0, - 1, - 1 - ], - "952": [ - 0, - 2, - 1 - ], - "953": [ - 0, - 1, - 1 - ], - "954": [ - 0, - 1, - 1 - ], - "957": [ - 1, - 1, - 1 - ], - "958": [ - 1, - 1, - 1 - ], - "959": [ - 1, - 1, - 1 - ], - "962": [ - 1, - 1, - 1 - ], - "967": [ - 0, - 1, - 1 - ], - "968": [ - 0, - 2, - 2 - ], - "969": [ - 0, - 1, - 1 - ], - "970": [ - 0, - 1, - 1 - ], - "973": [ - 1, - 1, - 1 - ], - "974": [ - 0, - 1, - 1 - ], - "975": [ - 0, - 1, - 1 - ], - "978-curly": [ - 0, - 2, - 2 - ], - "978-droopy": [ - 0, - 2, - 2 - ], - "978-stretchy": [ - 0, - 1, - 1 - ], - "979": [ - 1, - 1, - 1 - ], - "981": [ - 0, - 1, - 1 - ], - "982": [ - 0, - 1, - 1 - ], - "982-three-segment": [ - 0, - 1, - 1 - ], - "987": [ - 1, - 1, - 1 - ], - "988": [ - 0, - 1, - 1 - ], - "993": [ - 0, - 1, - 1 - ], - "994": [ - 0, - 1, - 1 - ], - "995": [ - 0, - 1, - 1 - ], - "996": [ - 0, - 1, - 1 - ], - "997": [ - 0, - 1, - 1 - ], - "998": [ - 0, - 1, - 1 - ], - "999": [ - 1, - 1, - 1 - ], - "1000": [ - 1, - 1, - 1 - ], - "1001": [ - 0, - 1, - 1 - ], - "1003": [ - 0, - 1, - 1 - ], - "1004": [ - 0, - 1, - 1 - ], - "1006": [ - 0, - 2, - 2 - ], - "1007-apex-build": [ - 0, - 2, - 2 - ], - "1008-ultimate-mode": [ - 1, - 1, - 1 - ], - "2027": [ - 0, - 1, - 1 - ], - "2028": [ - 0, - 1, - 1 - ], - "2052": [ - 0, - 1, - 1 - ], - "2053": [ - 0, - 1, - 1 - ], - "4052": [ - 0, - 1, - 1 - ], - "4077": [ - 0, - 1, - 1 - ], - "4078": [ - 0, - 1, - 1 - ], - "4079": [ - 0, - 1, - 1 - ], - "4080": [ - 2, - 2, - 2 - ], - "4144": [ - 0, - 1, - 1 - ], - "4145": [ - 0, - 1, - 1 - ], - "4146": [ - 0, - 1, - 1 - ], - "4199": [ - 2, - 1, - 1 - ], - "4222": [ - 0, - 1, - 1 - ], - "4263": [ - 0, - 1, - 1 - ], - "4264": [ - 0, - 1, - 1 - ], - "4562": [ - 0, - 1, - 1 - ], - "6100": [ - 0, - 1, - 1 - ], - "6101": [ - 0, - 1, - 1 - ], - "6215": [ - 0, - 1, - 1 - ], - "6549": [ - 0, - 1, - 1 - ], - "6570": [ - 0, - 1, - 1 - ], - "6571": [ - 0, - 1, - 1 - ], - "6705": [ - 0, - 1, - 1 - ], - "6706": [ - 0, - 1, - 1 - ], - "6713": [ - 0, - 1, - 1 - ] - }, - "6713": [ - 0, - 1, - 1 - ] + "3-mega": [0, 2, 2], + "6-mega-x": [0, 2, 2], + "6-mega-y": [0, 1, 2], + "80-mega": [0, 1, 1], + "94-mega": [1, 1, 1], + "127-mega": [0, 1, 1], + "130-mega": [0, 1, 1], + "142-mega": [0, 1, 1], + "150-mega-x": [0, 1, 1], + "150-mega-y": [0, 1, 1], + "181-mega": [0, 1, 2], + "212-mega": [1, 2, 2], + "229-mega": [0, 1, 1], + "248-mega": [0, 2, 1], + "257-mega": [0, 1, 1], + "282-mega": [0, 1, 1], + "302-mega": [0, 1, 1], + "303-mega": [0, 1, 1], + "306-mega": [1, 1, 1], + "308-mega": [0, 1, 1], + "310-mega": [0, 1, 1], + "334-mega": [0, 1, 1], + "354-mega": [0, 1, 1], + "359-mega": [0, 1, 1], + "362-mega": [0, 1, 1], + "373-mega": [0, 1, 1], + "376-mega": [0, 1, 1], + "380-mega": [0, 1, 1], + "381-mega": [0, 1, 1], + "382-primal": [0, 1, 1], + "383-primal": [0, 1, 1], + "384-mega": [0, 1, 1], + "428-mega": [0, 1, 1], + "445-mega": [1, 1, 1], + "448-mega": [1, 1, 1], + "475-mega": [0, 2, 2], + "531-mega": [0, 1, 1], + "653": [0, 1, 1], + "654": [0, 1, 1], + "655": [0, 1, 1], + "656": [0, 1, 1], + "657": [0, 1, 1], + "658": [0, 1, 1], + "658-ash": [0, 1, 1], + "664": [0, 1, 1], + "665": [0, 2, 1], + "666-archipelago": [0, 2, 2], + "666-continental": [0, 2, 2], + "666-elegant": [0, 2, 2], + "666-fancy": [0, 2, 2], + "666-garden": [0, 2, 2], + "666-high-plains": [0, 2, 2], + "666-icy-snow": [0, 2, 2], + "666-jungle": [0, 2, 2], + "666-marine": [0, 2, 2], + "666-meadow": [0, 2, 2], + "666-modern": [0, 2, 2], + "666-monsoon": [0, 2, 2], + "666-ocean": [0, 2, 2], + "666-poke-ball": [0, 2, 2], + "666-polar": [0, 2, 2], + "666-river": [0, 2, 2], + "666-sandstorm": [0, 2, 2], + "666-savanna": [0, 2, 2], + "666-sun": [0, 2, 2], + "666-tundra": [0, 2, 2], + "669-red": [0, 2, 2], + "669-blue": [0, 2, 2], + "669-white": [0, 2, 2], + "669-yellow": [0, 2, 2], + "669-orange": [0, 2, 2], + "670-white": [0, 1, 1], + "670-blue": [0, 2, 2], + "670-orange": [0, 1, 1], + "670-red": [0, 1, 1], + "670-yellow": [0, 1, 1], + "671-red": [0, 1, 1], + "671-blue": [0, 1, 1], + "671-yellow": [0, 1, 1], + "671-white": [0, 1, 1], + "671-orange": [0, 1, 1], + "672": [0, 1, 1], + "673": [0, 1, 1], + "676": [0, 1, 1], + "677": [0, 1, 1], + "678-female": [0, 1, 1], + "678": [0, 1, 1], + "682": [0, 1, 1], + "683": [0, 1, 1], + "684": [0, 1, 1], + "685": [0, 1, 1], + "688": [0, 1, 1], + "689": [0, 1, 1], + "690": [0, 1, 1], + "691": [0, 1, 1], + "696": [0, 1, 1], + "697": [0, 1, 1], + "698": [0, 1, 1], + "699": [0, 2, 2], + "700": [0, 1, 1], + "702": [0, 1, 1], + "703": [0, 1, 1], + "704": [0, 1, 1], + "705": [0, 1, 1], + "706": [0, 1, 1], + "708": [0, 1, 1], + "709": [0, 1, 1], + "710": [0, 1, 1], + "711": [1, 1, 1], + "712": [0, 1, 1], + "713": [0, 1, 1], + "714": [0, 1, 1], + "715": [0, 1, 1], + "716-active": [0, 1, 1], + "716-neutral": [0, 1, 1], + "717": [0, 1, 1], + "720-unbound": [1, 1, 1], + "720": [1, 1, 1], + "728": [0, 1, 1], + "729": [0, 2, 2], + "730": [0, 2, 1], + "734": [0, 1, 1], + "735": [0, 1, 1], + "742": [0, 2, 2], + "743": [0, 2, 2], + "747": [0, 2, 2], + "748": [0, 1, 1], + "751": [0, 1, 1], + "752": [0, 1, 1], + "753": [0, 1, 1], + "754": [0, 2, 2], + "755": [0, 1, 1], + "756": [0, 1, 1], + "761": [0, 1, 1], + "762": [0, 1, 1], + "763": [0, 1, 1], + "767": [0, 1, 1], + "768": [0, 1, 1], + "771": [0, 1, 1], + "772": [0, 1, 1], + "773-fighting": [0, 1, 1], + "773-psychic": [0, 1, 1], + "773-poison": [0, 1, 1], + "773-ground": [0, 1, 1], + "773-ghost": [0, 1, 1], + "773-steel": [0, 1, 1], + "773-rock": [0, 1, 1], + "773-grass": [0, 1, 1], + "773-dragon": [0, 1, 1], + "773-bug": [0, 1, 1], + "773-ice": [0, 1, 1], + "773-dark": [0, 1, 1], + "773": [0, 1, 1], + "773-fairy": [0, 1, 1], + "773-water": [0, 1, 1], + "773-electric": [0, 1, 1], + "773-flying": [0, 1, 1], + "773-fire": [0, 1, 1], + "776": [0, 2, 2], + "777": [0, 1, 1], + "778-busted": [0, 1, 1], + "778-disguised": [0, 1, 1], + "779": [0, 1, 1], + "789": [1, 1, 1], + "790": [0, 1, 1], + "791": [1, 1, 1], + "792": [0, 1, 1], + "793": [0, 1, 1], + "797": [0, 1, 1], + "798": [0, 1, 1], + "800-dawn-wings": [0, 1, 1], + "800-dusk-mane": [0, 1, 1], + "800-ultra": [0, 1, 1], + "800": [0, 1, 1], + "802": [1, 1, 1], + "803": [0, 1, 1], + "804": [0, 1, 1], + "807": [0, 1, 1], + "808": [0, 1, 1], + "809": [0, 1, 1], + "816": [0, 1, 1], + "817": [0, 1, 1], + "818": [0, 1, 1], + "821": [0, 1, 1], + "822": [0, 1, 1], + "823": [0, 1, 1], + "829": [0, 1, 1], + "830": [0, 1, 1], + "835": [0, 1, 1], + "836": [0, 1, 1], + "850": [0, 1, 1], + "851": [0, 1, 1], + "854": [0, 1, 1], + "855": [0, 1, 1], + "856": [0, 1, 1], + "857": [0, 2, 2], + "858": [0, 1, 1], + "859": [0, 1, 1], + "860": [0, 1, 1], + "861": [0, 1, 1], + "862": [0, 1, 1], + "863": [0, 1, 1], + "864": [0, 1, 1], + "867": [0, 1, 1], + "872": [1, 1, 1], + "873": [1, 1, 1], + "876-female": [0, 1, 1], + "876": [0, 1, 1], + "877-hangry": [1, 1, 1], + "877": [1, 1, 1], + "880": [0, 1, 1], + "881": [0, 1, 1], + "882": [0, 1, 1], + "883": [0, 1, 1], + "884": [0, 1, 1], + "885": [1, 1, 1], + "886": [1, 1, 1], + "887": [1, 1, 1], + "888": [0, 1, 1], + "888-crowned": [0, 1, 1], + "889": [0, 1, 1], + "889-crowned": [0, 1, 1], + "890": [0, 1, 1], + "891": [1, 1, 1], + "892-rapid-strike": [1, 1, 1], + "892": [1, 1, 1], + "894": [0, 1, 1], + "895": [0, 1, 1], + "896": [1, 1, 1], + "897": [1, 1, 1], + "898": [1, 1, 1], + "898-ice": [1, 1, 1], + "898-shadow": [1, 1, 1], + "900": [0, 1, 1], + "901": [0, 1, 1], + "903": [0, 1, 1], + "909": [0, 1, 1], + "910": [0, 2, 2], + "911": [0, 1, 1], + "912": [0, 1, 1], + "913": [0, 1, 1], + "914": [0, 2, 2], + "919": [1, 1, 1], + "920": [1, 1, 1], + "924": [1, 1, 1], + "925-four": [1, 2, 2], + "925-three": [1, 2, 2], + "932": [0, 1, 1], + "933": [0, 1, 1], + "934": [0, 1, 1], + "935": [2, 2, 2], + "936": [2, 2, 2], + "937": [2, 2, 2], + "940": [0, 1, 1], + "941": [0, 1, 1], + "944": [0, 1, 1], + "945": [0, 1, 1], + "948": [0, 1, 1], + "949": [0, 1, 1], + "951": [0, 1, 1], + "952": [0, 2, 1], + "953": [0, 1, 1], + "954": [0, 1, 1], + "957": [1, 1, 1], + "958": [1, 1, 1], + "959": [1, 1, 1], + "962": [1, 1, 1], + "967": [0, 1, 1], + "968": [0, 2, 2], + "969": [0, 1, 1], + "970": [0, 1, 1], + "973": [1, 1, 1], + "974": [0, 1, 1], + "975": [0, 1, 1], + "978-curly": [0, 2, 2], + "978-droopy": [0, 2, 2], + "978-stretchy": [0, 1, 1], + "979": [1, 1, 1], + "981": [0, 1, 1], + "982": [0, 1, 1], + "982-three-segment": [0, 1, 1], + "987": [1, 1, 1], + "988": [0, 1, 1], + "993": [0, 1, 1], + "994": [0, 1, 1], + "995": [0, 1, 1], + "996": [0, 1, 1], + "997": [0, 1, 1], + "998": [0, 1, 1], + "999": [1, 1, 1], + "1000": [1, 1, 1], + "1001": [0, 1, 1], + "1003": [0, 1, 1], + "1004": [0, 1, 1], + "1006": [0, 2, 2], + "1007-apex-build": [0, 2, 2], + "1008-ultimate-mode": [1, 1, 1], + "2026": [0, 1, 1], + "2027": [0, 1, 1], + "2028": [0, 1, 1], + "2052": [0, 1, 1], + "2053": [0, 1, 1], + "2103": [0, 1, 1], + "4052": [0, 1, 1], + "4077": [0, 1, 1], + "4078": [0, 1, 1], + "4079": [0, 1, 1], + "4080": [2, 2, 2], + "4144": [0, 1, 1], + "4145": [0, 1, 1], + "4146": [0, 1, 1], + "4199": [2, 1, 1], + "4222": [0, 1, 1], + "4263": [0, 1, 1], + "4264": [0, 1, 1], + "4562": [0, 1, 1], + "6100": [0, 1, 1], + "6101": [0, 1, 1], + "6215": [0, 1, 1], + "6503": [0, 1, 1], + "6549": [0, 1, 1], + "6570": [0, 1, 1], + "6571": [0, 1, 1], + "6705": [0, 1, 1], + "6706": [0, 1, 1], + "6713": [0, 1, 1] + } } } diff --git a/public/images/pokemon/variant/back/1012-counterfeit.json b/public/images/pokemon/variant/back/1012-counterfeit.json new file mode 100644 index 00000000000..10255311fe0 --- /dev/null +++ b/public/images/pokemon/variant/back/1012-counterfeit.json @@ -0,0 +1,34 @@ +{ + "1": { + "291e1e": "404ec8", + "87847e": "8a96c0", + "78c463": "f7dfc5", + "4c3a3a": "667fe9", + "5d9e4a": "dda08a", + "251b1b": "222078", + "a09750": "acbedf", + "e6e1db": "f5fdff", + "396725": "b0654a", + "ccc374": "e9f4f7", + "613f19": "7b86ad", + "544040": "626a96", + "c1b9ae": "c8ddf1", + "69441b": "3a44a4" + }, + "2": { + "291e1e": "37183f", + "87847e": "070722", + "78c463": "c3b4e0", + "4c3a3a": "563f5b", + "5d9e4a": "978dc7", + "251b1b": "1c0b1f", + "a09750": "1b2556", + "e6e1db": "212b5e", + "396725": "7a5aa7", + "ccc374": "293363", + "613f19": "0d1030", + "544040": "020109", + "c1b9ae": "111039", + "69441b": "44244b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/1013-unremarkable.json b/public/images/pokemon/variant/back/1013-unremarkable.json new file mode 100644 index 00000000000..2a6de98db5a --- /dev/null +++ b/public/images/pokemon/variant/back/1013-unremarkable.json @@ -0,0 +1,36 @@ +{ + "1": { + "5d9e4a": "dda08a", + "a09750": "c3d7eb", + "251b1b": "404ec8", + "7b6f6c": "acbedf", + "c1b9ae": "cbe1f5", + "69441b": "3a44a4", + "342405": "565e7a", + "78c463": "f7dfc5", + "9e8574": "b36171", + "988975": "939ec4", + "295217": "b0654a", + "e6e1db": "e6f9ff", + "6a5b20": "8a96c0", + "291a0d": "222078", + "453636": "667fe9" + }, + "2": { + "5d9e4a": "978dc7", + "a09750": "263665", + "251b1b": "37183f", + "7b6f6c": "0f102d", + "c1b9ae": "111039", + "69441b": "44244b", + "342405": "0b0c21", + "78c463": "c3b4e0", + "9e8574": "585d81", + "988975": "212e57", + "295217": "7a5aa7", + "e6e1db": "212b5e", + "6a5b20": "171542", + "291a0d": "170d26", + "453636": "563f5b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/102.json b/public/images/pokemon/variant/back/102.json new file mode 100644 index 00000000000..61035a495c9 --- /dev/null +++ b/public/images/pokemon/variant/back/102.json @@ -0,0 +1,20 @@ +{ + "1": { + "943131": "193662", + "e69c00": "a0694c", + "ffe6ce": "7ae49f", + "ffce4a": "cea573", + "ffb58c": "369b96", + "ef8463": "26647e", + "ffd6ad": "4fba94" + }, + "2": { + "943131": "414189", + "e69c00": "6d2341", + "ffe6ce": "ebb6f8", + "ffce4a": "92394b", + "ffb58c": "9475ce", + "ef8463": "6c5fb6", + "ffd6ad": "b98fe4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/103.json b/public/images/pokemon/variant/back/103.json new file mode 100644 index 00000000000..492bc14b102 --- /dev/null +++ b/public/images/pokemon/variant/back/103.json @@ -0,0 +1,28 @@ +{ + "1": { + "ffde6b": "a3c4ed", + "e6ad5a": "869fdc", + "73ad31": "dea44c", + "8c7342": "283f5b", + "526329": "c8592a", + "9cd64a": "f4e774", + "a56b21": "6072ba", + "b59c4a": "426378", + "734210": "373e85", + "ffefa5": "d3efff", + "524210": "131d33" + }, + "2": { + "ffde6b": "eb748d", + "e6ad5a": "c84e7f", + "73ad31": "3d324b", + "8c7342": "d59cba", + "526329": "1f1a31", + "9cd64a": "6a5b73", + "a56b21": "83295f", + "b59c4a": "ffdbe7", + "734210": "4e1044", + "ffefa5": "ffa29d", + "524210": "925b81" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/128.json b/public/images/pokemon/variant/back/128.json new file mode 100644 index 00000000000..ef61b186930 --- /dev/null +++ b/public/images/pokemon/variant/back/128.json @@ -0,0 +1,30 @@ +{ + "1": { + "dea54a": "56b393", + "634a31": "173e0d", + "9c9cad": "997059", + "6b6b84": "75413b", + "b58431": "2e8a85", + "8c6b52": "355816", + "523a10": "102d4b", + "ad8c73": "5f722a", + "4a3a29": "072b05", + "8c6321": "215c72", + "cecede": "c2a082", + "3a3a4a": "4d2324" + }, + "2": { + "dea54a": "872b3b", + "634a31": "bc9681", + "9c9cad": "edda95", + "6b6b84": "cca45e", + "b58431": "5e172e", + "8c6b52": "d6c3aa", + "523a10": "2f0e21", + "ad8c73": "faf9ed", + "4a3a29": "966959", + "8c6321": "461029", + "cecede": "fffcc1", + "3a3a4a": "996537" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/152.json b/public/images/pokemon/variant/back/152.json new file mode 100644 index 00000000000..2460f5977d5 --- /dev/null +++ b/public/images/pokemon/variant/back/152.json @@ -0,0 +1,26 @@ +{ + "1": { + "849452": "7373b4", + "b5ce6b": "aca1d7", + "d6f78c": "ded2f1", + "84e631": "8074fa", + "ef7b7b": "9bd5c1", + "c52929": "77b3af", + "6bb529": "6f4be2", + "425a19": "505d8d", + "638c29": "6633bc", + "426319": "5d2398" + }, + "2": { + "849452": "a62775", + "b5ce6b": "c83c74", + "d6f78c": "e7617d", + "84e631": "feeeaf", + "ef7b7b": "71cf71", + "c52929": "4eac60", + "6bb529": "f0d187", + "425a19": "801a69", + "638c29": "d8a864", + "426319": "b4814b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/153.json b/public/images/pokemon/variant/back/153.json new file mode 100644 index 00000000000..8495177fbaa --- /dev/null +++ b/public/images/pokemon/variant/back/153.json @@ -0,0 +1,26 @@ +{ + "1": { + "a58419": "5961ce", + "ad3100": "47d0d1", + "295208": "232699", + "8cbd31": "8251dc", + "debd29": "7b8ce6", + "527b08": "4d36be", + "6b9c10": "6b41cc", + "f7e64a": "a2bbf8", + "6b5200": "493fa6", + "d68c52": "80f5e6" + }, + "2": { + "a58419": "a8244d", + "ad3100": "439227", + "295208": "c58c48", + "8cbd31": "fae084", + "debd29": "ca333d", + "527b08": "e8bc5e", + "6b9c10": "edc870", + "f7e64a": "ea704a", + "6b5200": "891b4f", + "d68c52": "8ec349" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/154.json b/public/images/pokemon/variant/back/154.json new file mode 100644 index 00000000000..a667f36b9c1 --- /dev/null +++ b/public/images/pokemon/variant/back/154.json @@ -0,0 +1,26 @@ +{ + "1": { + "634a00": "519aa7", + "ff3a5a": "3542a7", + "e6ad00": "7bcfc6", + "ce213a": "27217d", + "63bd42": "9d86d9", + "f7a59c": "72d1da", + "7b103a": "23124e", + "107b31": "8057b2", + "ffde21": "b1f2dc", + "9ce652": "b7afee" + }, + "2": { + "634a00": "488939", + "ff3a5a": "f9db74", + "e6ad00": "6bac4b", + "ce213a": "e5b650", + "63bd42": "a31f60", + "f7a59c": "fff6a9", + "7b103a": "b7873b", + "107b31": "761858", + "ffde21": "92c462", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/158.json b/public/images/pokemon/variant/back/158.json new file mode 100644 index 00000000000..a6c54577e98 --- /dev/null +++ b/public/images/pokemon/variant/back/158.json @@ -0,0 +1,29 @@ +{ + "1": { + "b54a52": "1d5d6c", + "6bb5e6": "dd8e59", + "94d6ff": "fdc17e", + "ffc552": "99d4d9", + "ad8429": "4798ab", + "ce4221": "772c52", + "3184c5": "ae5139", + "e67b7b": "749e9e", + "ef735a": "ad5778", + "7b1900": "4f0332", + "315a84": "73131e" + }, + "2": { + "000000": "ffffff", + "b54a52": "c48b27", + "6bb5e6": "97ac5b", + "94d6ff": "ccd198", + "ffc552": "2f5365", + "ad8429": "1c314f", + "ce4221": "ce8c20", + "3184c5": "4f854a", + "e67b7b": "e4b843", + "ef735a": "f3b649", + "7b1900": "a66b14", + "315a84": "2b4a30" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/159.json b/public/images/pokemon/variant/back/159.json new file mode 100644 index 00000000000..c1124bb8d42 --- /dev/null +++ b/public/images/pokemon/variant/back/159.json @@ -0,0 +1,29 @@ +{ + "1": { + "3a4a84": "973027", + "e64221": "749e9e", + "ce293a": "682c4e", + "5aade6": "e5a354", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "3184c5": "cd6537", + "cebd63": "56b3bd", + "6b5200": "085d75", + "840009": "1d5d6c", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "3a4a84": "26472b", + "e64221": "e4b843", + "ce293a": "ce8c20", + "5aade6": "8fa54e", + "ffe68c": "2f5365", + "840008": "a66b14", + "3184c5": "468040", + "cebd63": "1c314f", + "6b5200": "112034", + "840009": "c48b27", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/160.json b/public/images/pokemon/variant/back/160.json new file mode 100644 index 00000000000..ac9067df672 --- /dev/null +++ b/public/images/pokemon/variant/back/160.json @@ -0,0 +1,29 @@ +{ + "1": { + "8cd6ff": "ffcf72", + "6b5200": "085d75", + "ce293a": "682c4e", + "5ab5f7": "eda857", + "cebd63": "56b3bd", + "ffe68c": "a9e4e5", + "840008": "4f1037", + "294a8c": "973027", + "3a8cce": "d26738", + "ff8c84": "926877", + "f7525a": "774860" + }, + "2": { + "000000": "ffffff", + "8cd6ff": "d1d692", + "6b5200": "112034", + "ce293a": "ce8c20", + "5ab5f7": "9ab350", + "cebd63": "1c314f", + "ffe68c": "2f5365", + "840008": "a66b14", + "294a8c": "274c2d", + "3a8cce": "498a42", + "ff8c84": "fff284", + "f7525a": "f3b649" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/167.json b/public/images/pokemon/variant/back/167.json new file mode 100644 index 00000000000..65a2a2dedf9 --- /dev/null +++ b/public/images/pokemon/variant/back/167.json @@ -0,0 +1,24 @@ +{ + "1": { + "52b56b": "e5812a", + "000000": "ffffff", + "c5b519": "3f2e71", + "314a10": "641218", + "8ce631": "f2ba40", + "527b29": "d54f1a", + "846b29": "221b57", + "ffe64a": "624095" + }, + "2": { + "52b56b": "b54158", + "bdc5c5": "a1b7de", + "c5b519": "7d95b9", + "314a10": "481229", + "ffffff": "cde6fc", + "8ce631": "dd7081", + "527b29": "8c2848", + "846b29": "565e8d", + "ffe64a": "aac3d6", + "6b6b73": "62657d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/168.json b/public/images/pokemon/variant/back/168.json new file mode 100644 index 00000000000..7a4270ff9c0 --- /dev/null +++ b/public/images/pokemon/variant/back/168.json @@ -0,0 +1,29 @@ +{ + "1": { + "c54242": "62b943", + "6b5219": "043435", + "63319c": "e28220", + "bdbdbd": "b5d3dc", + "520000": "317945", + "ff5a4a": "a8d919", + "c5b54a": "15463c", + "ffde42": "186c45", + "ff8c73": "dce24b", + "bd84e6": "f1b940", + "6b6b6b": "5f7980" + }, + "2": { + "c54242": "7ca5c6", + "6b5219": "161437", + "63319c": "96304a", + "bdbdbd": "c09fa1", + "520000": "2d3d72", + "ff5a4a": "a3c8d1", + "c5b54a": "1f2150", + "ffffff": "fae8e7", + "ffde42": "313b60", + "ff8c73": "c4e8e7", + "bd84e6": "c8545d", + "6b6b6b": "605050" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/170.json b/public/images/pokemon/variant/back/170.json new file mode 100644 index 00000000000..6f6317314fb --- /dev/null +++ b/public/images/pokemon/variant/back/170.json @@ -0,0 +1,30 @@ +{ + "1": { + "08295a": "691f03", + "ffce52": "a1dbba", + "295294": "a14713", + "ffef84": "ccffd7", + "5a73c5": "dda13d", + "94cee6": "ffeabf", + "522919": "052b38", + "ffffde": "f2fff5", + "c59400": "84bda9", + "7bbde6": "ffe0a2", + "846352": "45757a", + "6ba5e6": "f6e37f" + }, + "2": { + "08295a": "1b072f", + "ffce52": "e25765", + "295294": "441e56", + "ffef84": "f97f7f", + "5a73c5": "693373", + "94cee6": "a15b8d", + "522919": "720b3a", + "ffffde": "ffc4be", + "c59400": "b62b51", + "7bbde6": "9f5a9b", + "846352": "931b3c", + "6ba5e6": "89498d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/171.json b/public/images/pokemon/variant/back/171.json new file mode 100644 index 00000000000..8a9cafe4265 --- /dev/null +++ b/public/images/pokemon/variant/back/171.json @@ -0,0 +1,30 @@ +{ + "1": { + "a5314a": "bf882c", + "4a7bce": "bc3c4c", + "423110": "05333a", + "ef635a": "efde5a", + "7badef": "f6907f", + "a5ceff": "fbcdb3", + "e6b552": "82ca4f", + "6394e6": "e86062", + "ffde63": "c3e875", + "ad9442": "2a8d3d", + "293173": "872341", + "7b634a": "0c5540" + }, + "2": { + "a5314a": "c3851d", + "4a7bce": "9781b3", + "423110": "040529", + "ef635a": "f0d050", + "7badef": "eecfed", + "a5ceff": "fbf5fa", + "e6b552": "3294b8", + "6394e6": "c5a5d0", + "ffde63": "4dd5d9", + "ad9442": "23689e", + "293173": "4b426c", + "7b634a": "0c1d4c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172-spiky.json b/public/images/pokemon/variant/back/172-spiky.json new file mode 100644 index 00000000000..f4c5e28b61a --- /dev/null +++ b/public/images/pokemon/variant/back/172-spiky.json @@ -0,0 +1,23 @@ +{ + "1": { + "c5ad10": "6cab9a", + "845a29": "45818a", + "a57b08": "5ca390", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "634a10": "30536b", + "f7e652": "a3d1a8" + }, + "2": { + "c5ad10": "4a6a90", + "845a29": "283567", + "171721": "9a4440", + "a57b08": "486a8e", + "212131": "d48d61", + "7d1c1c": "c38218", + "424252": "e7c17c", + "e77b94": "f5dd94", + "634a10": "2b2f54", + "f7e652": "7095ab" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172-spiky_2.png b/public/images/pokemon/variant/back/172-spiky_2.png new file mode 100644 index 00000000000..9e9994d6b19 Binary files /dev/null and b/public/images/pokemon/variant/back/172-spiky_2.png differ diff --git a/public/images/pokemon/variant/back/172-spiky_3.png b/public/images/pokemon/variant/back/172-spiky_3.png new file mode 100644 index 00000000000..260de86af53 Binary files /dev/null and b/public/images/pokemon/variant/back/172-spiky_3.png differ diff --git a/public/images/pokemon/variant/back/172.json b/public/images/pokemon/variant/back/172.json new file mode 100644 index 00000000000..18c7f5bdee4 --- /dev/null +++ b/public/images/pokemon/variant/back/172.json @@ -0,0 +1,23 @@ +{ + "1": { + "c5ad10": "6cab9a", + "845a29": "45818a", + "a57b08": "5ca390", + "7d1c1c": "992424", + "e77b94": "bd4d5e", + "634a10": "30536b", + "f7e652": "a3d1a8" + }, + "2": { + "c5ad10": "4a6a90", + "845a29": "283567", + "171721": "9a4440", + "a57b08": "486a8e", + "212131": "d48d61", + "7d1c1c": "c38218", + "424252": "e7c17c", + "e77b94": "f5dd94", + "634a10": "2f335b", + "f7e652": "7095ab" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/172_2.png b/public/images/pokemon/variant/back/172_2.png new file mode 100644 index 00000000000..84a35b18ead Binary files /dev/null and b/public/images/pokemon/variant/back/172_2.png differ diff --git a/public/images/pokemon/variant/back/172_3.png b/public/images/pokemon/variant/back/172_3.png new file mode 100644 index 00000000000..b94789940f5 Binary files /dev/null and b/public/images/pokemon/variant/back/172_3.png differ diff --git a/public/images/pokemon/variant/back/174.json b/public/images/pokemon/variant/back/174.json new file mode 100644 index 00000000000..eaabbbc574d --- /dev/null +++ b/public/images/pokemon/variant/back/174.json @@ -0,0 +1,14 @@ +{ + "1": { + "9c1952": "3a6472", + "b55273": "43737d", + "e6849c": "81c2b8", + "ffadbd": "c5ebd5" + }, + "2": { + "9c1952": "9c5200", + "b55273": "a16b30", + "e6849c": "f5c45b", + "ffadbd": "f5e884" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/194.json b/public/images/pokemon/variant/back/194.json new file mode 100644 index 00000000000..83297ce4e5b --- /dev/null +++ b/public/images/pokemon/variant/back/194.json @@ -0,0 +1,20 @@ +{ + "1": { + "529ce6": "e8983d", + "9463a5": "65b1c2", + "633a6b": "204954", + "3a7bc5": "d5682e", + "73bdff": "ffc355", + "d65ad6": "81e2f7", + "104a84": "7a150a" + }, + "2": { + "529ce6": "564daa", + "9463a5": "cf933b", + "633a6b": "80301c", + "3a7bc5": "3f377e", + "73bdff": "5c66c4", + "d65ad6": "e9cb52", + "104a84": "180d42" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/195.json b/public/images/pokemon/variant/back/195.json new file mode 100644 index 00000000000..f79c398dc81 --- /dev/null +++ b/public/images/pokemon/variant/back/195.json @@ -0,0 +1,26 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "637ba5": "936e66", + "639cbd": "dc6a4d", + "3194a5": "81e2f7", + "6b5a8c": "23768d", + "425284": "b03844", + "426b84": "af4237", + "195a6b": "54aec2", + "19423a": "204954" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "637ba5": "692d5d", + "639cbd": "493a8d", + "3194a5": "e9cb52", + "6b5a8c": "742f3d", + "425284": "240830", + "426b84": "3d237b", + "195a6b": "cf933b", + "19423a": "b96228" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/198.json b/public/images/pokemon/variant/back/198.json new file mode 100644 index 00000000000..eed8404265c --- /dev/null +++ b/public/images/pokemon/variant/back/198.json @@ -0,0 +1,26 @@ +{ + "1": { + "d94352": "8c1b23", + "314263": "462b20", + "efd684": "a6a6b3", + "d64252": "b3986b", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "73293a": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "8c1b23", + "314263": "0e4333", + "efd684": "c2723a", + "d64252": "bc4b84", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "73293a": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2026.json b/public/images/pokemon/variant/back/2026.json new file mode 100644 index 00000000000..4fb224dd489 --- /dev/null +++ b/public/images/pokemon/variant/back/2026.json @@ -0,0 +1,31 @@ +{ + "1": { + "b45f25": "2d5261", + "552720": "162f4b", + "f9ed9f": "eb999a", + "e9be14": "945c7b", + "e3882d": "3d7375", + "646124": "492652", + "ecd8b7": "b4c2a5", + "fffdfb": "d6d9ca", + "846b5b": "467f85", + "965821": "2f4e6b", + "dfc043": "d17577", + "602c24": "162f4b", + "fef443": "c48081", + "993c20": "1d3a57" + }, + "2": { + "b45f25": "bd8551", + "552720": "43617f", + "e9be14": "1a3551", + "e3882d": "d3b06f", + "646124": "122140", + "ecd8b7": "5a6f90", + "fffdfb": "6d8297", + "846b5b": "202746", + "965821": "9cb3ca", + "fef443": "3a5873", + "993c20": "965636" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/2103.json b/public/images/pokemon/variant/back/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/back/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/211.json b/public/images/pokemon/variant/back/211.json new file mode 100644 index 00000000000..01ae33500a4 --- /dev/null +++ b/public/images/pokemon/variant/back/211.json @@ -0,0 +1,22 @@ +{ + "1": { + "a5ad6b": "ad6643", + "194a52": "321128", + "dede94": "f1c17c", + "428494": "80294b", + "c5c57b": "dc9565", + "3a6363": "611a42", + "6b5231": "6d2c2c", + "73adb5": "a0415e" + }, + "2": { + "a5ad6b": "1e275b", + "194a52": "1c2f5b", + "dede94": "365492", + "428494": "60abdc", + "c5c57b": "2b3e7b", + "3a6363": "396796", + "6b5231": "181f46", + "73adb5": "8bd9ee" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-beauty-cosplay.json b/public/images/pokemon/variant/back/25-beauty-cosplay.json new file mode 100644 index 00000000000..216262b149b --- /dev/null +++ b/public/images/pokemon/variant/back/25-beauty-cosplay.json @@ -0,0 +1,30 @@ +{ + "1": { + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "cecab9": "cfc8aa", + "f7e860": "eddc78", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "9c5200": "315c75", + "39509d": "47449c", + "fffdea": "f8ffe3", + "f7cc2f": "d5ac44" + }, + "2": { + "1e1526": "a45233", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "cecab9": "b84084", + "f7e860": "eddc78", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "9c5200": "283361", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "4f454c": "f1b571", + "f7cc2f": "d5ac44" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cool-cosplay.json b/public/images/pokemon/variant/back/25-cool-cosplay.json new file mode 100644 index 00000000000..278feb070bd --- /dev/null +++ b/public/images/pokemon/variant/back/25-cool-cosplay.json @@ -0,0 +1,31 @@ +{ + "1": { + "171717": "2a1d36", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "ba2b23": "b73850", + "9c5200": "1c4f75", + "d95b45": "cf6887", + "3b3b40": "4a3e46" + }, + "2": { + "171717": "a45233", + "656f86": "cf752b", + "a5b0b6": "f0b541", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "ba2b23": "2c2c47", + "55555e": "8f4b32", + "9c5200": "22325c", + "f4f7ab": "eadbb3", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "272b2b": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cosplay.json b/public/images/pokemon/variant/back/25-cosplay.json new file mode 100644 index 00000000000..c574d63d743 --- /dev/null +++ b/public/images/pokemon/variant/back/25-cosplay.json @@ -0,0 +1,26 @@ +{ + "1": { + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "f7bd21": "79b5a5", + "52525a": "4f454c", + "9c5200": "315c75", + "292929": "1e1526", + "633108": "09406b", + "e65a42": "cf6182", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "f7bd21": "445f8a", + "52525a": "f1b571", + "9c5200": "23345e", + "292929": "a45233", + "633108": "22244f", + "e65a42": "eedd9c", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-cute-cosplay.json b/public/images/pokemon/variant/back/25-cute-cosplay.json new file mode 100644 index 00000000000..7b26b79d08f --- /dev/null +++ b/public/images/pokemon/variant/back/25-cute-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "752bd0": "5452b7", + "baa998": "bab699", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "cf4770": "cf4a59", + "f3bace": "f2bbbb", + "853247": "85323c", + "f7ef97": "f0eaa8", + "52525a": "4f454c", + "292929": "30263b", + "f7bd21": "79b5a5", + "9c5200": "255e8a" + }, + "2": { + "752bd0": "7751c2", + "baa998": "d3ab5a", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "cf4770": "739b55", + "f3bace": "c5cc85", + "853247": "254b30", + "f7ef97": "ebe7b7", + "52525a": "f1b571", + "292929": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-gigantamax.json b/public/images/pokemon/variant/back/25-gigantamax.json new file mode 100644 index 00000000000..1c47104e04d --- /dev/null +++ b/public/images/pokemon/variant/back/25-gigantamax.json @@ -0,0 +1,30 @@ +{ + "1": { + "623108": "09406b", + "c52018": "ad4e76", + "de9400": "338087", + "fefefe": "ffffff", + "f6bd20": "79b5a5", + "fff6a4": "c4e3c3", + "fff9c2": "b8ffd9", + "e65a41": "cf6182", + "9c5200": "315c75", + "f8fc4b": "5bc28b", + "f6e652": "a3d1a8" + }, + "2": { + "623108": "22244f", + "c52018": "ebc67c", + "de9400": "324472", + "fefefe": "ffffff", + "f6bd20": "445f8a", + "fff6a4": "7b96aa", + "fff9c2": "83b1d2", + "e65a41": "eedd9c", + "9c5200": "23345e", + "f8fc4b": "326a9f", + "695d65": "f1b571", + "f6e652": "577b98", + "323133": "d99362" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-partner.json b/public/images/pokemon/variant/back/25-partner.json new file mode 100644 index 00000000000..c20fae48a34 --- /dev/null +++ b/public/images/pokemon/variant/back/25-partner.json @@ -0,0 +1,26 @@ +{ + "1": { + "45454a": "4f454c", + "9c5200": "315c75", + "de9400": "338087", + "171717": "1e1526", + "c52119": "ad4e76", + "633108": "09406b", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5" + }, + "2": { + "45454a": "f1b571", + "9c5200": "23345e", + "de9400": "324472", + "171717": "a45233", + "c52119": "ebc67c", + "633108": "22244f", + "e65a42": "eedd9c", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-smart-cosplay.json b/public/images/pokemon/variant/back/25-smart-cosplay.json new file mode 100644 index 00000000000..50749b31d8b --- /dev/null +++ b/public/images/pokemon/variant/back/25-smart-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "fffdea": "f8ffe3", + "b7a599": "bab699", + "60b553": "76a848", + "f7e652": "a3d1a8", + "366635": "3e5b2f", + "95635b": "91685f", + "171717": "1e1526", + "5f3434": "573b38", + "54545c": "55555e", + "52525a": "4f454c", + "292929": "272b2b", + "f7bd21": "79b5a5", + "9c5200": "315c75" + }, + "2": { + "fffdea": "f2f0df", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "f7e652": "577b98", + "366635": "ab5130", + "95635b": "a09ea3", + "171717": "a45233", + "5f3434": "666060", + "54545c": "45525c", + "52525a": "f1b571", + "292929": "202937", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25-tough-cosplay.json b/public/images/pokemon/variant/back/25-tough-cosplay.json new file mode 100644 index 00000000000..49c50d17ad2 --- /dev/null +++ b/public/images/pokemon/variant/back/25-tough-cosplay.json @@ -0,0 +1,35 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "cf6a59", + "8d2b1d": "bf3638", + "c52119": "ad4e76", + "46464d": "2b3340", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "e65a42": "cf6182", + "cecab9": "cfc8aa", + "52525a": "4f454c", + "f7e652": "a3d1a8", + "9c5200": "315c75" + }, + "2": { + "e37511": "60448d", + "bf2629": "826694", + "f8ffe3": "e8e3e4", + "8d2b1d": "3d3f7d", + "c52119": "ebc67c", + "46464d": "2b3340", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "e65a42": "eedd9c", + "cecab9": "beb1b4", + "8e2525": "242866", + "52525a": "f1b571", + "f7e652": "577b98", + "272b2b": "162231", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/25.json b/public/images/pokemon/variant/back/25.json new file mode 100644 index 00000000000..c20fae48a34 --- /dev/null +++ b/public/images/pokemon/variant/back/25.json @@ -0,0 +1,26 @@ +{ + "1": { + "45454a": "4f454c", + "9c5200": "315c75", + "de9400": "338087", + "171717": "1e1526", + "c52119": "ad4e76", + "633108": "09406b", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5" + }, + "2": { + "45454a": "f1b571", + "9c5200": "23345e", + "de9400": "324472", + "171717": "a45233", + "c52119": "ebc67c", + "633108": "22244f", + "e65a42": "eedd9c", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/26.json b/public/images/pokemon/variant/back/26.json new file mode 100644 index 00000000000..758faf12c97 --- /dev/null +++ b/public/images/pokemon/variant/back/26.json @@ -0,0 +1,34 @@ +{ + "1": { + "63636b": "4f454c", + "101011": "293059", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "f7ad29": "76a68b", + "734231": "6e2f33", + "ffefd6": "c8d4ba", + "de7b31": "539190" + }, + "2": { + "542127": "905331", + "101011": "202a60", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "f7ad29": "6385ab", + "734231": "bf8445", + "ffefd6": "cfc4b5", + "de7b31": "4d6f98", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/276.json b/public/images/pokemon/variant/back/276.json new file mode 100644 index 00000000000..e0fb6b93467 --- /dev/null +++ b/public/images/pokemon/variant/back/276.json @@ -0,0 +1,32 @@ +{ + "1": { + "bdbdcc": "b5b5d5", + "bdbdce": "26523c", + "943a52": "ad8634", + "ffffff": "3c6a3d", + "a57331": "784524", + "212952": "12223d", + "3a3a31": "3e3e3e", + "5a6b9c": "2a596b", + "e69410": "bc7532", + "524a29": "4b210d", + "fffffd": "fffffe", + "314a7b": "1a385a", + "ce5273": "cebf49" + }, + "2": { + "bdbdcc": "b5b5d5", + "bdbdce": "453f63", + "943a52": "8ec08b", + "ffffff": "635d81", + "a57331": "4a323a", + "212952": "191222", + "3a3a31": "442c34", + "5a6b9c": "3c2f48", + "e69410": "63414f", + "524a29": "381f2c", + "fffffd": "fffffe", + "314a7b": "282037", + "ce5273": "bcd59d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/277.json b/public/images/pokemon/variant/back/277.json new file mode 100644 index 00000000000..5a3e049f5f5 --- /dev/null +++ b/public/images/pokemon/variant/back/277.json @@ -0,0 +1,36 @@ +{ + "1": { + "dea531": "bc7532", + "425a7b": "2a596b", + "ffffff": "3c6a3d", + "b5b5d6": "26523c", + "9c3152": "ad8634", + "945a10": "784524", + "5a5a5a": "b58251", + "63213a": "603c1d", + "c55a73": "cebf49", + "294263": "1a385a", + "292952": "12223d", + "fffffd": "fffffe", + "524221": "4b210d", + "b5b5d4": "b5b5d5", + "31313a": "89572a" + }, + "2": { + "dea531": "63414f", + "425a7b": "3c2f48", + "ffffff": "635d81", + "b5b5d6": "453f63", + "9c3152": "8ec08b", + "945a10": "4a323a", + "5a5a5a": "5d454d", + "63213a": "5d9469", + "c55a73": "bcd59d", + "294263": "282037", + "292952": "191222", + "fffffd": "fffffe", + "524221": "381f2c", + "b5b5d4": "b5b5d5", + "31313a": "442c34" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/359-mega.json b/public/images/pokemon/variant/back/359-mega.json new file mode 100644 index 00000000000..d81d313a1de --- /dev/null +++ b/public/images/pokemon/variant/back/359-mega.json @@ -0,0 +1,24 @@ +{ + "1": { + "ffffff": "61a8ab", + "414a6a": "421e4a", + "b4b4d5": "458196", + "293939": "27122b", + "8b8bac": "3b6987", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "626283": "2a3163" + }, + "2": { + "ffffff": "9e363b", + "414a6a": "b39279", + "b4b4d5": "752f40", + "293939": "996e5f", + "8b8bac": "59213b", + "525a7b": "dfd1ae", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/359.json b/public/images/pokemon/variant/back/359.json new file mode 100644 index 00000000000..4ccca6800b3 --- /dev/null +++ b/public/images/pokemon/variant/back/359.json @@ -0,0 +1,24 @@ +{ + "1": { + "424a6b": "421e4a", + "293a3a": "27122b", + "737bad": "874267", + "d6deef": "589aa6", + "525a7b": "612b54", + "8c8cad": "3b6987", + "636384": "2a3163", + "b5b5d6": "458196", + "ffffff": "61a8ab" + }, + "2": { + "424a6b": "b39279", + "293a3a": "996e5f", + "737bad": "f5f1cb", + "d6deef": "8f2f41", + "525a7b": "e0c79f", + "8c8cad": "59213b", + "636384": "42122d", + "b5b5d6": "752f40", + "ffffff": "9e363b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/377.json b/public/images/pokemon/variant/back/377.json new file mode 100644 index 00000000000..1ab9bce073f --- /dev/null +++ b/public/images/pokemon/variant/back/377.json @@ -0,0 +1,26 @@ +{ + "1": { + "b54200": "13512f", + "efad6b": "aac669", + "948c73": "2e4e7b", + "cec5ad": "4d8ba8", + "bd633a": "22773f", + "ef843a": "56963a", + "b5ad94": "3d6d8d", + "e6dead": "659db5", + "524a29": "182238", + "efe6de": "84c7ca" + }, + "2": { + "b54200": "3d0933", + "efad6b": "a54c5e", + "948c73": "262847", + "cec5ad": "303353", + "bd633a": "561934", + "ef843a": "722a41", + "b5ad94": "394170", + "e6dead": "383e6a", + "524a29": "161129", + "efe6de": "4d5784" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/378.json b/public/images/pokemon/variant/back/378.json new file mode 100644 index 00000000000..74ef70cbcec --- /dev/null +++ b/public/images/pokemon/variant/back/378.json @@ -0,0 +1,29 @@ +{ + "0": { + "ffffff": "d7b6f1", + "6bb5d6": "414184", + "293a7b": "101238", + "9cceff": "6f66a7", + "3a6b8c": "191d4c", + "bdefff": "9983c4", + "5a84ad": "282e64" + }, + "1": { + "6bb5d6": "bf344a", + "bdefff": "ffb88d", + "9cceff": "eb5d56", + "293a7b": "400b1c", + "ffffff": "fff7d3", + "3a6b8c": "64132c", + "5a84ad": "981d43" + }, + "2": { + "6bb5d6": "323232", + "bdefff": "5b5b5b", + "9cceff": "424242", + "293a7b": "100f17", + "ffffff": "8c8c8c", + "3a6b8c": "14131a", + "5a84ad": "212121" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/379.json b/public/images/pokemon/variant/back/379.json new file mode 100644 index 00000000000..e99b7d8c171 --- /dev/null +++ b/public/images/pokemon/variant/back/379.json @@ -0,0 +1,26 @@ +{ + "1": { + "4a5a5a": "34366f", + "3a4252": "292960", + "d6ced6": "cc9c65", + "848c84": "4c5c91", + "ffffff": "fff3aa", + "dedede": "f0d185", + "b5adad": "a66f52", + "4a4a4a": "533329", + "84847b": "80503b", + "3e4f4f": "542618" + }, + "2": { + "4a5a5a": "df8533", + "3a4252": "e29631", + "d6ced6": "cd5521", + "848c84": "ffcd49", + "ffffff": "ffb056", + "dedede": "e87537", + "b5adad": "ad2d1e", + "4a4a4a": "521328", + "84847b": "81222b", + "3e4f4f": "54051f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/39.json b/public/images/pokemon/variant/back/39.json new file mode 100644 index 00000000000..59d78f7958a --- /dev/null +++ b/public/images/pokemon/variant/back/39.json @@ -0,0 +1,16 @@ +{ + "1": { + "6b5263": "153427", + "ffada5": "c5ebd5", + "e67384": "81c2b8", + "a51021": "3a6472", + "ffcec5": "e5ffec" + }, + "2": { + "6b5263": "737454", + "ffada5": "f5e884", + "e67384": "f5c45b", + "a51021": "9c5200", + "ffcec5": "fff9bf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/390.json b/public/images/pokemon/variant/back/390.json new file mode 100644 index 00000000000..94bfe837547 --- /dev/null +++ b/public/images/pokemon/variant/back/390.json @@ -0,0 +1,32 @@ +{ + "1": { + "7a410f": "994943", + "e63131": "1db978", + "b56b29": "64464d", + "9c3131": "2d8766", + "947308": "a86256", + "7b4210": "382029", + "ef6b6b": "81dc3f", + "f06e6e": "76c96d", + "ffd631": "eafe67", + "ffe6ad": "edc6a4", + "e63a42": "5db95b", + "de8400": "876766", + "deb552": "cc9176" + }, + "2": { + "7a410f": "626678", + "e63131": "b5b0f3", + "b56b29": "293b69", + "9c3131": "422e6f", + "947308": "818596", + "7b4210": "171f46", + "ef6b6b": "cbcfff", + "f06e6e": "cb96e5", + "ffd631": "f3f8fe", + "ffe6ad": "d3d5e0", + "e63a42": "8457b0", + "de8400": "3e5f8a", + "deb552": "a5a9b8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/391.json b/public/images/pokemon/variant/back/391.json new file mode 100644 index 00000000000..6c21033ceba --- /dev/null +++ b/public/images/pokemon/variant/back/391.json @@ -0,0 +1,36 @@ +{ + "1": { + "8c7342": "a86256", + "cf451b": "2d8766", + "c59463": "cc9176", + "dee6e6": "dac99d", + "9c5219": "64464d", + "ffffff": "faf7d4", + "735a10": "6b2b28", + "efce94": "edc6a4", + "ffce42": "eafe67", + "ffcd45": "f69044", + "1052b5": "ba2342", + "6b3a08": "382029", + "d68c29": "876766", + "ce4219": "1db978", + "efa542": "cd5528" + }, + "2": { + "8c7342": "818596", + "cf451b": "8457b0", + "c59463": "a5a9b8", + "dee6e6": "dca15d", + "9c5219": "293b69", + "ffffff": "ffe175", + "735a10": "626678", + "efce94": "d3d5e0", + "ffce42": "f3f8fe", + "ffcd45": "e8fdff", + "1052b5": "e09f2f", + "6b3a08": "171f46", + "d68c29": "3e5f8a", + "ce4219": "b5b0f3", + "efa542": "b0cbd4" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/392.json b/public/images/pokemon/variant/back/392.json new file mode 100644 index 00000000000..44c2930f77d --- /dev/null +++ b/public/images/pokemon/variant/back/392.json @@ -0,0 +1,42 @@ +{ + "1": { + "e68c5a": "876766", + "6b3a10": "382029", + "e63740": "2d8766", + "bdc5de": "dac99d", + "a56342": "64464d", + "845a08": "9b2719", + "737384": "9f8876", + "ffdf4f": "eafe67", + "e63a42": "1db978", + "c59c21": "cd5528", + "ffde52": "f69044", + "ffdd47": "e8a82a", + "c79e22": "cf8021", + "ffffff": "faf7d4", + "19427b": "581225", + "f78c4a": "81dc3f", + "3a73a5": "972733", + "842931": "174c48" + }, + "2": { + "e68c5a": "3e5f8a", + "6b3a10": "171f46", + "e63740": "8457b0", + "bdc5de": "dca15d", + "a56342": "293b69", + "845a08": "617995", + "737384": "a15a34", + "ffdf4f": "f3f8fe", + "e63a42": "b5b0f3", + "c59c21": "a0c0cd", + "ffde52": "e8fdff", + "ffdd47": "fff8e5", + "c79e22": "ccbdab", + "ffffff": "ffe175", + "19427b": "4d5196", + "f78c4a": "cbcfff", + "3a73a5": "9c96e2", + "842931": "422e6f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/40.json b/public/images/pokemon/variant/back/40.json new file mode 100644 index 00000000000..21e5ef69cd1 --- /dev/null +++ b/public/images/pokemon/variant/back/40.json @@ -0,0 +1,17 @@ +{ + "1": { + "f77b94": "81c2b8", + "ce6b63": "82b8a9", + "8c4242": "3a6472", + "ffadbd": "c5ebd5" + }, + "2": { + "737373": "3b1f24", + "f77b94": "f5c45b", + "ffffff": "d07439", + "ce6b63": "e6a54c", + "e6dee6": "bc4e24", + "8c4242": "9c5200", + "ffadbd": "f5e884" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/430.json b/public/images/pokemon/variant/back/430.json new file mode 100644 index 00000000000..2edd26708c9 --- /dev/null +++ b/public/images/pokemon/variant/back/430.json @@ -0,0 +1,34 @@ +{ + "1": { + "31313a": "280113", + "8c313a": "b3986b", + "5a5a3a": "1e1e2c", + "545454": "3c3b4d", + "a3a3b5": "7a1e21", + "3a5a9c": "694c30", + "525151": "380514", + "a7a7b8": "60606c", + "efeff8": "b9382d", + "4a2121": "755237", + "ad943a": "3f3e50", + "f7de3a": "61616d", + "3a3a5a": "422e26", + "29213a": "271b1a" + }, + "2": { + "31313a": "080735", + "8c313a": "bc4b84", + "5a5a3a": "4e1915", + "545454": "85412d", + "a3a3b5": "4f358e", + "3a5a9c": "1d6e47", + "525151": "1c1754", + "a7a7b8": "c27238", + "efeff8": "975bc2", + "4a2121": "7b2363", + "ad943a": "85402c", + "f7de3a": "c2723a", + "3a3a5a": "0e4333", + "29213a": "091e16" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/455.json b/public/images/pokemon/variant/back/455.json new file mode 100644 index 00000000000..d10a2ff0741 --- /dev/null +++ b/public/images/pokemon/variant/back/455.json @@ -0,0 +1,34 @@ +{ + "1": { + "f7ce31": "7c5d53", + "9c214a": "451e14", + "2b453d": "523b3c", + "3a5a3a": "b34a82", + "5a6342": "826660", + "8c9452": "b89d8c", + "846b31": "301e20", + "bdc57b": "efd9ba", + "e62919": "775331", + "63843a": "e880ab", + "8f9653": "e2b0bc", + "29423a": "7e3b67", + "c59c31": "4d3432" + }, + "2": { + "f7ce31": "518078", + "ffffff": "affffe", + "9c214a": "1e4340", + "2b453d": "151926", + "3a5a3a": "37818a", + "5a6342": "2d304e", + "8c9452": "424d6e", + "846b31": "122e2f", + "bdc57b": "6679a1", + "e62919": "406b64", + "63843a": "74ddcd", + "422919": "0d2626", + "8f9653": "3d909b", + "29423a": "123247", + "c59c31": "244a45" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/486.json b/public/images/pokemon/variant/back/486.json new file mode 100644 index 00000000000..36a343a2966 --- /dev/null +++ b/public/images/pokemon/variant/back/486.json @@ -0,0 +1,32 @@ +{ + "1": { + "fafafa": "ffc245", + "adadc5": "ca7426", + "8c94ad": "13081a", + "374859": "6b76a4", + "d6ced6": "e89b34", + "f7d65a": "ce5129", + "5f6d7d": "7b2a19", + "ffffff": "eb8746", + "21846b": "90a7cd", + "3a4a5a": "5e1e33", + "c59c52": "a12612", + "7b6321": "3d021b", + "4aa563": "e2f2ff" + }, + "2": { + "fafafa": "88b06f", + "adadc5": "4f673a", + "8c94ad": "494922", + "374859": "2f1a18", + "d6ced6": "6e884b", + "f7d65a": "8f9b9e", + "5f6d7d": "374427", + "ffffff": "a8afaf", + "21846b": "492f29", + "3a4a5a": "3b1930", + "c59c52": "5d717a", + "7b6321": "384751", + "4aa563": "755648" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/501.json b/public/images/pokemon/variant/back/501.json new file mode 100644 index 00000000000..3476b2710b1 --- /dev/null +++ b/public/images/pokemon/variant/back/501.json @@ -0,0 +1,24 @@ +{ + "1": { + "215a63": "1e1a35", + "c5c5ce": "e3c2ca", + "4a6bad": "9660d1", + "294252": "241e44", + "21949c": "373049", + "29bdc5": "5d4a70", + "31426b": "4b349e", + "212142": "241e44" + }, + "2": { + "8c8c9c": "8f7491", + "4a4a4a": "715b72", + "215a63": "000000", + "c5c5ce": "ba9bc1", + "4a6bad": "589787", + "21949c": "321e1e", + "29bdc5": "5e3e38", + "31426b": "3c706b", + "ffffff": "f5e9f4", + "212142": "104432" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/502.json b/public/images/pokemon/variant/back/502.json new file mode 100644 index 00000000000..26772013df7 --- /dev/null +++ b/public/images/pokemon/variant/back/502.json @@ -0,0 +1,28 @@ +{ + "1": { + "4a4a4a": "20193d", + "31528c": "9d5bc9", + "293a6b": "503e8e", + "7b5a10": "d877cd", + "52bdbd": "624060", + "c59429": "ff9ef3", + "efd68c": "f2d5ee", + "313131": "120f33", + "315a73": "1e1624", + "218c94": "39273d", + "fffdfd": "ebb9c4" + }, + "2": { + "4a4a4a": "2c3940", + "31528c": "5e3e38", + "293a6b": "321e1e", + "7b5a10": "0d5656", + "52bdbd": "8b7566", + "c59429": "488383", + "efd68c": "63c7bd", + "313131": "1f2b36", + "315a73": "483026", + "218c94": "684f44", + "fffdfd": "ffffc2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/503.json b/public/images/pokemon/variant/back/503.json new file mode 100644 index 00000000000..9eb2168dd5b --- /dev/null +++ b/public/images/pokemon/variant/back/503.json @@ -0,0 +1,33 @@ +{ + "1": { + "84a5a5": "563785", + "4a4a4a": "5e283e", + "215a9c": "4d244b", + "8aa3a3": "a05982", + "d65263": "b73891", + "ad945a": "db87d1", + "7b6342": "975fad", + "474a46": "2b1838", + "fffeff": "ebb9c4", + "213a63": "28142c", + "4a4a4c": "6b3e51", + "d6c57b": "f2d5ee", + "5a7373": "332a59", + "8da8a8": "a58b90" + }, + "2": { + "4a4a4a": "c2700d", + "215a9c": "5e3e38", + "8aa3a3": "efa838", + "d65263": "41857b", + "ad945a": "488383", + "7b6342": "0d5656", + "474a46": "462d27", + "fffeff": "f9df58", + "213a63": "321e1e", + "4a4a4c": "c2700d", + "d6c57b": "63c7bd", + "5a7373": "2a5c57", + "8da8a8": "84a5a5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/527.json b/public/images/pokemon/variant/back/527.json new file mode 100644 index 00000000000..67767eefcb3 --- /dev/null +++ b/public/images/pokemon/variant/back/527.json @@ -0,0 +1,20 @@ +{ + "1": { + "424a5a": "866ca1", + "6b94ad": "6e315e", + "73adc5": "853e66", + "292931": "55457a", + "addef7": "914a6e", + "4a6b7b": "562259", + "27272f": "361538" + }, + "2": { + "424a5a": "bf3f75", + "6b94ad": "db843d", + "73adc5": "e8b04f", + "292931": "8c2961", + "addef7": "f7e05c", + "4a6b7b": "994d22", + "27272f": "7c3622" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/528.json b/public/images/pokemon/variant/back/528.json new file mode 100644 index 00000000000..fb91d0318a5 --- /dev/null +++ b/public/images/pokemon/variant/back/528.json @@ -0,0 +1,30 @@ +{ + "1": { + "317b94": "6e315e", + "4c4c54": "582253", + "313131": "55457a", + "de8c84": "6bc7e8", + "6b7b84": "439ca1", + "ceefff": "a6ffd7", + "bdbdce": "76debd", + "19a5ce": "914a6e", + "944a4a": "4874b8", + "313132": "451b41", + "4a4a52": "866ca1", + "47474f": "2e6f7a" + }, + "2": { + "317b94": "e0b49a", + "4c4c54": "a6705e", + "313131": "701c4c", + "de8c84": "7b5ebf", + "6b7b84": "994d22", + "ceefff": "f7e05c", + "bdbdce": "db843d", + "19a5ce": "f9fae3", + "944a4a": "393582", + "313132": "a87354", + "4a4a52": "bf3f75", + "47474f": "6b2314" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/587.json b/public/images/pokemon/variant/back/587.json new file mode 100644 index 00000000000..85c4c20f4f0 --- /dev/null +++ b/public/images/pokemon/variant/back/587.json @@ -0,0 +1,28 @@ +{ + "1": { + "212121": "1d352a", + "d6a531": "a84223", + "b58c08": "681c0e", + "bda573": "5a9fbf", + "6b5a31": "16223d", + "cec5ad": "8bd5dc", + "7f6b0d": "3b1c1b", + "846e07": "35708c", + "ffd600": "d55b19", + "9c9c73": "406da4", + "313131": "2b5d3f" + }, + "2": { + "212121": "372a5b", + "d6a531": "6597cd", + "b58c08": "4879af", + "bda573": "9b4072", + "6b5a31": "321832", + "cec5ad": "c4658e", + "7f6b0d": "355c90", + "846e07": "723158", + "ffd600": "8bcaee", + "9c9c73": "7b3760", + "313131": "5e3a86" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/588.json b/public/images/pokemon/variant/back/588.json new file mode 100644 index 00000000000..c00f1886940 --- /dev/null +++ b/public/images/pokemon/variant/back/588.json @@ -0,0 +1,20 @@ +{ + "1": { + "213a5a": "2f185b", + "316bff": "8150a7", + "4a4a4a": "64242d", + "313131": "38131d", + "000000": "ffffff", + "528cff": "c682d6", + "3a5284": "492c72" + }, + "2": { + "213a5a": "44446f", + "316bff": "d2cdeb", + "4a4a4a": "28334f", + "313131": "182138", + "000000": "ffffff", + "528cff": "f9f3ff", + "3a5284": "7777a7" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/589.json b/public/images/pokemon/variant/back/589.json new file mode 100644 index 00000000000..b499504daa3 --- /dev/null +++ b/public/images/pokemon/variant/back/589.json @@ -0,0 +1,30 @@ +{ + "1": { + "c5c5c5": "f9c347", + "ef2952": "eb8343", + "bd2152": "c44126", + "840808": "931119", + "bd9c19": "b8c5e5", + "e65a10": "614593", + "6b6b6b": "b34516", + "294a84": "7436a4", + "195abd": "9448bf", + "94949c": "dc862d", + "000000": "ffffff", + "3a424a": "69130d" + }, + "2": { + "c5c5c5": "6e8e99", + "ef2952": "f7efff", + "bd2152": "beb7df", + "840808": "72709e", + "bd9c19": "a42641", + "e65a10": "ffe8c3", + "6b6b6b": "293a52", + "294a84": "4f3d33", + "195abd": "785442", + "94949c": "3f6372", + "000000": "ffffff", + "3a424a": "1b253d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/590.json b/public/images/pokemon/variant/back/590.json new file mode 100644 index 00000000000..7d19153ec2c --- /dev/null +++ b/public/images/pokemon/variant/back/590.json @@ -0,0 +1,30 @@ +{ + "1": { + "684c30": "0d9999", + "9c3a3a": "71de8c", + "846b63": "0fad9a", + "9c3a7b": "88af70", + "6b4a31": "0d9999", + "422929": "0a5870", + "7b3131": "49ad77", + "de5a52": "e6ffc1", + "d6639c": "f4ebba", + "7a3730": "49aa87", + "c5b59c": "47d1b5", + "fff7e6": "afecc6" + }, + "2": { + "684c30": "2b5caf", + "9c3a3a": "e098cd", + "846b63": "64a3bc", + "9c3a7b": "b1c4dd", + "6b4a31": "f2f7f9", + "422929": "b9d9e5", + "7b3131": "ad629a", + "de5a52": "ffbfcb", + "d6639c": "f2f7f9", + "7a3730": "404f6b", + "c5b59c": "498cd3", + "fff7e6": "6ac2e2" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/591.json b/public/images/pokemon/variant/back/591.json new file mode 100644 index 00000000000..0d369a42c02 --- /dev/null +++ b/public/images/pokemon/variant/back/591.json @@ -0,0 +1,28 @@ +{ + "1": { + "cec5c5": "afecc6", + "291919": "094164", + "de528c": "e6ffc1", + "634c42": "348999", + "423331": "094164", + "9c9484": "47d1b5", + "634d42": "0c7588", + "634a42": "0d9999", + "423131": "0a5870", + "6b314a": "49ad77", + "ad3163": "71de8c" + }, + "2": { + "cec5c5": "6ac2e2", + "291919": "5e718e", + "de528c": "ffbfcb", + "634c42": "3f7dc7", + "423331": "223656", + "9c9484": "56a1e2", + "634d42": "2b5caf", + "634a42": "f2f7f9", + "423131": "9bb6c1", + "6b314a": "ad629a", + "ad3163": "e098cd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/616.json b/public/images/pokemon/variant/back/616.json new file mode 100644 index 00000000000..a883b42edc8 --- /dev/null +++ b/public/images/pokemon/variant/back/616.json @@ -0,0 +1,26 @@ +{ + "1": { + "3a8442": "4e3671", + "5a5a7b": "b34516", + "9494ad": "dc862d", + "630021": "204b4f", + "b5214a": "346c65", + "ff4a7b": "6ba779", + "de3163": "4a8474", + "29315a": "69130d", + "c5c5d6": "f9c347", + "000000": "ffffff" + }, + "2": { + "3a8442": "d6aa53", + "5a5a7b": "293a52", + "9494ad": "3f6372", + "630021": "2e3469", + "b5214a": "4f62a4", + "ff4a7b": "8cb0d6", + "de3163": "6b8bbf", + "29315a": "1b253d", + "c5c5d6": "6e8e99", + "000000": "ffffff" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/617.json b/public/images/pokemon/variant/back/617.json new file mode 100644 index 00000000000..93310065d35 --- /dev/null +++ b/public/images/pokemon/variant/back/617.json @@ -0,0 +1,30 @@ +{ + "1": { + "ffffff": "fff47e", + "a5846b": "5a6675", + "42b55a": "4e3671", + "c53a6b": "427b6b", + "636363": "c46d31", + "bdbdce": "df9847", + "527b42": "362658", + "732931": "214c49", + "ff4a7b": "6ba779", + "6b84c5": "eef5ff", + "293a6b": "69719e", + "000000": "ffffff", + "3a2919": "192638", + "5a6384": "b8c5e5" + }, + "2": { + "a5846b": "637974", + "42b55a": "415c69", + "c53a6b": "dcaa47", + "527b42": "2d3d52", + "ff4a7b": "ffee72", + "6b84c5": "b43d40", + "293a6b": "461b2e", + "000000": "ffffff", + "3a2919": "2a2235", + "5a6384": "7b2c3d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/621.json b/public/images/pokemon/variant/back/621.json new file mode 100644 index 00000000000..cf80562d31f --- /dev/null +++ b/public/images/pokemon/variant/back/621.json @@ -0,0 +1,26 @@ +{ + "1": { + "8c7b5a": "73654b", + "940042": "1a2248", + "104a8c": "7e231b", + "635231": "605127", + "efc500": "5c7886", + "103163": "601111", + "521031": "0f1330", + "d60042": "26335d", + "316bad": "a13b2c", + "d65273": "be5b5e" + }, + "2": { + "8c7b5a": "da8921", + "940042": "177297", + "104a8c": "c9bb9a", + "635231": "be6e18", + "efc500": "ffd437", + "103163": "a0896b", + "521031": "0f4973", + "d60042": "24aec0", + "316bad": "e3ddbd", + "d65273": "c583a5" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/6503.json b/public/images/pokemon/variant/back/6503.json new file mode 100644 index 00000000000..455b06a69d6 --- /dev/null +++ b/public/images/pokemon/variant/back/6503.json @@ -0,0 +1,38 @@ +{ + "1": { + "282f62": "f7d9de", + "84a5a5": "563785", + "a82c47": "d45b9e", + "8aa3a3": "d3a0bb", + "faf9f9": "f6f4f4", + "494a48": "3d2439", + "1d3962": "28142c", + "474a46": "2b1838", + "d75063": "b73891", + "fbfcfa": "fafcf9", + "324149": "363442", + "1e224e": "dc95ae", + "6b1c34": "8f3396", + "181531": "a26579", + "5a7373": "332a59", + "8da8a8": "a58b90", + "1e5b9b": "4d244b" + }, + "2": { + "282f62": "efdfee", + "84a5a5": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "232d2e", + "faf9f9": "2c3940", + "494a48": "181f20", + "1d3962": "321e1e", + "474a46": "181f20", + "d75063": "8f65d8", + "fbfcfa": "fcfdfc", + "1e224e": "ba9bc1", + "6b1c34": "6d9d9a", + "181531": "715b72", + "5a7373": "2a5c57", + "1e5b9b": "5e3e38" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/656.json b/public/images/pokemon/variant/back/656.json new file mode 100644 index 00000000000..34b11bfab78 --- /dev/null +++ b/public/images/pokemon/variant/back/656.json @@ -0,0 +1,24 @@ +{ + "1": { + "838394": "4d7dc5", + "7bcdff": "9c75c2", + "62ace6": "8363af", + "ffffff": "b1e5ff", + "396a83": "362864", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "174592": "198158", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "7bcdff": "dd6155", + "62ace6": "c44848", + "ffffff": "fff4bd", + "396a83": "5c0d33", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "174592": "198158", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/657.json b/public/images/pokemon/variant/back/657.json new file mode 100644 index 00000000000..083a9dba0a6 --- /dev/null +++ b/public/images/pokemon/variant/back/657.json @@ -0,0 +1,24 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "737373": "0f3f82", + "0b566a": "281f52", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "0b4a7a": "340f3d", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "737373": "df6a50", + "0b566a": "7e1628", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "0b4a7a": "156f78", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/658-ash.json b/public/images/pokemon/variant/back/658-ash.json new file mode 100644 index 00000000000..370d5df8081 --- /dev/null +++ b/public/images/pokemon/variant/back/658-ash.json @@ -0,0 +1,38 @@ +{ + "1": { + "265595": "432b6c", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "134e52": "062e3c", + "bfb169": "165e78", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "282c35": "271f4c", + "f2798d": "8dcfff", + "268794": "1c3e58", + "3e7acc": "6b4592", + "7ddeff": "7ddcd6", + "4ebdd9": "41a7b0", + "18335c": "170738" + }, + "2": { + "265595": "cc7251", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "134e52": "0d1e3e", + "bfb169": "4d2637", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "282c35": "4d2637", + "f2798d": "5eb4a9", + "268794": "1c3e58", + "3e7acc": "ecbb7a", + "7ddeff": "46988d", + "4ebdd9": "2f6e74", + "18335c": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/658.json b/public/images/pokemon/variant/back/658.json new file mode 100644 index 00000000000..c1bb4222ce4 --- /dev/null +++ b/public/images/pokemon/variant/back/658.json @@ -0,0 +1,26 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "3d61cc": "6b4592", + "fff0a6": "208698", + "2e4999": "432b6c", + "f2798d": "8dcfff", + "803340": "0e3e81", + "1b2a59": "170738", + "66d9ff": "7ddcd6", + "bfb169": "165e78" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "2e4999": "cc7251", + "f2798d": "5eb4a9", + "803340": "152a5c", + "1b2a59": "9f2727", + "66d9ff": "48968c", + "bfb169": "431022" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-dandy.json b/public/images/pokemon/variant/back/676-dandy.json new file mode 100644 index 00000000000..f73bd90f690 --- /dev/null +++ b/public/images/pokemon/variant/back/676-dandy.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "30552b": "423839", + "b8bcaf": "5e0f16", + "508a3c": "aa9999", + "f1f2ee": "8a1d1d", + "816e64": "a6afb3", + "6eb92b": "eddddd", + "4b4b46": "2b040f" + }, + "2": { + "594d46": "9c7aca", + "376277": "314173", + "fe3c31": "8362b4", + "9c9f94": "ad76bc", + "30552b": "6a102e", + "b8bcaf": "ce9ede", + "508a3c": "ac254b", + "f1f2ee": "e6c3f8", + "a83c31": "473085", + "816e64": "ae95dc", + "6eb92b": "e44a62", + "4b4b46": "6b3f77" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-debutante.json b/public/images/pokemon/variant/back/676-debutante.json new file mode 100644 index 00000000000..cad1f7792f0 --- /dev/null +++ b/public/images/pokemon/variant/back/676-debutante.json @@ -0,0 +1,28 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "dfb76a": "aa9999", + "4b4b46": "2b040f", + "bcc0b3": "5e0f16", + "816e64": "a6afb3", + "ac6d40": "423839", + "f8f9f7": "8a1d1d", + "fbf588": "eddddd" + }, + "2": { + "594d46": "48a7d0", + "376277": "717171", + "fe3c31": "762ea8", + "9c9f94": "0b374f", + "dfb76a": "c6a65c", + "4b4b46": "021a2f", + "bcc0b3": "0b4b68", + "a83c31": "521073", + "816e64": "74ccec", + "ac6d40": "684d24", + "f8f9f7": "0e728e", + "fbf588": "ffe998" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-diamond.json b/public/images/pokemon/variant/back/676-diamond.json new file mode 100644 index 00000000000..35876619287 --- /dev/null +++ b/public/images/pokemon/variant/back/676-diamond.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "aa3e2b": "423839", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "376277": "4f8fe3", + "645e55": "2b040f", + "d95b37": "aa9999", + "e68a4d": "eddddd", + "453434": "313439", + "816e64": "a6afb3", + "9c9f94": "42090e" + }, + "2": { + "594d46": "bd9462", + "aa3e2b": "642c0a", + "b8bcaf": "319c6a", + "f1f2ee": "6abd81", + "376277": "c56e34", + "fe3c31": "b37e47", + "645e55": "10573c", + "d95b37": "935927", + "e68a4d": "b37e47", + "453434": "6c4b2d", + "a83c31": "642c0a", + "816e64": "eed59c", + "9c9f94": "288c66" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-heart.json b/public/images/pokemon/variant/back/676-heart.json new file mode 100644 index 00000000000..abb8ed1a9b3 --- /dev/null +++ b/public/images/pokemon/variant/back/676-heart.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "f18598": "48474c", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "e0546c": "2a2a2f", + "376277": "4f8fe3", + "645e55": "2b040f", + "453434": "313439", + "816e64": "a6afb3", + "a73f4f": "19181f", + "9c9f94": "42090e" + }, + "2": { + "594d46": "aca49c", + "f18598": "5f5953", + "b8bcaf": "bfc7e8", + "f1f2ee": "e4eafc", + "e0546c": "4c413c", + "376277": "1b1c21", + "fe3c31": "9475de", + "645e55": "7a81b7", + "453434": "837373", + "a83c31": "7249b7", + "816e64": "dadace", + "a73f4f": "2c2320", + "9c9f94": "9fa7c8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-kabuki.json b/public/images/pokemon/variant/back/676-kabuki.json new file mode 100644 index 00000000000..54e87ca19b2 --- /dev/null +++ b/public/images/pokemon/variant/back/676-kabuki.json @@ -0,0 +1,36 @@ +{ + "1": { + "811d1d": "240b12", + "8f2121": "19181f", + "b01a1a": "17161c", + "d02f2e": "2a2a2f", + "594d46": "a6afb3", + "f66559": "fe3c31", + "f44b3d": "313439", + "376277": "436ca1", + "8a7d79": "788087", + "68675c": "2b040f", + "9c9f94": "42090e", + "534343": "360513", + "bcc0b3": "5e0f16", + "f1f2ee": "8a1d1d", + "b32524": "a83c31" + }, + "2": { + "811d1d": "181a38", + "8f2121": "191b38", + "b01a1a": "48578e", + "d02f2e": "305d9e", + "594d46": "3e5368", + "f66559": "9890ec", + "f44b3d": "4c89d9", + "376277": "436ca1", + "8a7d79": "233342", + "68675c": "1b1d39", + "9c9f94": "468197", + "534343": "192b42", + "bcc0b3": "549ab8", + "f1f2ee": "6bcfd9", + "b32524": "8067c6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-la-reine.json b/public/images/pokemon/variant/back/676-la-reine.json new file mode 100644 index 00000000000..a464639a025 --- /dev/null +++ b/public/images/pokemon/variant/back/676-la-reine.json @@ -0,0 +1,28 @@ +{ + "1": { + "8a7d79": "788087", + "376277": "4f8fe3", + "31a7bb": "aa9999", + "594d46": "a6afb3", + "4b4b46": "2b040f", + "9c9f94": "42090e", + "56d1d8": "eddddd", + "bcc0b3": "5e0f16", + "2f7387": "423839", + "f1f2ee": "8a1d1d" + }, + "2": { + "a83c31": "3041b7", + "8a7d79": "a11e24", + "376277": "221755", + "31a7bb": "e3b876", + "594d46": "973721", + "4b4b46": "550b0c", + "9c9f94": "c63b31", + "56d1d8": "ffec9b", + "bcc0b3": "d9533c", + "2f7387": "8e673e", + "f1f2ee": "ee724b", + "fe3c31": "4b77e1" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-matron.json b/public/images/pokemon/variant/back/676-matron.json new file mode 100644 index 00000000000..70a32e09a19 --- /dev/null +++ b/public/images/pokemon/variant/back/676-matron.json @@ -0,0 +1,29 @@ +{ + "1": { + "873a5b": "19181f", + "376277": "4f8fe3", + "9c9f94": "42090e", + "594d46": "788087", + "b8bcaf": "5e0f16", + "5f5951": "2b040f", + "121212": "101010", + "b95b83": "2a2a2f", + "816e64": "a6afb3", + "f8f9f7": "8a1d1d", + "d07da9": "313439" + }, + "2": { + "873a5b": "1b447b", + "376277": "2246aa", + "fe3c31": "64edf3", + "9c9f94": "bd4d6a", + "594d46": "d0b5b5", + "b8bcaf": "d95e7e", + "5f5951": "8a2843", + "b95b83": "528fcc", + "816e64": "e3d6d6", + "a83c31": "45a6d0", + "f8f9f7": "fa8c9f", + "d07da9": "64c8f3" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-pharaoh.json b/public/images/pokemon/variant/back/676-pharaoh.json new file mode 100644 index 00000000000..fa9c60533b6 --- /dev/null +++ b/public/images/pokemon/variant/back/676-pharaoh.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "376277": "4f8fe3", + "9c9f94": "42090e", + "bcc0b3": "5e0f16", + "25559c": "2a2a2f", + "484640": "2b040f", + "217fc4": "313439", + "68675c": "2b040f", + "816e64": "42090e", + "243a6f": "19181f", + "f1f2ee": "8a1d1d" + }, + "2": { + "594d46": "22172f", + "376277": "5e0808", + "fe3c31": "ec4d3e", + "9c9f94": "332b42", + "bcc0b3": "3b3955", + "25559c": "d0902d", + "484640": "17122f", + "217fc4": "eed552", + "68675c": "17122f", + "a83c31": "a11717", + "816e64": "332b42", + "243a6f": "a15317", + "f1f2ee": "5a5a71" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676-star.json b/public/images/pokemon/variant/back/676-star.json new file mode 100644 index 00000000000..f6bdec0ca9e --- /dev/null +++ b/public/images/pokemon/variant/back/676-star.json @@ -0,0 +1,30 @@ +{ + "1": { + "594d46": "788087", + "b8bcaf": "5e0f16", + "f1f2ee": "8a1d1d", + "3a5078": "19181f", + "376277": "4f8fe3", + "645e55": "2b040f", + "3e8ebf": "2a2a2f", + "9c9f94": "42090e", + "453434": "48474c", + "816e64": "a6afb3", + "7dc2e8": "313439" + }, + "2": { + "594d46": "d7bc4d", + "b8bcaf": "d6dec2", + "f1f2ee": "fcfef5", + "3a5078": "613d11", + "376277": "647bb1", + "fe3c31": "b5e0f3", + "645e55": "848e75", + "3e8ebf": "ac802f", + "9c9f94": "c3cdab", + "453434": "836329", + "a83c31": "6192aa", + "816e64": "f7e784", + "7dc2e8": "cdac4a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/676.json b/public/images/pokemon/variant/back/676.json new file mode 100644 index 00000000000..9a8ab0f7aa3 --- /dev/null +++ b/public/images/pokemon/variant/back/676.json @@ -0,0 +1,23 @@ +{ + "1": { + "bcbca8": "5e0f16", + "606056": "2b040f", + "8e8e7b": "42090e", + "f2f2da": "8a1d1d", + "3f6273": "2b040f", + "736b67": "a6afb3", + "494340": "788087", + "3f6274": "4f8fe3" + }, + "2": { + "bcbca8": "a4624a", + "cc2929": "3a240e", + "606056": "4a281b", + "8e8e7b": "805145", + "f2f2da": "c18960", + "3f6273": "4a281b", + "736b67": "ffe6ac", + "494340": "e6c594", + "3f6274": "4a2e23" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/682.json b/public/images/pokemon/variant/back/682.json new file mode 100644 index 00000000000..5b3a6821f1f --- /dev/null +++ b/public/images/pokemon/variant/back/682.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "7f4d59": "20644e" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "7f4d59": "a23812", + "a6a6a6": "503851", + "737373": "422f46", + "4d4d4d": "332539", + "e5e5e5": "6b4767" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/683.json b/public/images/pokemon/variant/back/683.json new file mode 100644 index 00000000000..9d7f4682b9a --- /dev/null +++ b/public/images/pokemon/variant/back/683.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "404040": "2c283b", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "404040": "2a2234", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/684.json b/public/images/pokemon/variant/back/684.json new file mode 100644 index 00000000000..18afd91b4a2 --- /dev/null +++ b/public/images/pokemon/variant/back/684.json @@ -0,0 +1,18 @@ +{ + "1": { + "805963": "3c195b", + "7b5760": "8f1d15", + "cc99a6": "814db1", + "ffccd9": "8961c6", + "fff2f2": "f39f62", + "ccadad": "e6774a" + }, + "2": { + "805963": "679baa", + "7b5760": "3c2f51", + "cc99a6": "93d6ce", + "ffccd9": "cbf6da", + "fff2f2": "746998", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/685.json b/public/images/pokemon/variant/back/685.json new file mode 100644 index 00000000000..87b0bad9422 --- /dev/null +++ b/public/images/pokemon/variant/back/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "805963": "2d0c42", + "7b5760": "b13924", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "a62949": "26592b" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "805963": "679baa", + "7b5760": "3c2f51", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "a62949": "441838" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/688.json b/public/images/pokemon/variant/back/688.json new file mode 100644 index 00000000000..ac388cd384e --- /dev/null +++ b/public/images/pokemon/variant/back/688.json @@ -0,0 +1,30 @@ +{ + "1": { + "b7653f": "459aac", + "385860": "70240f", + "6b503b": "373295", + "372e27": "220a56", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "808080": "7c582e", + "5890b0": "a9582e", + "fcffff": "e8e5c6", + "d0d0d0": "d3bc8c", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "b7653f": "332149", + "385860": "2c052a", + "6b503b": "ba9fba", + "372e27": "1e1324", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "808080": "4d6a09", + "5890b0": "4b0038", + "fcffff": "d1ec8c", + "d0d0d0": "94c268", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/689.json b/public/images/pokemon/variant/back/689.json new file mode 100644 index 00000000000..6c47b57f35b --- /dev/null +++ b/public/images/pokemon/variant/back/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "cc7f70": "459aac", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "bfeaff": "e8d37b", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "cc7f70": "332149", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "bfeaff": "a74083", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/807.json b/public/images/pokemon/variant/back/807.json new file mode 100644 index 00000000000..4471a1b5b50 --- /dev/null +++ b/public/images/pokemon/variant/back/807.json @@ -0,0 +1,28 @@ +{ + "1": { + "484f57": "243058", + "5bd0f2": "ebceff", + "2759a5": "736599", + "727678": "3f5277", + "daa936": "5c96b4", + "ef8a4e": "517bb5", + "f9e455": "80c7d7", + "9d682d": "3d648c", + "000000": "ffffff", + "2394d8": "b298d8", + "31343e": "14193f" + }, + "2": { + "484f57": "cba3ca", + "5bd0f2": "df7298", + "2759a5": "a3378a", + "727678": "e7c9e2", + "daa936": "351d53", + "ef8a4e": "844c94", + "f9e455": "58326f", + "9d682d": "1f1144", + "000000": "ffffff", + "2394d8": "be5293", + "31343e": "a880b0" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/894.json b/public/images/pokemon/variant/back/894.json new file mode 100644 index 00000000000..d213b87dcf4 --- /dev/null +++ b/public/images/pokemon/variant/back/894.json @@ -0,0 +1,24 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "7d542a": "2769aa", + "bc8b2f": "124b78", + "fefac7": "dffff6", + "2e3967": "357b84", + "8eacdd": "caffd1", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "7d542a": "429877", + "bc8b2f": "2a6f5d", + "fefac7": "ffffff", + "2e3967": "514199", + "8eacdd": "c693d8", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/895.json b/public/images/pokemon/variant/back/895.json new file mode 100644 index 00000000000..d9a7f49ae44 --- /dev/null +++ b/public/images/pokemon/variant/back/895.json @@ -0,0 +1,26 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "608d99": "fae5bf", + "2b3d40": "754f47", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "f27a99": "efb55a", + "3f545f": "ad8473", + "872c3c": "93372d", + "242e35": "512c25" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "608d99": "9b7ebc", + "2b3d40": "241951", + "4b6f78": "5a4382", + "e05276": "8aea41", + "f27a99": "dfff75", + "3f545f": "3a2a67", + "872c3c": "227843", + "242e35": "0f0c1e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/944.json b/public/images/pokemon/variant/back/944.json new file mode 100644 index 00000000000..6f41f91c4d6 --- /dev/null +++ b/public/images/pokemon/variant/back/944.json @@ -0,0 +1,44 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "97859b": "3f8d59", + "a571e6": "ffe269", + "774d9b": "d09139", + "efeee1": "88eeab", + "afc6d8": "8056a7", + "c9e1f4": "b782cd", + "918772": "1c9b8d", + "869fad": "5e4090", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "6974ad", + "97859b": "5582a4", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "efeee1": "e2f3ff", + "afc6d8": "c23f4f", + "c9e1f4": "f98381", + "918772": "6777aa", + "869fad": "902a4b", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/945.json b/public/images/pokemon/variant/back/945.json new file mode 100644 index 00000000000..500e68e3812 --- /dev/null +++ b/public/images/pokemon/variant/back/945.json @@ -0,0 +1,38 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "d6d3ca": "499833", + "e0ebf1": "7ddfee", + "e6e2e1": "fffbf3", + "8d2151": "4676aa", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "d73875": "68adca", + "aebec7": "62b0d0", + "38bdda": "494e64", + "282434": "14463f", + "aca699": "2db3a4", + "a4988b": "16613d", + "4b616b": "473869" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "e6e2e1": "ebf4f9", + "8d2151": "4676aa", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "d73875": "68adca", + "7c6a84": "965b6f", + "38bdda": "494e64", + "282434": "2d427e", + "aca699": "acbfc7", + "4b616b": "8a2029" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/154.json b/public/images/pokemon/variant/back/female/154.json new file mode 100644 index 00000000000..d7463ebee9d --- /dev/null +++ b/public/images/pokemon/variant/back/female/154.json @@ -0,0 +1,26 @@ +{ + "1": { + "634a00": "6da0df", + "ff3a5a": "234d81", + "e6ad00": "90c6f8", + "ce213a": "192e5e", + "63bd42": "9d86d9", + "f7a59c": "78d38b", + "7b103a": "111c44", + "107b31": "8057b2", + "ffde21": "b9e2ff", + "9ce652": "b7afee" + }, + "2": { + "634a00": "144627", + "ff3a5a": "9ed662", + "e6ad00": "1e632b", + "ce213a": "81c65c", + "63bd42": "a31f60", + "f7a59c": "ddf2b5", + "7b103a": "59ac45", + "107b31": "761858", + "ffde21": "288028", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/194.json b/public/images/pokemon/variant/back/female/194.json new file mode 100644 index 00000000000..db649381d14 --- /dev/null +++ b/public/images/pokemon/variant/back/female/194.json @@ -0,0 +1,20 @@ +{ + "1": { + "529ce6": "e8983d", + "9463a5": "2ea380", + "633a6b": "09484f", + "3a7bc5": "d5682e", + "73bdff": "ffc355", + "d65ad6": "44d77f", + "104a84": "7a150a" + }, + "2": { + "529ce6": "564daa", + "9463a5": "aeccdf", + "633a6b": "444c7e", + "3a7bc5": "3f377e", + "73bdff": "5c66c4", + "d65ad6": "e8faff", + "104a84": "180d42" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/195.json b/public/images/pokemon/variant/back/female/195.json new file mode 100644 index 00000000000..a097ea3eac4 --- /dev/null +++ b/public/images/pokemon/variant/back/female/195.json @@ -0,0 +1,24 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "637ba5": "816251", + "639cbd": "dc6a4d", + "3194a5": "44d77f", + "6b5a8c": "1b5a55", + "425284": "b03844", + "426b84": "b8453b", + "195a6b": "2ea380" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "637ba5": "504a8a", + "639cbd": "493a8d", + "3194a5": "ebf5ff", + "6b5a8c": "5e649b", + "425284": "240830", + "195a6b": "aebbdf", + "19423a": "747aae" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/198.json b/public/images/pokemon/variant/back/female/198.json new file mode 100644 index 00000000000..eed8404265c --- /dev/null +++ b/public/images/pokemon/variant/back/female/198.json @@ -0,0 +1,26 @@ +{ + "1": { + "d94352": "8c1b23", + "314263": "462b20", + "efd684": "a6a6b3", + "d64252": "b3986b", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "73293a": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "8c1b23", + "314263": "0e4333", + "efd684": "c2723a", + "d64252": "bc4b84", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "73293a": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-beauty-cosplay.json b/public/images/pokemon/variant/back/female/25-beauty-cosplay.json new file mode 100644 index 00000000000..34a087f71cd --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-beauty-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "f7cc2f": "d5ac44", + "9c5200": "315c75", + "f7e860": "eddc78", + "cecab9": "b84084", + "2d276d": "454a61", + "4d88c4": "e4f6f1", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "f7e652": "a3d1a8", + "f7bd21": "79b5a5", + "5e5e6b": "8a2554" + }, + "2": { + "4f454c": "f1b571", + "f7cc2f": "d5ac44", + "fffabf": "f5efd1", + "9c5200": "283361", + "f7e860": "eddc78", + "965b0e": "96500e", + "cecab9": "b84084", + "2d276d": "454a61", + "4d88c4": "e4f6f1", + "39509d": "9ec4cd", + "fffdea": "ea82a6", + "1e1526": "a45233", + "f7e652": "577b98", + "f7bd21": "486689", + "5e5e6b": "8a2554" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cool-cosplay.json b/public/images/pokemon/variant/back/female/25-cool-cosplay.json new file mode 100644 index 00000000000..278feb070bd --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cool-cosplay.json @@ -0,0 +1,31 @@ +{ + "1": { + "171717": "2a1d36", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "ba2b23": "b73850", + "9c5200": "1c4f75", + "d95b45": "cf6887", + "3b3b40": "4a3e46" + }, + "2": { + "171717": "a45233", + "656f86": "cf752b", + "a5b0b6": "f0b541", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "ba2b23": "2c2c47", + "55555e": "8f4b32", + "9c5200": "22325c", + "f4f7ab": "eadbb3", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "272b2b": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cosplay.json b/public/images/pokemon/variant/back/female/25-cosplay.json new file mode 100644 index 00000000000..c574d63d743 --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cosplay.json @@ -0,0 +1,26 @@ +{ + "1": { + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "f7bd21": "79b5a5", + "52525a": "4f454c", + "9c5200": "315c75", + "292929": "1e1526", + "633108": "09406b", + "e65a42": "cf6182", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "f7bd21": "445f8a", + "52525a": "f1b571", + "9c5200": "23345e", + "292929": "a45233", + "633108": "22244f", + "e65a42": "eedd9c", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-cute-cosplay.json b/public/images/pokemon/variant/back/female/25-cute-cosplay.json new file mode 100644 index 00000000000..7b26b79d08f --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-cute-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "752bd0": "5452b7", + "baa998": "bab699", + "fff7a5": "c4e3c3", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "cf4770": "cf4a59", + "f3bace": "f2bbbb", + "853247": "85323c", + "f7ef97": "f0eaa8", + "52525a": "4f454c", + "292929": "30263b", + "f7bd21": "79b5a5", + "9c5200": "255e8a" + }, + "2": { + "752bd0": "7751c2", + "baa998": "d3ab5a", + "fff7a5": "7b96aa", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "cf4770": "739b55", + "f3bace": "c5cc85", + "853247": "254b30", + "f7ef97": "ebe7b7", + "52525a": "f1b571", + "292929": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-partner.json b/public/images/pokemon/variant/back/female/25-partner.json new file mode 100644 index 00000000000..affebee3c8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-partner.json @@ -0,0 +1,26 @@ +{ + "1": { + "9c5200": "315c75", + "171717": "1e1526", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "f7e652": "a3d1a8", + "c52119": "ad4e76", + "e65a42": "cf6182", + "633108": "09406b", + "45454a": "4f454c", + "de9400": "338087" + }, + "2": { + "9c5200": "23345e", + "171717": "a45233", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "f7e652": "577b98", + "c52119": "ebc67c", + "e65a42": "eedd9c", + "633108": "22244f", + "45454a": "f1b571", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-smart-cosplay.json b/public/images/pokemon/variant/back/female/25-smart-cosplay.json new file mode 100644 index 00000000000..50749b31d8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-smart-cosplay.json @@ -0,0 +1,32 @@ +{ + "1": { + "fffdea": "f8ffe3", + "b7a599": "bab699", + "60b553": "76a848", + "f7e652": "a3d1a8", + "366635": "3e5b2f", + "95635b": "91685f", + "171717": "1e1526", + "5f3434": "573b38", + "54545c": "55555e", + "52525a": "4f454c", + "292929": "272b2b", + "f7bd21": "79b5a5", + "9c5200": "315c75" + }, + "2": { + "fffdea": "f2f0df", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "f7e652": "577b98", + "366635": "ab5130", + "95635b": "a09ea3", + "171717": "a45233", + "5f3434": "666060", + "54545c": "45525c", + "52525a": "f1b571", + "292929": "202937", + "f7bd21": "445f8a", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25-tough-cosplay.json b/public/images/pokemon/variant/back/female/25-tough-cosplay.json new file mode 100644 index 00000000000..49c50d17ad2 --- /dev/null +++ b/public/images/pokemon/variant/back/female/25-tough-cosplay.json @@ -0,0 +1,35 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "cf6a59", + "8d2b1d": "bf3638", + "c52119": "ad4e76", + "46464d": "2b3340", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "e65a42": "cf6182", + "cecab9": "cfc8aa", + "52525a": "4f454c", + "f7e652": "a3d1a8", + "9c5200": "315c75" + }, + "2": { + "e37511": "60448d", + "bf2629": "826694", + "f8ffe3": "e8e3e4", + "8d2b1d": "3d3f7d", + "c52119": "ebc67c", + "46464d": "2b3340", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "e65a42": "eedd9c", + "cecab9": "beb1b4", + "8e2525": "242866", + "52525a": "f1b571", + "f7e652": "577b98", + "272b2b": "162231", + "9c5200": "23345e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/25.json b/public/images/pokemon/variant/back/female/25.json new file mode 100644 index 00000000000..affebee3c8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/25.json @@ -0,0 +1,26 @@ +{ + "1": { + "9c5200": "315c75", + "171717": "1e1526", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "f7e652": "a3d1a8", + "c52119": "ad4e76", + "e65a42": "cf6182", + "633108": "09406b", + "45454a": "4f454c", + "de9400": "338087" + }, + "2": { + "9c5200": "23345e", + "171717": "a45233", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "f7e652": "577b98", + "c52119": "ebc67c", + "e65a42": "eedd9c", + "633108": "22244f", + "45454a": "f1b571", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/back/female/26.json b/public/images/pokemon/variant/back/female/26.json new file mode 100644 index 00000000000..6a29870fc8b --- /dev/null +++ b/public/images/pokemon/variant/back/female/26.json @@ -0,0 +1,33 @@ +{ + "1": { + "63636b": "4f454c", + "944242": "395a80", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "f7ad29": "76a68b", + "734231": "6e2f33", + "ffefd6": "c8d4ba", + "de7b31": "539190" + }, + "2": { + "101010": "000000", + "542127": "905331", + "944242": "2d3b80", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "f7ad29": "6385ab", + "734231": "bf8445", + "ffefd6": "cfc4b5", + "de7b31": "4d6f98", + "643034": "2e4685" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/2026.json b/public/images/pokemon/variant/exp/2026.json new file mode 100644 index 00000000000..287b16fb52b --- /dev/null +++ b/public/images/pokemon/variant/exp/2026.json @@ -0,0 +1,34 @@ +{ + "1": { + "ecd8b7": "b4c2a5", + "646124": "492652", + "602c24": "162f4b", + "fef652": "eb999a", + "846b5b": "467f85", + "1a73cc": "b85346", + "9c5430": "1d3a57", + "174680": "2b1307", + "fef443": "c48081", + "b45f25": "2d5261", + "fffdfb": "d6d9ca", + "e9be14": "945c7b", + "e3882d": "3d7375", + "965821": "2f4e6b", + "552720": "142c48" + }, + "2": { + "ecd8b7": "5a6f90", + "646124": "122140", + "fef652": "faee9e", + "846b5b": "202746", + "1a73cc": "c26400", + "174680": "2b0606", + "fef443": "3a5873", + "b45f25": "bd8551", + "fffdfb": "6d8297", + "e9be14": "1a3551", + "e3882d": "d3b06f", + "965821": "9cb3ca", + "552720": "43617f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/2103.json b/public/images/pokemon/variant/exp/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/exp/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/359-mega.json b/public/images/pokemon/variant/exp/359-mega.json new file mode 100644 index 00000000000..084ba24477b --- /dev/null +++ b/public/images/pokemon/variant/exp/359-mega.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffffff": "61a8ab", + "253334": "27122b", + "253333": "2b3266", + "273636": "101f30", + "7b2931": "c9824b", + "414a6a": "421e4a", + "b4b4d5": "458196", + "cd2920": "f7c26d", + "293939": "27122b", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "8b8bac": "3b6987", + "626283": "2a3163" + }, + "2": { + "ffffff": "9e363b", + "253334": "996e5f", + "253333": "420b26", + "273636": "420918", + "7b2931": "0f4391", + "414a6a": "b39279", + "b4b4d5": "752f40", + "cd2920": "2a96ce", + "293939": "996e5f", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "8b8bac": "59213b", + "626283": "42122d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/6503.json b/public/images/pokemon/variant/exp/6503.json new file mode 100644 index 00000000000..62c6cb628b2 --- /dev/null +++ b/public/images/pokemon/variant/exp/6503.json @@ -0,0 +1,37 @@ +{ + "1": { + "282f62": "f7d9de", + "c4c5cf": "e3c2ca", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "6b415b", + "8da8a8": "a58b90", + "1d3962": "28142c", + "d75063": "b73891", + "d9cacd": "f7d9de", + "808280": "020501", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "181531": "a26579", + "6b1c34": "8f3396", + "597471": "332a59", + "494a48": "3d2439" + }, + "2": { + "282f62": "efdfee", + "c4c5cf": "232d2e", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "181f20", + "faf9f9": "2c3940", + "8da8a8": "bdbdbd", + "1d3962": "321e1e", + "d75063": "8f65d8", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "181531": "715b72", + "6b1c34": "6d9d9a", + "597471": "2a5c57", + "494a48": "0b0f18" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/656.json b/public/images/pokemon/variant/exp/656.json new file mode 100644 index 00000000000..68743a4c9f1 --- /dev/null +++ b/public/images/pokemon/variant/exp/656.json @@ -0,0 +1,32 @@ +{ + "1": { + "838394": "4d7dc5", + "62ace6": "8363af", + "7bcdff": "9c75c2", + "ffec8c": "ddfff9", + "a1a1c4": "7ab7ec", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "37408c", + "fdfdfd": "b1e5ff", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "396a83": "362864", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "62ace6": "c44848", + "7bcdff": "dd6155", + "ffec8c": "ddfff9", + "a1a1c4": "f7c685", + "c9b241": "97d6e2", + "dfcf77": "bae7e8", + "174592": "198158", + "fdfdfd": "fff4bd", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "396a83": "5c0d33", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/657.json b/public/images/pokemon/variant/exp/657.json new file mode 100644 index 00000000000..773b4d2efc1 --- /dev/null +++ b/public/images/pokemon/variant/exp/657.json @@ -0,0 +1,32 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "efc653": "abd7db", + "737373": "0f3f82", + "0b566a": "281f52", + "ffec72": "c9fff5", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "009dd5": "61255e", + "0b4a7a": "340f3d", + "e1a03a": "78c7c7", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "efc653": "abd7db", + "737373": "df6a50", + "0b566a": "7e1628", + "ffec72": "ddfff9", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "009dd5": "37b8ac", + "0b4a7a": "156f78", + "e1a03a": "86abbb", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/658-ash.json b/public/images/pokemon/variant/exp/658-ash.json new file mode 100644 index 00000000000..96b60b02adf --- /dev/null +++ b/public/images/pokemon/variant/exp/658-ash.json @@ -0,0 +1,44 @@ +{ + "1": { + "265595": "432b6c", + "3f4447": "466698", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "4ebdd9": "41a7b0", + "bfb169": "165e78", + "bfbfbf": "8cc7d4", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "fff0a6": "208698", + "3e7acc": "6b4592", + "18335c": "170738", + "f2798d": "8dcfff", + "f01818": "39b88f", + "7ddeff": "7ddcd6", + "268794": "1c3e58", + "282c35": "271f4c" + }, + "2": { + "265595": "cc7251", + "3f4447": "466698", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "4ebdd9": "2f6e74", + "bfb169": "431022", + "bfbfbf": "8cc7d4", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "fff0a6": "472333", + "3e7acc": "ecbb7a", + "18335c": "9f2727", + "f2798d": "5eb4a9", + "f01818": "ffe88d", + "7ddeff": "46988d", + "268794": "1c3e58", + "282c35": "4d2637" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/658.json b/public/images/pokemon/variant/exp/658.json new file mode 100644 index 00000000000..826e31b4e21 --- /dev/null +++ b/public/images/pokemon/variant/exp/658.json @@ -0,0 +1,34 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "66d9ff": "7ddcd6", + "3d61cc": "6b4592", + "fff0a6": "208698", + "c92e2e": "73c5ff", + "937f69": "406695", + "c2c1bc": "89b0d7", + "f2798d": "8dcfff", + "f7f7f7": "d8ffff", + "bfb169": "165e78", + "1b2a59": "170738", + "803340": "0e3e81", + "2e4999": "432b6c" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "66d9ff": "48968c", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "c92e2e": "63bf9b", + "937f69": "466698", + "c2c1bc": "8cc7d4", + "f2798d": "5eb4a9", + "f7f7f7": "d7eff4", + "bfb169": "431022", + "1b2a59": "9f2727", + "803340": "152a5c", + "2e4999": "cc7251" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/676.json b/public/images/pokemon/variant/exp/676.json new file mode 100644 index 00000000000..d5ec3013e8e --- /dev/null +++ b/public/images/pokemon/variant/exp/676.json @@ -0,0 +1,22 @@ +{ + "1": { + "a8a592": "42090e", + "376277": "2b040f", + "ccc8b1": "5e0f16", + "59463c": "aaaec1", + "97362c": "a83c31", + "68675c": "2b040f", + "fc362c": "cc2929", + "efeeda": "8a1d1d" + }, + "2": { + "a8a592": "805145", + "376277": "4a281b", + "ccc8b1": "a4624a", + "59463c": "ffe6ac", + "97362c": "3a240e", + "68675c": "4a281b", + "fc362c": "50351b", + "efeeda": "c18960" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/682.json b/public/images/pokemon/variant/exp/682.json new file mode 100644 index 00000000000..a8a7caf46b1 --- /dev/null +++ b/public/images/pokemon/variant/exp/682.json @@ -0,0 +1,28 @@ +{ + "1": { + "661f1f": "cd6132", + "bf5f9f": "7c48a1", + "ff99b3": "48ab61", + "f24949": "ffa24f", + "6b3962": "30185d", + "993d80": "4f297e", + "ffb6c2": "62c45f", + "7f4d59": "20644e", + "cc7087": "318759" + }, + "2": { + "661f1f": "daa235", + "bf5f9f": "f0ebdd", + "ff99b3": "da7e29", + "a6a6a6": "503851", + "737373": "422f46", + "f24949": "ffe664", + "6b3962": "b89477", + "993d80": "d2bfa1", + "ffb6c2": "ed9f3a", + "e5e5e5": "6b4767", + "7f4d59": "a23812", + "4d4d4d": "332539", + "cc7087": "c3561a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/683.json b/public/images/pokemon/variant/exp/683.json new file mode 100644 index 00000000000..f9485702936 --- /dev/null +++ b/public/images/pokemon/variant/exp/683.json @@ -0,0 +1,32 @@ +{ + "1": { + "661f1f": "b64d29", + "cc7087": "318759", + "ff99b3": "48ab61", + "fff0a6": "fec04b", + "f24949": "ffa24f", + "6b3962": "30185d", + "e5c37e": "d6872c", + "993d80": "4f297e", + "7f4d59": "20644e", + "404040": "2c283b", + "b33636": "f4863f", + "bf5f9f": "7c48a1" + }, + "2": { + "661f1f": "c78925", + "cc7087": "c3561a", + "ff99b3": "da7e29", + "fff0a6": "6d8719", + "e5e5e5": "6b4767", + "f24949": "ffe664", + "6b3962": "b89477", + "e5c37e": "376d11", + "993d80": "d2bfa1", + "7f4d59": "a23812", + "a6a6a6": "503851", + "404040": "2a2234", + "b33636": "f0c150", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/684.json b/public/images/pokemon/variant/exp/684.json new file mode 100644 index 00000000000..fb88bb28c70 --- /dev/null +++ b/public/images/pokemon/variant/exp/684.json @@ -0,0 +1,30 @@ +{ + "1": { + "805963": "2d0c42", + "553a41": "8f1d15", + "661a2d": "13391c", + "e53964": "8dbe6d", + "ffccd9": "8961c6", + "5e4048": "260b37", + "cc99a6": "613b84", + "f8f8f8": "caff90", + "fff2f2": "f39f62", + "a62949": "689b52", + "7b5760": "b13924", + "ccadad": "df6b40" + }, + "2": { + "805963": "6796aa", + "553a41": "1d1426", + "661a2d": "26061b", + "e53964": "8c4264", + "ffccd9": "cbf6da", + "5e4048": "52718e", + "cc99a6": "93d6ce", + "f8f8f8": "ffe5ec", + "fff2f2": "746998", + "a62949": "612747", + "7b5760": "3c2f51", + "ccadad": "4b4876" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/685.json b/public/images/pokemon/variant/exp/685.json new file mode 100644 index 00000000000..24ead59428a --- /dev/null +++ b/public/images/pokemon/variant/exp/685.json @@ -0,0 +1,28 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "7b5760": "b13924", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "a62949": "26592b", + "ccadad": "df6b40", + "805963": "2d0c42" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "7b5760": "3c2f51", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "a62949": "441838", + "ccadad": "4b4876", + "805963": "52718e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/688.json b/public/images/pokemon/variant/exp/688.json new file mode 100644 index 00000000000..e5749f6bb3f --- /dev/null +++ b/public/images/pokemon/variant/exp/688.json @@ -0,0 +1,33 @@ +{ + "1": { + "5890b0": "a9582e", + "385860": "70240f", + "372e27": "220a56", + "6b503b": "373295", + "d0d0d0": "d3bc8c", + "c0e0e8": "e8d37b", + "8a6d45": "4557b5", + "101010": "37160a", + "b7653f": "459aac", + "fcffff": "e8e5c6", + "808080": "7c582e", + "88c0c8": "cd8a50", + "ef8955": "70cccf" + }, + "2": { + "5890b0": "4b0038", + "385860": "2c052a", + "372e27": "1e1324", + "6b503b": "ba9fba", + "d0d0d0": "7eac4e", + "c0e0e8": "a74083", + "8a6d45": "f6eefc", + "101010": "0a391b", + "b7653f": "332149", + "fcffff": "caea77", + "f8f8f8": "ffffff", + "808080": "2a5524", + "88c0c8": "731f5c", + "ef8955": "4a376e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/689.json b/public/images/pokemon/variant/exp/689.json new file mode 100644 index 00000000000..cd6db09c8d2 --- /dev/null +++ b/public/images/pokemon/variant/exp/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "cc7f70": "459aac", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "cc7f70": "332149", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/807.json b/public/images/pokemon/variant/exp/807.json new file mode 100644 index 00000000000..8344e88090b --- /dev/null +++ b/public/images/pokemon/variant/exp/807.json @@ -0,0 +1,36 @@ +{ + "1": { + "53e4f9": "d7a7de", + "ef8a4e": "4f7bb6", + "2759a5": "736599", + "14bdea": "c987e3", + "2394d8": "b298d8", + "31343e": "14193f", + "1f73b4": "995fc0", + "4cf4fe": "f4a7ff", + "484f57": "243058", + "000000": "ffffff", + "727678": "3e5277", + "9d682d": "3c648d", + "f9e455": "7fc7d9", + "daa936": "5a96b6", + "5bd0f2": "ebceff" + }, + "2": { + "53e4f9": "d967a2", + "ef8a4e": "834b95", + "2759a5": "a4378a", + "14bdea": "c02f8d", + "2394d8": "c05192", + "31343e": "a981b1", + "1f73b4": "9a1d82", + "4cf4fe": "e3418f", + "484f57": "cda4cb", + "000000": "ffffff", + "727678": "e8cae3", + "9d682d": "1d1044", + "f9e455": "56306f", + "daa936": "331b53", + "5bd0f2": "e17197" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/894.json b/public/images/pokemon/variant/exp/894.json new file mode 100644 index 00000000000..dd270f3bc0e --- /dev/null +++ b/public/images/pokemon/variant/exp/894.json @@ -0,0 +1,27 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "ff9dc2": "2c3072", + "7d542a": "2769aa", + "8eacdd": "caffd1", + "bc8b2f": "124b78", + "fffbfb": "dffff6", + "2e3967": "357b84", + "fefac7": "dffff6", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "ff9dc2": "382875", + "7d542a": "429877", + "8eacdd": "c693d8", + "bc8b2f": "2a6f5d", + "2e3967": "514199", + "fefac7": "ffffff", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/895.json b/public/images/pokemon/variant/exp/895.json new file mode 100644 index 00000000000..7c37283fee7 --- /dev/null +++ b/public/images/pokemon/variant/exp/895.json @@ -0,0 +1,34 @@ +{ + "1": { + "2261ca": "561a5b", + "641e2c": "722123", + "ff92ae": "edca71", + "242e35": "512c25", + "608d99": "fae5bf", + "2b3d40": "754f47", + "76dff5": "ffe8f7", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "b63650": "bc623e", + "f27a99": "efb55a", + "872c3c": "93372d", + "3f545f": "ad8473", + "139ee1": "9b407f" + }, + "2": { + "2261ca": "640e0b", + "641e2c": "15553b", + "ff92ae": "f1ff8d", + "242e35": "0f0c1e", + "608d99": "9b7ebc", + "2b3d40": "241951", + "76dff5": "fffcdf", + "4b6f78": "5a4382", + "e05276": "8aea41", + "b63650": "3bb349", + "f27a99": "dfff75", + "872c3c": "227843", + "3f545f": "3a2a67", + "139ee1": "98301c" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/944.json b/public/images/pokemon/variant/exp/944.json new file mode 100644 index 00000000000..4f1707ae85c --- /dev/null +++ b/public/images/pokemon/variant/exp/944.json @@ -0,0 +1,42 @@ +{ + "1": { + "b5eab2": "75a0d0", + "d4eac7": "8bcfe5", + "bdb2bd": "53a164", + "ceceb7": "3ec295", + "726766": "4f985c", + "4a4860": "372869", + "8ce1b2": "6383c4", + "564a49": "286943", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "ffe269", + "774d9b": "d09139", + "97859b": "3f8d59", + "afc6d8": "8056a7", + "efeee1": "88eeab", + "869fad": "5e4090", + "918772": "1c9b8d", + "3a2b2f": "18493f" + }, + "2": { + "b5eab2": "a9c6dc", + "d4eac7": "e2f8ff", + "bdb2bd": "78b0c2", + "ceceb7": "abc1df", + "726766": "5386b9", + "4a4860": "4f133f", + "8ce1b2": "8397c4", + "564a49": "2c4f8a", + "000000": "ffffff", + "4ca391": "3a4a8a", + "a571e6": "4c5372", + "774d9b": "2c2c46", + "97859b": "5582a4", + "afc6d8": "c23f4f", + "efeee1": "e2f3ff", + "869fad": "902a4b", + "918772": "6777aa", + "3a2b2f": "1e3072" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/945.json b/public/images/pokemon/variant/exp/945.json new file mode 100644 index 00000000000..e22743030f9 --- /dev/null +++ b/public/images/pokemon/variant/exp/945.json @@ -0,0 +1,53 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "ebe4e2": "ade273", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "584698": "18153d", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "8ac2a2": "1a355d", + "d73875": "29ad89", + "e0ebf1": "7ddfee", + "2481b0": "d09139", + "4b616b": "473869", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375", + "cedaaa": "2f5b7b" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "ebe4e2": "c23f4f", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "584698": "1f1e43", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "a599a8": "bf888f", + "8ac2a2": "8397c4", + "7c6a84": "965b6f", + "d73875": "68adca", + "2481b0": "2c2c46", + "4b616b": "8a2029", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa", + "cedaaa": "bad4e8" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/2026.json b/public/images/pokemon/variant/exp/back/2026.json new file mode 100644 index 00000000000..5758dcc8c6c --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2026.json @@ -0,0 +1,31 @@ +{ + "1": { + "552720": "162f4b", + "ecd8b7": "b4c2a5", + "dfc043": "d17577", + "fffdfb": "d6d9ca", + "993c20": "1d3a57", + "b45f25": "2d5261", + "965821": "2f4e6b", + "e9be14": "945c7b", + "846b5b": "467f85", + "602c24": "162f4b", + "f9ed9f": "eb999a", + "e3882d": "3d7375", + "646124": "492652", + "fef443": "c48081" + }, + "2": { + "552720": "43617f", + "ecd8b7": "5a6f90", + "fffdfb": "6d8297", + "993c20": "965636", + "b45f25": "bd8551", + "965821": "9cb3ca", + "e9be14": "1a3551", + "846b5b": "202746", + "e3882d": "d3b06f", + "646124": "122140", + "fef443": "3a5873" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/2103.json b/public/images/pokemon/variant/exp/back/2103.json new file mode 100644 index 00000000000..2e97727835a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/2103.json @@ -0,0 +1,28 @@ +{ + "1": { + "2f9934": "dea44c", + "9f6b41": "426378", + "70442e": "283f5b", + "e6ac5a": "869fdc", + "522f16": "131d33", + "9cbd4a": "9977dd", + "fff68b": "a3c4ed", + "36cc36": "f4e774", + "2d5826": "c8592a", + "7b5210": "373e85", + "ffffcd": "d3efff" + }, + "2": { + "2f9934": "3d324b", + "9f6b41": "ffdbe7", + "70442e": "d59cba", + "e6ac5a": "c84e7f", + "522f16": "925b81", + "9cbd4a": "824a96", + "fff68b": "eb748d", + "36cc36": "6a5b73", + "2d5826": "1f1a31", + "7b5210": "4e1044", + "ffffcd": "ffa29d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/359-mega.json b/public/images/pokemon/variant/exp/back/359-mega.json new file mode 100644 index 00000000000..5ae5a7477e7 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/359-mega.json @@ -0,0 +1,24 @@ +{ + "1": { + "ffffff": "61a8ab", + "414a6a": "421e4a", + "b4b4d5": "458196", + "293939": "27122b", + "525a7b": "59274e", + "d5deee": "589aa6", + "737bac": "874267", + "626283": "2a3163", + "8b8bac": "3b6987" + }, + "2": { + "ffffff": "9e363b", + "414a6a": "b39279", + "b4b4d5": "752f40", + "293939": "996e5f", + "525a7b": "e0c79f", + "d5deee": "8f2f41", + "737bac": "f5f1cb", + "626283": "42122d", + "8b8bac": "59213b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/6503.json b/public/images/pokemon/variant/exp/back/6503.json new file mode 100644 index 00000000000..a977e095e71 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/6503.json @@ -0,0 +1,35 @@ +{ + "1": { + "181531": "a26579", + "fafcf9": "f6f4f4", + "84a4a7": "563785", + "a82c47": "d45b9e", + "8aa3a3": "d3a0bb", + "494a48": "3d2439", + "1d3962": "28142c", + "474a46": "2b1838", + "d75063": "b73891", + "6b1c34": "8f3396", + "1e224e": "dc95ae", + "1e5b9b": "4d244b", + "8da8a8": "a58b90", + "597471": "332a59", + "282f62": "f7d9de" + }, + "2": { + "181531": "715b72", + "fafcf9": "2c3940", + "84a4a7": "41857b", + "a82c47": "8abfb1", + "8aa3a3": "232d2e", + "494a48": "181f20", + "1d3962": "321e1e", + "474a46": "181f20", + "d75063": "8f65d8", + "6b1c34": "6d9d9a", + "1e224e": "ba9bc1", + "1e5b9b": "5e3e38", + "597471": "2a5c57", + "282f62": "efdfee" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/656.json b/public/images/pokemon/variant/exp/back/656.json new file mode 100644 index 00000000000..34b11bfab78 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/656.json @@ -0,0 +1,24 @@ +{ + "1": { + "838394": "4d7dc5", + "7bcdff": "9c75c2", + "62ace6": "8363af", + "ffffff": "b1e5ff", + "396a83": "362864", + "9c9cc5": "5385c7", + "cdcde6": "7eb7e8", + "174592": "198158", + "5a94cd": "7054a4" + }, + "2": { + "838394": "cc6845", + "7bcdff": "dd6155", + "62ace6": "c44848", + "ffffff": "fff4bd", + "396a83": "5c0d33", + "9c9cc5": "c96a48", + "cdcde6": "f7b785", + "174592": "198158", + "5a94cd": "a92f3f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/657.json b/public/images/pokemon/variant/exp/back/657.json new file mode 100644 index 00000000000..083a9dba0a6 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/657.json @@ -0,0 +1,24 @@ +{ + "1": { + "f8f8f8": "8dcfff", + "737373": "0f3f82", + "0b566a": "281f52", + "002c58": "1c0726", + "bfbfbf": "4386df", + "006ba6": "4e1852", + "0b4a7a": "340f3d", + "41ccf5": "7755a7", + "2896b5": "4b3578" + }, + "2": { + "f8f8f8": "fff6c7", + "737373": "df6a50", + "0b566a": "7e1628", + "002c58": "0c3b54", + "bfbfbf": "ffc996", + "006ba6": "239c91", + "0b4a7a": "156f78", + "41ccf5": "dd7355", + "2896b5": "a92f3a" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/658-ash.json b/public/images/pokemon/variant/exp/back/658-ash.json new file mode 100644 index 00000000000..370d5df8081 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/658-ash.json @@ -0,0 +1,38 @@ +{ + "1": { + "265595": "432b6c", + "de3431": "3fca9f", + "f8f8f8": "a1e9f0", + "7b282e": "0e3e81", + "6b1d1d": "206d74", + "134e52": "062e3c", + "bfb169": "165e78", + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "282c35": "271f4c", + "f2798d": "8dcfff", + "268794": "1c3e58", + "3e7acc": "6b4592", + "7ddeff": "7ddcd6", + "4ebdd9": "41a7b0", + "18335c": "170738" + }, + "2": { + "265595": "cc7251", + "de3431": "9ceec6", + "f8f8f8": "89d2b8", + "7b282e": "152a5c", + "6b1d1d": "356e8d", + "134e52": "0d1e3e", + "bfb169": "4d2637", + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "282c35": "4d2637", + "f2798d": "5eb4a9", + "268794": "1c3e58", + "3e7acc": "ecbb7a", + "7ddeff": "46988d", + "4ebdd9": "2f6e74", + "18335c": "9f2727" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/658.json b/public/images/pokemon/variant/exp/back/658.json new file mode 100644 index 00000000000..c1bb4222ce4 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/658.json @@ -0,0 +1,26 @@ +{ + "1": { + "ffb2bf": "b7e9ff", + "bf4c60": "4386df", + "3d61cc": "6b4592", + "fff0a6": "208698", + "2e4999": "432b6c", + "f2798d": "8dcfff", + "803340": "0e3e81", + "1b2a59": "170738", + "66d9ff": "7ddcd6", + "bfb169": "165e78" + }, + "2": { + "ffb2bf": "86d6b6", + "bf4c60": "32738b", + "3d61cc": "ecbb7a", + "fff0a6": "652240", + "2e4999": "cc7251", + "f2798d": "5eb4a9", + "803340": "152a5c", + "1b2a59": "9f2727", + "66d9ff": "48968c", + "bfb169": "431022" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/676.json b/public/images/pokemon/variant/exp/back/676.json new file mode 100644 index 00000000000..7e64f6b0f61 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/676.json @@ -0,0 +1,21 @@ +{ + "1": { + "f2f2da": "8a1d1d", + "3f6273": "2b040f", + "595350": "788087", + "736b67": "a6afb3", + "ccccb8": "5e0f16", + "66665c": "2b040f", + "a6a695": "42090e" + }, + "2": { + "cc2929": "3a240e", + "f2f2da": "c18960", + "3f6273": "4a281b", + "595350": "e6c594", + "736b67": "ffe6ac", + "ccccb8": "a4624a", + "66665c": "4a281b", + "a6a695": "805145" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/682.json b/public/images/pokemon/variant/exp/back/682.json new file mode 100644 index 00000000000..bc2111153cf --- /dev/null +++ b/public/images/pokemon/variant/exp/back/682.json @@ -0,0 +1,21 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "7f4d59": "20644e", + "4d4d4d": "a6a6a6" + }, + "2": { + "4f4c4f": "332539", + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "7f4d59": "a23812", + "e5e5e5": "6b4767", + "4d4d4d": "503851", + "737373": "422f46" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/683.json b/public/images/pokemon/variant/exp/back/683.json new file mode 100644 index 00000000000..9d7f4682b9a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/683.json @@ -0,0 +1,20 @@ +{ + "1": { + "6b3962": "30185d", + "cc7087": "318759", + "993d80": "4f297e", + "ff99b3": "48ab61", + "404040": "2c283b", + "7f4d59": "20644e", + "bf5f9f": "7c48a1" + }, + "2": { + "6b3962": "b89477", + "cc7087": "c3561a", + "993d80": "d2bfa1", + "ff99b3": "da7e29", + "404040": "2a2234", + "7f4d59": "a23812", + "bf5f9f": "f0ebdd" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/684.json b/public/images/pokemon/variant/exp/back/684.json new file mode 100644 index 00000000000..25de3aa838f --- /dev/null +++ b/public/images/pokemon/variant/exp/back/684.json @@ -0,0 +1,22 @@ +{ + "1": { + "805963": "2d0c42", + "553a41": "8f1d15", + "ffccd9": "8961c6", + "cc99a6": "613b84", + "fff2f2": "f39f62", + "5e4048": "260b37", + "ccadad": "df6b40", + "7b5760": "b13924" + }, + "2": { + "805963": "6796aa", + "553a41": "1d1426", + "ffccd9": "cbf6da", + "cc99a6": "93d6ce", + "fff2f2": "746998", + "5e4048": "52718e", + "ccadad": "4b4876", + "7b5760": "3c2f51" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/685.json b/public/images/pokemon/variant/exp/back/685.json new file mode 100644 index 00000000000..a144e0d45ff --- /dev/null +++ b/public/images/pokemon/variant/exp/back/685.json @@ -0,0 +1,26 @@ +{ + "1": { + "f8f8f8": "caff90", + "661a2d": "13391c", + "805963": "2d0c42", + "ffccd9": "8961c6", + "ff8ca9": "8dbe6d", + "cc99a6": "613b84", + "e53964": "689b52", + "fff2f2": "f39f62", + "ccadad": "df6b40", + "a62949": "26592b" + }, + "2": { + "f8f8f8": "e4819d", + "661a2d": "26061b", + "805963": "679baa", + "ffccd9": "cbf6da", + "ff8ca9": "8c4264", + "cc99a6": "93d6ce", + "e53964": "612747", + "fff2f2": "746998", + "ccadad": "4b4876", + "a62949": "441838" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/688.json b/public/images/pokemon/variant/exp/back/688.json new file mode 100644 index 00000000000..e3d15e60fed --- /dev/null +++ b/public/images/pokemon/variant/exp/back/688.json @@ -0,0 +1,30 @@ +{ + "1": { + "bfeaff": "e8d37b", + "f2f2f2": "e8e5c6", + "5b8da6": "a9582e", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "70240f", + "b3b3b3": "d3bc8c", + "ffac59": "70cccf", + "85b4cc": "cd8a50", + "997e2e": "4557b5", + "cc8a47": "459aac", + "66541f": "373295" + }, + "2": { + "bfeaff": "a74083", + "f2f2f2": "d1ec8c", + "5b8da6": "4b0038", + "595959": "4d6a09", + "403410": "1e1324", + "3f6273": "2c052a", + "b3b3b3": "94c268", + "ffac59": "4a376e", + "85b4cc": "731f5c", + "997e2e": "f6eefc", + "cc8a47": "332149", + "66541f": "ba9fba" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/689.json b/public/images/pokemon/variant/exp/back/689.json new file mode 100644 index 00000000000..6c47b57f35b --- /dev/null +++ b/public/images/pokemon/variant/exp/back/689.json @@ -0,0 +1,31 @@ +{ + "1": { + "cc7f70": "459aac", + "f2f2f2": "e8e5c6", + "5b8da6": "8d5030", + "595959": "7c582e", + "403410": "220a56", + "3f6273": "672e1e", + "b3b3b3": "d3bc8c", + "bfeaff": "e8d37b", + "85b4cc": "cd8a50", + "ff9f8c": "70cccf", + "66541f": "373295", + "997e2e": "4557b5" + }, + "2": { + "cc7f70": "332149", + "f2f2f2": "caea77", + "5b8da6": "4b0038", + "595959": "2a5524", + "403410": "3f2a4b", + "3f6273": "3e073b", + "b3b3b3": "7eac4e", + "bfeaff": "a74083", + "85b4cc": "731f5c", + "f8f8f8": "dbaf67", + "ff9f8c": "4a376e", + "66541f": "ccb6cc", + "997e2e": "f6eefc" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/807.json b/public/images/pokemon/variant/exp/back/807.json new file mode 100644 index 00000000000..aff6a52c9b2 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/807.json @@ -0,0 +1,38 @@ +{ + "1": { + "53e4f9": "eac1eb", + "ef8a4e": "4f7bb6", + "2759a5": "736599", + "5bd0f2": "ebceff", + "2394d8": "b298d8", + "31343e": "14193f", + "1f73b4": "995fc0", + "4cf4fe": "f4a7ff", + "484f57": "243058", + "daa936": "5c96b4", + "727678": "3e5277", + "30cff1": "d7a7de", + "f9e455": "80c7d7", + "000000": "ffffff", + "9d682d": "3d648c", + "14bdea": "c987e3" + }, + "2": { + "53e4f9": "e688af", + "ef8a4e": "844c94", + "2759a5": "a3378a", + "5bd0f2": "df7298", + "2394d8": "be5293", + "31343e": "a880b0", + "1f73b4": "9a1d82", + "4cf4fe": "e3418f", + "484f57": "cba3ca", + "daa936": "351d53", + "727678": "e7c9e2", + "30cff1": "d967a2", + "f9e455": "58326f", + "000000": "ffffff", + "9d682d": "1f1144", + "14bdea": "c02f8d" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/894.json b/public/images/pokemon/variant/exp/back/894.json new file mode 100644 index 00000000000..276133a842a --- /dev/null +++ b/public/images/pokemon/variant/exp/back/894.json @@ -0,0 +1,24 @@ +{ + "1": { + "e5ee1a": "6ad7f3", + "7d542a": "2769aa", + "bc8b2f": "124b78", + "8eacdd": "caffd1", + "2e3967": "357b84", + "fefac7": "dffff6", + "375395": "5fcaad", + "4e7cc9": "9bf1c4", + "d7ad0d": "45a3d6" + }, + "2": { + "e5ee1a": "d4ffd0", + "7d542a": "429877", + "bc8b2f": "2a6f5d", + "8eacdd": "c693d8", + "2e3967": "514199", + "fefac7": "ffffff", + "375395": "815bad", + "4e7cc9": "b67cd6", + "d7ad0d": "7cd395" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/895.json b/public/images/pokemon/variant/exp/back/895.json new file mode 100644 index 00000000000..d6859edafb3 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/895.json @@ -0,0 +1,28 @@ +{ + "1": { + "641e2c": "722123", + "b63650": "bc623e", + "608d99": "fae5bf", + "2b3d40": "754f47", + "4b6f78": "f1d4b6", + "e05276": "ef8429", + "f27a99": "efb55a", + "ff92ae": "edca71", + "3f545f": "ad8473", + "872c3c": "93372d", + "242e35": "512c25" + }, + "2": { + "641e2c": "15553b", + "b63650": "3bb349", + "608d99": "9b7ebc", + "2b3d40": "241951", + "4b6f78": "5a4382", + "e05276": "8aea41", + "f27a99": "dfff75", + "ff92ae": "f1ff8d", + "3f545f": "3a2a67", + "872c3c": "227843", + "242e35": "0f0c1e" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/944.json b/public/images/pokemon/variant/exp/back/944.json new file mode 100644 index 00000000000..6de6bc5e833 --- /dev/null +++ b/public/images/pokemon/variant/exp/back/944.json @@ -0,0 +1,34 @@ +{ + "1": { + "403f4f": "33784a", + "dcdcc3": "88eeab", + "484441": "286943", + "282434": "16402d", + "2f2826": "18493f", + "774d9b": "d09139", + "8095a8": "5e4090", + "e6e2e1": "53a164", + "a599a8": "3f8d59", + "211e28": "103833", + "bbd2e3": "8056a7", + "aca699": "3ec295", + "000000": "ffffff", + "6c5c4d": "1c9b8d" + }, + "2": { + "403f4f": "395d87", + "dcdcc3": "e2f3ff", + "484441": "2c4f8a", + "282434": "1d2f5b", + "2f2826": "1e3072", + "774d9b": "4c5372", + "8095a8": "902a4b", + "e6e2e1": "78b0c2", + "a599a8": "5582a4", + "211e28": "17255b", + "bbd2e3": "c23f4f", + "aca699": "abc1df", + "000000": "ffffff", + "6c5c4d": "6777aa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/exp/back/945.json b/public/images/pokemon/variant/exp/back/945.json new file mode 100644 index 00000000000..6590d0b67ed --- /dev/null +++ b/public/images/pokemon/variant/exp/back/945.json @@ -0,0 +1,43 @@ +{ + "1": { + "403f4f": "357747", + "1f2635": "1c193d", + "dcdcc3": "5ddcb2", + "282434": "14463f", + "a491a4": "499833", + "e6e2e1": "fffbf3", + "671544": "0f4e67", + "134175": "a74d2a", + "4f483f": "1b727b", + "323d4a": "2e2452", + "000000": "ffffff", + "4b616b": "473869", + "d73875": "29ad89", + "2481b0": "d09139", + "38bdda": "ffe269", + "695575": "16613d", + "aca699": "2db3a4", + "8d2151": "157375" + }, + "2": { + "403f4f": "3b6b9e", + "1f2635": "3b091c", + "dcdcc3": "edf0f1", + "282434": "2d427e", + "a491a4": "902a4b", + "e6e2e1": "ebf4f9", + "671544": "223969", + "134175": "1c182f", + "4f483f": "5d7487", + "323d4a": "580f1d", + "000000": "ffffff", + "4b616b": "8a2029", + "a599a8": "bf888f", + "d73875": "68adca", + "2481b0": "2c2c46", + "38bdda": "494e64", + "695575": "4f133f", + "aca699": "acbfc7", + "8d2151": "4676aa" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/154.json b/public/images/pokemon/variant/female/154.json new file mode 100644 index 00000000000..c02d214d834 --- /dev/null +++ b/public/images/pokemon/variant/female/154.json @@ -0,0 +1,30 @@ +{ + "1": { + "634a00": "6da0df", + "f7a59c": "3c88ac", + "e6ad00": "90c6f8", + "ff3a5a": "234d81", + "ffde21": "b9e2ff", + "ce213a": "192e5e", + "63bd42": "9d86d9", + "bdff7b": "dadffe", + "7b103a": "111c44", + "107b31": "8057b2", + "fefefe": "a6f5af", + "9ce652": "b7afee" + }, + "2": { + "634a00": "144627", + "f7a59c": "ddf2b5", + "e6ad00": "1e632b", + "ff3a5a": "9ed662", + "ffde21": "288028", + "ce213a": "81c65c", + "63bd42": "a31f60", + "bdff7b": "f57382", + "7b103a": "59ac45", + "107b31": "761858", + "fefefe": "f6ffdf", + "9ce652": "cd3b6b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/194.json b/public/images/pokemon/variant/female/194.json new file mode 100644 index 00000000000..5824dec5029 --- /dev/null +++ b/public/images/pokemon/variant/female/194.json @@ -0,0 +1,24 @@ +{ + "1": { + "104a84": "7a150a", + "b54242": "1a6a62", + "ff6b73": "4db983", + "633a6b": "09484f", + "3a7bc5": "d5682e", + "ef73e6": "44d77f", + "73bdff": "ffc355", + "529ce6": "e8983d", + "d65ad6": "2ea380" + }, + "2": { + "104a84": "180d42", + "b54242": "8a9fc2", + "ff6b73": "e8faff", + "633a6b": "444c7e", + "3a7bc5": "3f377e", + "ef73e6": "e8faff", + "73bdff": "5c66c4", + "529ce6": "564daa", + "d65ad6": "aeccdf" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/195.json b/public/images/pokemon/variant/female/195.json new file mode 100644 index 00000000000..ff25261d120 --- /dev/null +++ b/public/images/pokemon/variant/female/195.json @@ -0,0 +1,25 @@ +{ + "1": { + "ade6ff": "f6dfa8", + "84d6f7": "ed9e4f", + "f7f7f7": "fffbea", + "637ba5": "816251", + "639cbd": "dc6a4d", + "3194a5": "44d77f", + "425284": "b03844", + "195a6b": "2ea380", + "6b5a8c": "1b5a55" + }, + "2": { + "ade6ff": "9864c2", + "84d6f7": "724ba7", + "f7f7f7": "e8b6ff", + "637ba5": "504a8a", + "639cbd": "493a8d", + "3194a5": "ebf5ff", + "19423a": "747aae", + "425284": "240830", + "195a6b": "aebbdf", + "6b5a8c": "5e649b" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/198.json b/public/images/pokemon/variant/female/198.json new file mode 100644 index 00000000000..b0386502899 --- /dev/null +++ b/public/images/pokemon/variant/female/198.json @@ -0,0 +1,34 @@ +{ + "1": { + "d94352": "b3986b", + "314263": "462b20", + "d64252": "7a101c", + "73293a": "4d0419", + "ffad8c": "ad2e24", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "a6a6b3", + "42639c": "694c30", + "5a4a21": "25253b", + "292942": "2a1512", + "b59c21": "57566f", + "752a3c": "755237", + "d6bd52": "838098" + }, + "2": { + "d94352": "bc4b84", + "314263": "0e4333", + "d64252": "5939a9", + "73293a": "1e1764", + "ffad8c": "b164e6", + "73283a": "630c17", + "d6404f": "8c1b23", + "efd684": "c2723a", + "42639c": "1d6e47", + "5a4a21": "4e1915", + "292942": "091e16", + "b59c21": "85412d", + "752a3c": "7b2363", + "d6bd52": "9a5524" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-beauty-cosplay.json b/public/images/pokemon/variant/female/25-beauty-cosplay.json new file mode 100644 index 00000000000..0e5a6a1bad2 --- /dev/null +++ b/public/images/pokemon/variant/female/25-beauty-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "c52119": "ad4e76", + "5e5e6b": "6c6e60", + "f7e652": "a3d1a8", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "e65137": "c95578", + "fffabf": "f4f7ab", + "b52821": "ad4469", + "292929": "1e1526", + "39509d": "47449c", + "f7e860": "f2ea50", + "e65a42": "cf6182", + "4d88c4": "7976c6", + "f7bd21": "79b5a5", + "2d276d": "2f2768", + "242323": "282030", + "585861": "443e6c", + "fff7a5": "c4e3c3", + "9c5200": "315c75", + "f7cc2f": "f7bd21", + "fffdea": "f8ffe3" + }, + "2": { + "c52119": "ebc67c", + "5e5e6b": "8a2554", + "f7e652": "577b98", + "52525a": "f1b571", + "cecab9": "b84084", + "e65137": "b95b6e", + "fffabf": "f5efd1", + "b52821": "6a253f", + "292929": "a45233", + "39509d": "9ec4cd", + "f7e860": "eddc78", + "e65a42": "eedd9c", + "4d88c4": "e4f6f1", + "f7bd21": "486689", + "2d276d": "454a61", + "242323": "282030", + "585861": "3f4246", + "fff7a5": "7b96aa", + "9c5200": "283361", + "965b0e": "96500e", + "f7cc2f": "d5ac44", + "fffdea": "ea82a6" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cool-cosplay.json b/public/images/pokemon/variant/female/25-cool-cosplay.json new file mode 100644 index 00000000000..de4a138b690 --- /dev/null +++ b/public/images/pokemon/variant/female/25-cool-cosplay.json @@ -0,0 +1,49 @@ +{ + "1": { + "171717": "2a1d36", + "e8b127": "f5ca2f", + "52525a": "55555e", + "c52119": "ad4e76", + "842222": "7b1f18", + "f7e652": "a3d1a8", + "fff7a5": "c4e3c3", + "2baf23": "76a848", + "f7bd21": "79b5a5", + "e65a42": "cf6182", + "ba2b23": "b73850", + "f5e193": "f4f7ab", + "e66953": "b95b6e", + "6f6c8e": "656f86", + "a6adb6": "a5b0b6", + "8c4e22": "965b0e", + "9c5200": "1c4f75", + "c43129": "6a253f", + "d95b45": "cf6887", + "45484d": "443e6c", + "3b3b40": "4a3e46", + "292929": "272b2b" + }, + "2": { + "171717": "a45233", + "e8b127": "e7b432", + "52525a": "8f4b32", + "c52119": "ebc67c", + "842222": "1e1e43", + "f7e652": "577b98", + "fff7a5": "7b96aa", + "2baf23": "572626", + "f7bd21": "445f8a", + "e65a42": "eedd9c", + "ba2b23": "2c2c47", + "f5e193": "eadbb3", + "e66953": "b95b6e", + "6f6c8e": "cf752b", + "a6adb6": "f0b541", + "8c4e22": "b1632b", + "9c5200": "22325c", + "c43129": "6a253f", + "d95b45": "3a3f5e", + "3b3b40": "f1b571", + "292929": "7d3833" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cosplay.json b/public/images/pokemon/variant/female/25-cosplay.json new file mode 100644 index 00000000000..e324c094019 --- /dev/null +++ b/public/images/pokemon/variant/female/25-cosplay.json @@ -0,0 +1,36 @@ +{ + "1": { + "f7e652": "a3d1a8", + "212121": "30263b", + "c43129": "6a253f", + "171717": "1e1526", + "292929": "282030", + "e65a42": "cf6182", + "c52119": "ad4e76", + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "f7bd21": "79b5a5", + "45454a": "4f454c", + "9c5200": "315c75", + "633108": "09406b", + "e66953": "b95b6e", + "de9400": "338087" + }, + "2": { + "f7e652": "577b98", + "212121": "d8805b", + "c43129": "6a253f", + "171717": "a45233", + "292929": "282030", + "e65a42": "eedd9c", + "c52119": "ebc67c", + "42424a": "3f4246", + "fff7a5": "7b96aa", + "f7bd21": "445f8a", + "45454a": "f1b571", + "9c5200": "23345e", + "633108": "22244f", + "e66953": "b95b6e", + "de9400": "324472" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-cute-cosplay.json b/public/images/pokemon/variant/female/25-cute-cosplay.json new file mode 100644 index 00000000000..26bebb4143d --- /dev/null +++ b/public/images/pokemon/variant/female/25-cute-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "212121": "30263b", + "e65a42": "cf6182", + "fff7a5": "c4e3c3", + "45454a": "4f454c", + "c52119": "ad4e76", + "9c5200": "255e8a", + "752bd0": "5452b7", + "f3bace": "f2bbbb", + "f7e652": "a3d1a8", + "ea82a6": "e8848e", + "e66953": "b95b6e", + "853247": "85323c", + "c43129": "6a253f", + "baa998": "bab699", + "42424a": "443e6c", + "fff9ba": "f0eaa8", + "f7bd21": "79b5a5", + "cf4770": "cf4a59" + }, + "2": { + "212121": "d8805b", + "e65a42": "eedd9c", + "fff7a5": "7b96aa", + "45454a": "f1b571", + "c52119": "ebc67c", + "9c5200": "1e2d52", + "752bd0": "7751c2", + "f3bace": "c5cc85", + "f7e652": "577b98", + "ea82a6": "a4b95f", + "e66953": "b95b6e", + "171717": "a45233", + "853247": "254b30", + "c43129": "6a253f", + "baa998": "d3ab5a", + "42424a": "373d45", + "fff9ba": "ebe7b7", + "f7bd21": "445f8a", + "cf4770": "739b55" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-partner.json b/public/images/pokemon/variant/female/25-partner.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/female/25-partner.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-smart-cosplay.json b/public/images/pokemon/variant/female/25-smart-cosplay.json new file mode 100644 index 00000000000..4ba98883f16 --- /dev/null +++ b/public/images/pokemon/variant/female/25-smart-cosplay.json @@ -0,0 +1,42 @@ +{ + "1": { + "212121": "30263b", + "b7a599": "bab699", + "60b553": "76a848", + "366635": "3e5b2f", + "e35252": "d16b9a", + "c52119": "ad4e76", + "292929": "272b2b", + "9c5200": "315c75", + "f7e652": "a3d1a8", + "95635b": "91685f", + "171717": "1e1526", + "ba2525": "993f70", + "e65a42": "cf6182", + "54545c": "55555e", + "52525a": "4f454c", + "fffdea": "f8ffe3", + "f7bd21": "79b5a5", + "5f3434": "573b38" + }, + "2": { + "212121": "d8805b", + "b7a599": "a7b6b9", + "60b553": "dfb053", + "366635": "ab5130", + "e35252": "3a3f5e", + "c52119": "ebc67c", + "292929": "202937", + "9c5200": "23345e", + "f7e652": "577b98", + "95635b": "a09ea3", + "171717": "a45233", + "ba2525": "2b2b45", + "e65a42": "eedd9c", + "54545c": "45525c", + "52525a": "f1b571", + "fffdea": "f2f0df", + "f7bd21": "445f8a", + "5f3434": "666060" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25-tough-cosplay.json b/public/images/pokemon/variant/female/25-tough-cosplay.json new file mode 100644 index 00000000000..620ac882643 --- /dev/null +++ b/public/images/pokemon/variant/female/25-tough-cosplay.json @@ -0,0 +1,43 @@ +{ + "1": { + "e37511": "d1694f", + "bf2629": "bf3638", + "303030": "30263b", + "b8282b": "753652", + "8d2b1d": "8e2525", + "424242": "443e6c", + "c52119": "ad4e76", + "292929": "1e1526", + "f7bd21": "79b5a5", + "fbab33": "de9764", + "db4a37": "ad4c60", + "e65a42": "cf6182", + "9c5200": "315c75", + "db5b42": "cf6a59", + "52525a": "4f454c", + "cecab9": "cfc8aa", + "f7e652": "a3d1a8" + }, + "2": { + "e37511": "644794", + "bf2629": "8e6fa1", + "f8ffe3": "e8e3e4", + "303030": "d8805b", + "b8282b": "6a253f", + "8d2b1d": "242866", + "424242": "3f4246", + "c52119": "e8be68", + "292929": "a45233", + "f7bd21": "445f8a", + "fbab33": "845ea1", + "db4a37": "b95b6e", + "e65a42": "edda8c", + "9c5200": "23345e", + "db5b42": "624780", + "52525a": "f1b571", + "4d4d4d": "2b3340", + "272b2b": "162231", + "cecab9": "cfc0c3", + "f7e652": "577b98" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/25.json b/public/images/pokemon/variant/female/25.json new file mode 100644 index 00000000000..0542587ba6d --- /dev/null +++ b/public/images/pokemon/variant/female/25.json @@ -0,0 +1,36 @@ +{ + "1": { + "42424a": "443e6c", + "fff7a5": "c4e3c3", + "c52119": "ad4e76", + "de9400": "338087", + "e65a42": "cf6182", + "f7e652": "a3d1a8", + "e66953": "b95b6e", + "45454a": "4f454c", + "292929": "282030", + "c43129": "6a253f", + "212121": "30263b", + "171717": "1e1526", + "f7bd21": "79b5a5", + "9c5200": "315c75", + "633108": "09406b" + }, + "2": { + "42424a": "3f4246", + "fff7a5": "7b96aa", + "c52119": "ebc67c", + "de9400": "324472", + "e65a42": "eedd9c", + "f7e652": "577b98", + "e66953": "b95b6e", + "45454a": "f1b571", + "292929": "282030", + "c43129": "6a253f", + "212121": "d8805b", + "171717": "a45233", + "f7bd21": "445f8a", + "9c5200": "23345e", + "633108": "22244f" + } +} \ No newline at end of file diff --git a/public/images/pokemon/variant/female/26.json b/public/images/pokemon/variant/female/26.json new file mode 100644 index 00000000000..40921512c4b --- /dev/null +++ b/public/images/pokemon/variant/female/26.json @@ -0,0 +1,39 @@ +{ + "1": { + "101010": "000000", + "ffefd6": "c8d4ba", + "bd1908": "ad4e76", + "944242": "643034", + "bd5a31": "386d82", + "e6bd84": "a4bda7", + "ffbd00": "b3596b", + "5a2929": "293059", + "3a3a42": "30263b", + "8c6310": "8c3c4c", + "ffde5a": "cf7878", + "8d5911": "983e50", + "734231": "6e2f33", + "63636b": "4f454c", + "de7b31": "539190", + "f7ad29": "76a68b", + "643034": "395a80" + }, + "2": { + "101010": "000000", + "ffefd6": "cfc4b5", + "542127": "905331", + "bd1908": "a44c5d", + "944242": "2e4685", + "bd5a31": "375681", + "e6bd84": "a6b5ab", + "ffbd00": "f3cf91", + "5a2929": "202a60", + "8c6310": "c79b5a", + "ffde5a": "f2e4b6", + "8d5911": "dea96e", + "734231": "bd8447", + "de7b31": "4d6f98", + "f7ad29": "6385ab", + "643034": "2d3b80" + } +} \ No newline at end of file diff --git a/public/images/pokemon_icons_1v.json b/public/images/pokemon_icons_1v.json index 4400b9d0213..de66db65eb7 100644 --- a/public/images/pokemon_icons_1v.json +++ b/public/images/pokemon_icons_1v.json @@ -1,1740 +1,2299 @@ -{ "frames": { - "100_2": { - "frame": { "x": 390, "y": 53, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "100_3": { - "frame": { "x": 328, "y": 30, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "101_2": { - "frame": { "x": 287, "y": 172, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "101_3": { - "frame": { "x": 263, "y": 156, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "111_2": { - "frame": { "x": 211, "y": 226, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "111_3": { - "frame": { "x": 265, "y": 233, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "112_2": { - "frame": { "x": 347, "y": 125, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "112_3": { - "frame": { "x": 322, "y": 125, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_1": { - "frame": { "x": 421, "y": 158, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_2": { - "frame": { "x": 299, "y": 277, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "113_3": { - "frame": { "x": 280, "y": 276, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "114_2": { - "frame": { "x": 212, "y": 297, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "114_3": { - "frame": { "x": 336, "y": 298, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "116_2": { - "frame": { "x": 142, "y": 303, "w": 18, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "116_3": { - "frame": { "x": 17, "y": 303, "w": 18, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 18, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "117_2": { - "frame": { "x": 92, "y": 226, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "117_3": { - "frame": { "x": 376, "y": 223, "w": 24, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 24, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_1": { - "frame": { "x": 400, "y": 241, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_2": { - "frame": { "x": 20, "y": 242, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "118_3": { - "frame": { "x": 372, "y": 243, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_1": { - "frame": { "x": 400, "y": 200, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_2": { - "frame": { "x": 196, "y": 199, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "119_3": { - "frame": { "x": 0, "y": 199, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "120_2": { - "frame": { "x": 77, "y": 306, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "120_3": { - "frame": { "x": 94, "y": 311, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "121_2": { - "frame": { "x": 355, "y": 300, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "121_3": { - "frame": { "x": 58, "y": 296, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_1": { - "frame": { "x": 148, "y": 284, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_2": { - "frame": { "x": 0, "y": 284, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "123_3": { - "frame": { "x": 173, "y": 283, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_1": { - "frame": { "x": 69, "y": 235, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_2": { - "frame": { "x": 311, "y": 235, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "125_3": { - "frame": { "x": 235, "y": 234, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "126_2": { - "frame": { "x": 287, "y": 188, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "126_3": { - "frame": { "x": 378, "y": 178, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127-mega_2": { - "frame": { "x": 0, "y": 54, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127-mega_3": { - "frame": { "x": 359, "y": 53, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127_2": { - "frame": { "x": 0, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "127_3": { - "frame": { "x": 46, "y": 223, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "129_2": { - "frame": { "x": 213, "y": 175, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "129_3": { - "frame": { "x": 418, "y": 0, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130-mega_2": { - "frame": { "x": 30, "y": 25, "w": 30, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130-mega_3": { - "frame": { "x": 0, "y": 25, "w": 30, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 30, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130_2": { - "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "130_3": { - "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131-gigantamax_2": { - "frame": { "x": 373, "y": 25, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131-gigantamax_3": { - "frame": { "x": 342, "y": 25, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131_2": { - "frame": { "x": 172, "y": 198, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "131_3": { - "frame": { "x": 354, "y": 194, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "132_2": { - "frame": { "x": 231, "y": 311, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "132_3": { - "frame": { "x": 247, "y": 312, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "133_2": { - "frame": { "x": 0, "y": 303, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "133_3": { - "frame": { "x": 35, "y": 305, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "134_2": { - "frame": { "x": 165, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "134_3": { - "frame": { "x": 69, "y": 214, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_1": { - "frame": { "x": 20, "y": 261, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_2": { - "frame": { "x": 153, "y": 263, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "135_3": { - "frame": { "x": 396, "y": 260, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_1": { - "frame": { "x": 23, "y": 221, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_2": { - "frame": { "x": 400, "y": 220, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "136_3": { - "frame": { "x": 142, "y": 217, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "137_2": { - "frame": { "x": 280, "y": 296, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "137_3": { - "frame": { "x": 299, "y": 297, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "138_2": { - "frame": { "x": 415, "y": 301, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "138_3": { - "frame": { "x": 167, "y": 302, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "139_2": { - "frame": { "x": 47, "y": 201, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "139_3": { - "frame": { "x": 243, "y": 212, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "140_2": { - "frame": { "x": 263, "y": 312, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "140_3": { - "frame": { "x": 424, "y": 239, "w": 16, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 15, "w": 16, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "141_2": { - "frame": { "x": 261, "y": 276, "w": 19, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "141_3": { - "frame": { "x": 214, "y": 276, "w": 19, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142-mega_2": { - "frame": { "x": 268, "y": 56, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142-mega_3": { - "frame": { "x": 62, "y": 57, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142_2": { - "frame": { "x": 322, "y": 103, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "142_3": { - "frame": { "x": 351, "y": 103, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_1": { - "frame": { "x": 304, "y": 168, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_2": { - "frame": { "x": 49, "y": 158, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "144_3": { - "frame": { "x": 394, "y": 158, "w": 27, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_1": { - "frame": { "x": 77, "y": 155, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_2": { - "frame": { "x": 130, "y": 153, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "145_3": { - "frame": { "x": 159, "y": 153, "w": 29, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 29, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_1": { - "frame": { "x": 70, "y": 196, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_2": { - "frame": { "x": 122, "y": 195, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "146_3": { - "frame": { "x": 258, "y": 194, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "147_2": { - "frame": { "x": 192, "y": 287, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "147_3": { - "frame": { "x": 38, "y": 287, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "148_2": { - "frame": { "x": 98, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "148_3": { - "frame": { "x": 378, "y": 201, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "149_2": { - "frame": { "x": 188, "y": 155, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "149_3": { - "frame": { "x": 24, "y": 156, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-x_2": { - "frame": { "x": 106, "y": 155, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-x_3": { - "frame": { "x": 242, "y": 156, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-y_2": { - "frame": { "x": 175, "y": 107, "w": 20, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150-mega-y_3": { - "frame": { "x": 407, "y": 108, "w": 20, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150_2": { - "frame": { "x": 352, "y": 236, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "150_3": { - "frame": { "x": 332, "y": 235, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "151_2": { - "frame": { "x": 195, "y": 130, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "151_3": { - "frame": { "x": 231, "y": 127, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "19_2": { - "frame": { "x": 321, "y": 258, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "19_3": { - "frame": { "x": 0, "y": 263, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1_2": { - "frame": { "x": 338, "y": 279, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1_3": { - "frame": { "x": 318, "y": 279, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "20_2": { - "frame": { "x": 174, "y": 177, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "20_3": { - "frame": { "x": 23, "y": 178, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "23_2": { - "frame": { "x": 416, "y": 280, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "23_3": { - "frame": { "x": 20, "y": 282, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "24_2": { - "frame": { "x": 138, "y": 238, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "24_3": { - "frame": { "x": 0, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_1": { - "frame": { "x": 130, "y": 133, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_2": { - "frame": { "x": 397, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "29_3": { - "frame": { "x": 379, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2_2": { - "frame": { "x": 362, "y": 262, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2_3": { - "frame": { "x": 173, "y": 263, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-gigantamax_2": { - "frame": { "x": 214, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-gigantamax_3": { - "frame": { "x": 246, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-mega_2": { - "frame": { "x": 181, "y": 58, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3-mega_3": { - "frame": { "x": 152, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "30_2": { - "frame": { "x": 87, "y": 267, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "30_3": { - "frame": { "x": 40, "y": 265, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_1": { - "frame": { "x": 331, "y": 168, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_2": { - "frame": { "x": 0, "y": 172, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "31_3": { - "frame": { "x": 127, "y": 172, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "35_2": { - "frame": { "x": 318, "y": 298, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "35_3": { - "frame": { "x": 124, "y": 299, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "36_2": { - "frame": { "x": 178, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "36_3": { - "frame": { "x": 158, "y": 240, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "37_2": { - "frame": { "x": 194, "y": 267, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "37_3": { - "frame": { "x": 241, "y": 274, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "38_2": { - "frame": { "x": 370, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "38_3": { - "frame": { "x": 218, "y": 152, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3_2": { - "frame": { "x": 0, "y": 79, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "3_3": { - "frame": { "x": 240, "y": 80, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_1": { - "frame": { "x": 341, "y": 259, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_2": { - "frame": { "x": 416, "y": 260, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "41_3": { - "frame": { "x": 132, "y": 261, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_1": { - "frame": { "x": 104, "y": 133, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_2": { - "frame": { "x": 25, "y": 134, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "42_3": { - "frame": { "x": 51, "y": 136, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "43_2": { - "frame": { "x": 423, "y": 220, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "43_3": { - "frame": { "x": 423, "y": 178, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "44_2": { - "frame": { "x": 116, "y": 235, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "44_3": { - "frame": { "x": 289, "y": 235, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "45_2": { - "frame": { "x": 100, "y": 181, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "45_3": { - "frame": { "x": 48, "y": 178, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_1": { - "frame": { "x": 65, "y": 257, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_2": { - "frame": { "x": 299, "y": 257, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "46_3": { - "frame": { "x": 78, "y": 113, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_1": { - "frame": { "x": 25, "y": 199, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_2": { - "frame": { "x": 308, "y": 213, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "47_3": { - "frame": { "x": 120, "y": 213, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4_2": { - "frame": { "x": 59, "y": 277, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4_3": { - "frame": { "x": 106, "y": 277, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "50_2": { - "frame": { "x": 425, "y": 138, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "50_3": { - "frame": { "x": 425, "y": 197, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "51_2": { - "frame": { "x": 286, "y": 211, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "51_3": { - "frame": { "x": 221, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_1": { - "frame": { "x": 77, "y": 83, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_2": { - "frame": { "x": 54, "y": 81, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52-gigantamax_3": { - "frame": { "x": 417, "y": 78, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_1": { - "frame": { "x": 44, "y": 244, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_2": { - "frame": { "x": 90, "y": 246, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "52_3": { - "frame": { "x": 198, "y": 246, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_1": { - "frame": { "x": 235, "y": 182, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_2": { - "frame": { "x": 400, "y": 178, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "53_3": { - "frame": { "x": 309, "y": 191, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_1": { - "frame": { "x": 342, "y": 148, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_2": { - "frame": { "x": 314, "y": 148, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "56_3": { - "frame": { "x": 397, "y": 138, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_1": { - "frame": { "x": 150, "y": 83, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_2": { - "frame": { "x": 294, "y": 103, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "57_3": { - "frame": { "x": 0, "y": 103, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "5_2": { - "frame": { "x": 332, "y": 191, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "5_3": { - "frame": { "x": 150, "y": 194, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-gigantamax_2": { - "frame": { "x": 270, "y": 80, "w": 24, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-gigantamax_3": { - "frame": { "x": 30, "y": 81, "w": 24, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-x_2": { - "frame": { "x": 40, "y": 0, "w": 40, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-x_3": { - "frame": { "x": 0, "y": 0, "w": 40, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 2, "w": 40, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-y_2": { - "frame": { "x": 380, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6-mega-y_3": { - "frame": { "x": 342, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "69_2": { - "frame": { "x": 173, "y": 137, "w": 20, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "69_3": { - "frame": { "x": 185, "y": 305, "w": 20, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 20, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6_2": { - "frame": { "x": 60, "y": 29, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6_3": { - "frame": { "x": 404, "y": 25, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "70_2": { - "frame": { "x": 277, "y": 256, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "70_3": { - "frame": { "x": 219, "y": 256, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "71_2": { - "frame": { "x": 178, "y": 84, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "71_3": { - "frame": { "x": 210, "y": 83, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "77_2": { - "frame": { "x": 280, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "77_3": { - "frame": { "x": 0, "y": 149, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "78_2": { - "frame": { "x": 123, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "78_3": { - "frame": { "x": 94, "y": 57, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_1": { - "frame": { "x": 265, "y": 212, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_2": { - "frame": { "x": 256, "y": 253, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "79_3": { - "frame": { "x": 111, "y": 256, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "7_2": { - "frame": { "x": 233, "y": 294, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "7_3": { - "frame": { "x": 80, "y": 289, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80-mega_2": { - "frame": { "x": 125, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80-mega_3": { - "frame": { "x": 100, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80_2": { - "frame": { "x": 238, "y": 104, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "80_3": { - "frame": { "x": 380, "y": 103, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "81_2": { - "frame": { "x": 101, "y": 296, "w": 23, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "81_3": { - "frame": { "x": 254, "y": 297, "w": 23, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 23, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "82_2": { - "frame": { "x": 354, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "82_3": { - "frame": { "x": 76, "y": 174, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "83_2": { - "frame": { "x": 78, "y": 133, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "83_3": { - "frame": { "x": 254, "y": 134, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_1": { - "frame": { "x": 358, "y": 282, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_2": { - "frame": { "x": 383, "y": 281, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "84_3": { - "frame": { "x": 127, "y": 281, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_1": { - "frame": { "x": 388, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_2": { - "frame": { "x": 359, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "85_3": { - "frame": { "x": 330, "y": 78, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_1": { - "frame": { "x": 53, "y": 113, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_2": { - "frame": { "x": 28, "y": 111, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "86_3": { - "frame": { "x": 148, "y": 130, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_1": { - "frame": { "x": 372, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_2": { - "frame": { "x": 0, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "87_3": { - "frame": { "x": 289, "y": 126, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8_2": { - "frame": { "x": 150, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8_3": { - "frame": { "x": 263, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-gigantamax_2": { - "frame": { "x": 181, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-gigantamax_3": { - "frame": { "x": 152, "y": 29, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-mega_2": { - "frame": { "x": 122, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9-mega_3": { - "frame": { "x": 92, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_1": { - "frame": { "x": 188, "y": 219, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_2": { - "frame": { "x": 330, "y": 214, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "92_3": { - "frame": { "x": 353, "y": 215, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_1": { - "frame": { "x": 404, "y": 52, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_2": { - "frame": { "x": 268, "y": 30, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "93_3": { - "frame": { "x": 298, "y": 30, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_1": { - "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_2": { - "frame": { "x": 310, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-gigantamax_3": { - "frame": { "x": 278, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_1": { - "frame": { "x": 148, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_2": { - "frame": { "x": 114, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94-mega_3": { - "frame": { "x": 80, "y": 0, "w": 34, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_1": { - "frame": { "x": 265, "y": 110, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_2": { - "frame": { "x": 124, "y": 109, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "94_3": { - "frame": { "x": 100, "y": 109, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "98_2": { - "frame": { "x": 240, "y": 58, "w": 28, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "98_3": { - "frame": { "x": 300, "y": 56, "w": 28, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99-gigantamax_2": { - "frame": { "x": 328, "y": 53, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99-gigantamax_3": { - "frame": { "x": 31, "y": 56, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99_2": { - "frame": { "x": 300, "y": 78, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "99_3": { - "frame": { "x": 210, "y": 58, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9_2": { - "frame": { "x": 150, "y": 106, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "9_3": { - "frame": { "x": 206, "y": 106, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_1v.png", - "format": "RGBA8888", - "size": { "w": 440, "h": 328 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_1v.png", + "format": "RGBA8888", + "size": { + "w": 600, + "h": 600 + }, + "scale": 1, + "frames": [ + { + "filename": "1_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "1_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "2_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "2_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "3_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "4_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "4_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "5_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "5_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "6-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 0, "w": 40, "h": 30} + }, + { + "filename": "6-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6-mega-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "6_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "7_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "7_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "8_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "8_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 30, "w": 40, "h": 30} + }, + { + "filename": "9_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "9_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "19_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "19_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "20_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "20_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "23_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "23_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "24_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "24_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-beauty-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-beauty-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cool-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cool-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 60, "w": 40, "h": 30} + }, + { + "filename": "25-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-cute-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-cute-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-partner_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-partner_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-smart-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-smart-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-tough-cosplay_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25-tough-cosplay_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "25_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "26_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "26_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 90, "w": 40, "h": 30} + }, + { + "filename": "29_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "29_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "29_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "30_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "30_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "31_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "35_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "35_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "36_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "36_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "37_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "37_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "38_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 120, "w": 40, "h": 30} + }, + { + "filename": "38_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "39_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "39_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "40_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "40_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "41_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "42_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "43_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "43_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "44_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "44_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 150, "w": 40, "h": 30} + }, + { + "filename": "45_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "45_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "46_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "47_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "50_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "50_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "51_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "51_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 180, "w": 40, "h": 30} + }, + { + "filename": "52_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "52_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "52_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "53_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "56_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "57_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "69_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "69_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "70_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 210, "w": 40, "h": 30} + }, + { + "filename": "70_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "71_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "71_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "77_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "77_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "78_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "78_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "79_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "80_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "81_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 240, "w": 40, "h": 30} + }, + { + "filename": "81_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "82_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "82_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "83_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "83_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "84_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 270, "w": 40, "h": 30} + }, + { + "filename": "85_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "85_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "86_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "87_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "92_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "93_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 300, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "94_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "98_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "98_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "99_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "100_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 330, "w": 40, "h": 30} + }, + { + "filename": "100_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "101_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "101_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "102_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "102_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "103_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "103_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "111_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "111_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "112_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "112_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "113_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "114_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 360, "w": 40, "h": 30} + }, + { + "filename": "114_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "116_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "116_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "117_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "117_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "118_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "119_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "120_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "120_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "121_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "121_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 390, "w": 40, "h": 30} + }, + { + "filename": "123_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "123_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "123_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "125_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "126_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "126_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "127_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "128_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "128_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "129_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 420, "w": 40, "h": 30} + }, + { + "filename": "129_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "130_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "131_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "132_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "132_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133-partner_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133-partner_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "133_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 450, "w": 40, "h": 30} + }, + { + "filename": "134_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "134_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "135_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "136_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "137_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "137_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "138_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "138_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "139_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "139_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "140_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 480, "w": 40, "h": 30} + }, + { + "filename": "140_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "141_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "141_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "142_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "144_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "145_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_1", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 510, "w": 40, "h": 30} + }, + { + "filename": "146_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 0, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "147_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 40, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "147_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 80, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "148_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 120, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "148_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 160, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "149_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 200, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "149_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 240, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 280, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 320, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 360, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150-mega-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 400, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 440, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "150_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 480, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "151_2", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 520, "y": 540, "w": 40, "h": 30} + }, + { + "filename": "151_3", + "rotated": false, + "trimmed": false, + "sourceSize": {"w": 40, "h": 30}, + "spriteSourceSize": {"x": 0, "y": 0, "w": 40, "h": 30}, + "frame": {"x": 560, "y": 540, "w": 40, "h": 30} + } + ] + } + ], + "meta": { + "app": "texturepacker", + "version": "3.0" + } } diff --git a/public/images/pokemon_icons_1v.png b/public/images/pokemon_icons_1v.png index 2aa0433b3f6..d6b1bc0cf7e 100644 Binary files a/public/images/pokemon_icons_1v.png and b/public/images/pokemon_icons_1v.png differ diff --git a/public/images/pokemon_icons_2v.json b/public/images/pokemon_icons_2v.json index ac38ebbcf6b..23eec483b42 100644 --- a/public/images/pokemon_icons_2v.json +++ b/public/images/pokemon_icons_2v.json @@ -1,1271 +1,4640 @@ -{ "frames": { - "161_2": { - "frame": { "x": 225, "y": 163, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "161_3": { - "frame": { "x": 82, "y": 162, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "162_2": { - "frame": { "x": 22, "y": 102, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "162_3": { - "frame": { "x": 45, "y": 103, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "163_2": { - "frame": { "x": 0, "y": 184, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "163_3": { - "frame": { "x": 240, "y": 183, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "164_2": { - "frame": { "x": 64, "y": 145, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "164_3": { - "frame": { "x": 186, "y": 145, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_1": { - "frame": { "x": 148, "y": 29, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_2": { - "frame": { "x": 55, "y": 30, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "169_3": { - "frame": { "x": 85, "y": 30, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "173_3": { - "frame": { "x": 64, "y": 223, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_1": { - "frame": { "x": 185, "y": 206, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_2": { - "frame": { "x": 31, "y": 207, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "175_3": { - "frame": { "x": 169, "y": 207, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_1": { - "frame": { "x": 54, "y": 168, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_2": { - "frame": { "x": 37, "y": 166, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "176_3": { - "frame": { "x": 261, "y": 99, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "177_2": { - "frame": { "x": 135, "y": 196, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "177_3": { - "frame": { "x": 152, "y": 196, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "178_2": { - "frame": { "x": 276, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "178_3": { - "frame": { "x": 293, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "179_2": { - "frame": { "x": 226, "y": 143, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "179_3": { - "frame": { "x": 88, "y": 142, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "180_2": { - "frame": { "x": 116, "y": 122, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "180_3": { - "frame": { "x": 239, "y": 121, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181-mega_2": { - "frame": { "x": 262, "y": 0, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181-mega_3": { - "frame": { "x": 291, "y": 0, "w": 29, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 29, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181_2": { - "frame": { "x": 200, "y": 96, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "181_3": { - "frame": { "x": 124, "y": 97, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "182_2": { - "frame": { "x": 97, "y": 184, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "182_3": { - "frame": { "x": 17, "y": 184, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "183_2": { - "frame": { "x": 154, "y": 160, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "183_3": { - "frame": { "x": 131, "y": 156, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "184_2": { - "frame": { "x": 25, "y": 56, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "184_3": { - "frame": { "x": 202, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "185_2": { - "frame": { "x": 22, "y": 123, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "185_3": { - "frame": { "x": 0, "y": 123, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "190_2": { - "frame": { "x": 284, "y": 124, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "190_3": { - "frame": { "x": 260, "y": 124, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "193_2": { - "frame": { "x": 137, "y": 140, "w": 28, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "193_3": { - "frame": { "x": 88, "y": 126, "w": 28, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 12, "w": 28, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_1": { - "frame": { "x": 251, "y": 78, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_2": { - "frame": { "x": 0, "y": 80, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "196_3": { - "frame": { "x": 289, "y": 77, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "197_2": { - "frame": { "x": 289, "y": 143, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "197_3": { - "frame": { "x": 269, "y": 143, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_1": { - "frame": { "x": 220, "y": 97, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_2": { - "frame": { "x": 297, "y": 98, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "199_3": { - "frame": { "x": 278, "y": 98, "w": 19, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 2, "w": 19, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_1": { - "frame": { "x": 69, "y": 204, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_2": { - "frame": { "x": 257, "y": 202, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "200_3": { - "frame": { "x": 211, "y": 203, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-a_2": { - "frame": { "x": 148, "y": 233, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-a_3": { - "frame": { "x": 128, "y": 230, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-b_2": { - "frame": { "x": 13, "y": 225, "w": 12, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-b_3": { - "frame": { "x": 271, "y": 224, "w": 12, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 12, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-c_2": { - "frame": { "x": 85, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-c_3": { - "frame": { "x": 304, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-d_2": { - "frame": { "x": 201, "y": 222, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-d_3": { - "frame": { "x": 215, "y": 222, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-exclamation_2": { - "frame": { "x": 227, "y": 53, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-exclamation_3": { - "frame": { "x": 103, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-e_2": { - "frame": { "x": 257, "y": 221, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-e_3": { - "frame": { "x": 243, "y": 203, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-f_2": { - "frame": { "x": 152, "y": 214, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-f_3": { - "frame": { "x": 212, "y": 77, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-g_2": { - "frame": { "x": 310, "y": 145, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-g_3": { - "frame": { "x": 138, "y": 230, "w": 10, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 7, "w": 10, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-h_2": { - "frame": { "x": 177, "y": 168, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-h_3": { - "frame": { "x": 115, "y": 173, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-i_2": { - "frame": { "x": 113, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-i_3": { - "frame": { "x": 199, "y": 241, "w": 10, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 10, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-j_2": { - "frame": { "x": 62, "y": 239, "w": 11, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-j_3": { - "frame": { "x": 92, "y": 241, "w": 11, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 11, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-k_2": { - "frame": { "x": 229, "y": 222, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-k_3": { - "frame": { "x": 226, "y": 123, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-l_2": { - "frame": { "x": 291, "y": 208, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-l_3": { - "frame": { "x": 0, "y": 223, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-m_2": { - "frame": { "x": 97, "y": 164, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-m_3": { - "frame": { "x": 19, "y": 164, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-n_2": { - "frame": { "x": 211, "y": 189, "w": 22, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-n_3": { - "frame": { "x": 113, "y": 192, "w": 22, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-o_2": { - "frame": { "x": 151, "y": 177, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-o_3": { - "frame": { "x": 133, "y": 173, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-p_2": { - "frame": { "x": 71, "y": 168, "w": 11, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-p_3": { - "frame": { "x": 278, "y": 78, "w": 11, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 8, "w": 11, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-question_2": { - "frame": { "x": 309, "y": 124, "w": 11, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-question_3": { - "frame": { "x": 51, "y": 225, "w": 11, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 7, "w": 11, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-q_2": { - "frame": { "x": 304, "y": 225, "w": 14, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-q_3": { - "frame": { "x": 283, "y": 228, "w": 14, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 14, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-r_2": { - "frame": { "x": 255, "y": 241, "w": 10, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-r_3": { - "frame": { "x": 297, "y": 241, "w": 10, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 16, "y": 10, "w": 10, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-s_2": { - "frame": { "x": 290, "y": 185, "w": 14, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-s_3": { - "frame": { "x": 276, "y": 185, "w": 14, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 14, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-t_2": { - "frame": { "x": 167, "y": 225, "w": 12, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-t_3": { - "frame": { "x": 80, "y": 225, "w": 12, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 12, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-u_2": { - "frame": { "x": 273, "y": 208, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-u_3": { - "frame": { "x": 134, "y": 214, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-v_2": { - "frame": { "x": 100, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-v_3": { - "frame": { "x": 185, "y": 224, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-w_2": { - "frame": { "x": 100, "y": 206, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-w_3": { - "frame": { "x": 117, "y": 206, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-x_2": { - "frame": { "x": 242, "y": 241, "w": 13, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-x_3": { - "frame": { "x": 209, "y": 241, "w": 13, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 13, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-y_2": { - "frame": { "x": 25, "y": 225, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-y_3": { - "frame": { "x": 38, "y": 225, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-z_2": { - "frame": { "x": 310, "y": 166, "w": 10, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "201-z_3": { - "frame": { "x": 185, "y": 187, "w": 10, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 9, "w": 10, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "203_2": { - "frame": { "x": 102, "y": 80, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "203_3": { - "frame": { "x": 51, "y": 80, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "206_2": { - "frame": { "x": 204, "y": 146, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "206_3": { - "frame": { "x": 42, "y": 147, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "207_2": { - "frame": { "x": 227, "y": 73, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "207_3": { - "frame": { "x": 103, "y": 56, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_1": { - "frame": { "x": 234, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_2": { - "frame": { "x": 206, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212-mega_3": { - "frame": { "x": 178, "y": 0, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_1": { - "frame": { "x": 122, "y": 29, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_2": { - "frame": { "x": 292, "y": 26, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "212_3": { - "frame": { "x": 29, "y": 29, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "213_2": { - "frame": { "x": 27, "y": 80, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "213_3": { - "frame": { "x": 78, "y": 77, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "215_2": { - "frame": { "x": 259, "y": 164, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "215_3": { - "frame": { "x": 204, "y": 165, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "216_2": { - "frame": { "x": 304, "y": 185, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "216_3": { - "frame": { "x": 169, "y": 187, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_1": { - "frame": { "x": 95, "y": 103, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_2": { - "frame": { "x": 144, "y": 117, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "217_3": { - "frame": { "x": 165, "y": 117, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "222_2": { - "frame": { "x": 248, "y": 143, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "222_3": { - "frame": { "x": 110, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "226_2": { - "frame": { "x": 182, "y": 77, "w": 30, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "226_3": { - "frame": { "x": 152, "y": 77, "w": 30, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 9, "w": 30, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "227_2": { - "frame": { "x": 127, "y": 74, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "227_3": { - "frame": { "x": 237, "y": 28, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "228_2": { - "frame": { "x": 0, "y": 164, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "228_3": { - "frame": { "x": 240, "y": 163, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229-mega_2": { - "frame": { "x": 266, "y": 51, "w": 23, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229-mega_3": { - "frame": { "x": 55, "y": 53, "w": 23, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 23, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229_2": { - "frame": { "x": 44, "y": 124, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "229_3": { - "frame": { "x": 206, "y": 123, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "230_2": { - "frame": { "x": 68, "y": 121, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "230_3": { - "frame": { "x": 186, "y": 121, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "231_2": { - "frame": { "x": 49, "y": 189, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "231_3": { - "frame": { "x": 71, "y": 188, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "232_2": { - "frame": { "x": 237, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "232_3": { - "frame": { "x": 148, "y": 52, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "233_2": { - "frame": { "x": 257, "y": 185, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "233_3": { - "frame": { "x": 127, "y": 56, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "235_2": { - "frame": { "x": 176, "y": 96, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "235_3": { - "frame": { "x": 152, "y": 96, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_1": { - "frame": { "x": 0, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_2": { - "frame": { "x": 21, "y": 144, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "239_3": { - "frame": { "x": 165, "y": 140, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "240_2": { - "frame": { "x": 33, "y": 187, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "240_3": { - "frame": { "x": 195, "y": 186, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_1": { - "frame": { "x": 239, "y": 99, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_2": { - "frame": { "x": 0, "y": 101, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "242_3": { - "frame": { "x": 73, "y": 99, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "243_2": { - "frame": { "x": 262, "y": 26, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "243_3": { - "frame": { "x": 178, "y": 28, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "244_2": { - "frame": { "x": 289, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "244_3": { - "frame": { "x": 0, "y": 54, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "245_2": { - "frame": { "x": 208, "y": 28, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "245_3": { - "frame": { "x": 0, "y": 29, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "246_2": { - "frame": { "x": 49, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "246_3": { - "frame": { "x": 16, "y": 205, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "247_2": { - "frame": { "x": 0, "y": 204, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "247_3": { - "frame": { "x": 227, "y": 203, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248-mega_2": { - "frame": { "x": 122, "y": 0, "w": 28, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248-mega_3": { - "frame": { "x": 150, "y": 0, "w": 28, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248_2": { - "frame": { "x": 177, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "248_3": { - "frame": { "x": 78, "y": 53, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "249_2": { - "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "249_3": { - "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "250_2": { - "frame": { "x": 93, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "250_3": { - "frame": { "x": 64, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "251_2": { - "frame": { "x": 114, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "251_3": { - "frame": { "x": 242, "y": 223, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_2v.png", - "format": "RGBA8888", - "size": { "w": 320, "h": 261 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_2v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "152_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "152_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "153_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "153_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "154_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "158_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "158_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "159_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "159_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "160_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "160_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "161_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "161_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "162_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "162_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "163_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "163_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "164_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "164_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "167_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "167_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "168_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "168_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "169_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "170_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "170_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "171_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "171_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172-spiky_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172-spiky_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "172_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "173_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "173_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "174_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "174_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "175_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "176_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "177_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "177_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "178_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "178_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "179_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "179_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "180_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "180_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "181_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "182_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "182_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "183_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "183_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "184_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "184_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "185_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "185_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "190_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "190_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "193_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "193_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "194_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "194_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "195_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "195_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "196_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "197_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "197_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "198_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "199_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "200_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-a_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-a_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-b_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-b_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-c_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-c_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-d_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-d_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-e_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-e_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-exclamation_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-exclamation_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-g_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-g_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-h_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-h_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-i_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-i_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-j_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-j_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-k_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-k_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-l_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-l_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-m_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-m_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-n_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-n_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-o_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-o_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-p_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-p_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-q_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-q_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-question_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-question_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-r_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-r_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-s_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-s_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-t_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-t_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-u_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-u_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-v_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-v_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-w_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-w_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-x_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-x_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-y_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-y_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-z_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "201-z_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "203_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "203_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "206_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "206_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "207_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "207_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "211_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "211_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "212_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "213_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "213_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "215_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "215_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "216_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "217_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "222_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "222_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "226_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "226_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "227_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "227_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "228_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "228_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "229_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "230_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "230_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "231_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "231_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "232_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "232_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "233_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "233_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "235_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "235_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "239_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "240_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "240_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "242_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "243_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "243_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "244_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "244_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "245_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "245_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "246_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "246_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "247_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "247_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "248-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "248_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "249_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "249_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "250_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "250_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "251_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "251_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:cb87bf48266ab3d893dbbd24a52f875f:d37e73561b49b4fe831e3fcaee67b851:63b368599cdc6e139499267117e91cd5$" + } } diff --git a/public/images/pokemon_icons_2v.png b/public/images/pokemon_icons_2v.png index 443d14b176d..e74840b647b 100644 Binary files a/public/images/pokemon_icons_2v.png and b/public/images/pokemon_icons_2v.png differ diff --git a/public/images/pokemon_icons_3v.json b/public/images/pokemon_icons_3v.json index 2cd15286a81..2500eebbff8 100644 --- a/public/images/pokemon_icons_3v.json +++ b/public/images/pokemon_icons_3v.json @@ -1,1411 +1,4661 @@ -{ "frames": { - "255_2": { - "frame": { "x": 167, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "255_3": { - "frame": { "x": 367, "y": 186, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "256_2": { - "frame": { "x": 106, "y": 124, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "256_3": { - "frame": { "x": 51, "y": 124, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257-mega_2": { - "frame": { "x": 146, "y": 0, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257-mega_3": { - "frame": { "x": 178, "y": 0, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257_2": { - "frame": { "x": 0, "y": 81, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "257_3": { - "frame": { "x": 150, "y": 78, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "261_2": { - "frame": { "x": 17, "y": 232, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "261_3": { - "frame": { "x": 38, "y": 232, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "262_2": { - "frame": { "x": 48, "y": 149, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "262_3": { - "frame": { "x": 96, "y": 149, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "263_2": { - "frame": { "x": 123, "y": 243, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "263_3": { - "frame": { "x": 252, "y": 243, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "264_2": { - "frame": { "x": 115, "y": 193, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "264_3": { - "frame": { "x": 66, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_1": { - "frame": { "x": 275, "y": 78, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_2": { - "frame": { "x": 151, "y": 232, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "278_3": { - "frame": { "x": 97, "y": 233, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 14, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_1": { - "frame": { "x": 178, "y": 165, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_2": { - "frame": { "x": 144, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "279_3": { - "frame": { "x": 254, "y": 161, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "280_2": { - "frame": { "x": 122, "y": 275, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "280_3": { - "frame": { "x": 108, "y": 275, "w": 14, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 14, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "281_2": { - "frame": { "x": 159, "y": 209, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "281_3": { - "frame": { "x": 177, "y": 210, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282-mega_2": { - "frame": { "x": 227, "y": 99, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282-mega_3": { - "frame": { "x": 352, "y": 0, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282_2": { - "frame": { "x": 201, "y": 98, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "282_3": { - "frame": { "x": 175, "y": 98, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "285_2": { - "frame": { "x": 15, "y": 271, "w": 18, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "285_3": { - "frame": { "x": 307, "y": 269, "w": 18, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 18, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "286_2": { - "frame": { "x": 220, "y": 123, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "286_3": { - "frame": { "x": 0, "y": 107, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_1": { - "frame": { "x": 291, "y": 249, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_2": { - "frame": { "x": 353, "y": 248, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "290_3": { - "frame": { "x": 97, "y": 247, "w": 23, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 14, "w": 23, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_1": { - "frame": { "x": 277, "y": 180, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_2": { - "frame": { "x": 245, "y": 182, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "291_3": { - "frame": { "x": 222, "y": 180, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_1": { - "frame": { "x": 357, "y": 229, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_2": { - "frame": { "x": 77, "y": 231, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "292_3": { - "frame": { "x": 296, "y": 230, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "298_2": { - "frame": { "x": 139, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "298_3": { - "frame": { "x": 277, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_1": { - "frame": { "x": 108, "y": 213, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_2": { - "frame": { "x": 17, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "300_3": { - "frame": { "x": 88, "y": 211, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_1": { - "frame": { "x": 115, "y": 172, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_2": { - "frame": { "x": 0, "y": 178, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "301_3": { - "frame": { "x": 93, "y": 170, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302-mega_2": { - "frame": { "x": 274, "y": 51, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302-mega_3": { - "frame": { "x": 150, "y": 51, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302_2": { - "frame": { "x": 338, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "302_3": { - "frame": { "x": 315, "y": 166, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_1": { - "frame": { "x": 26, "y": 51, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_2": { - "frame": { "x": 56, "y": 51, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303-mega_3": { - "frame": { "x": 342, "y": 50, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_1": { - "frame": { "x": 315, "y": 145, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_2": { - "frame": { "x": 341, "y": 145, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "303_3": { - "frame": { "x": 178, "y": 144, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_1": { - "frame": { "x": 196, "y": 275, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_2": { - "frame": { "x": 180, "y": 275, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "304_3": { - "frame": { "x": 252, "y": 202, "w": 16, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 16, "w": 16, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_1": { - "frame": { "x": 334, "y": 227, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_2": { - "frame": { "x": 128, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "305_3": { - "frame": { "x": 273, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_1": { - "frame": { "x": 62, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_2": { - "frame": { "x": 93, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306-mega_3": { - "frame": { "x": 342, "y": 24, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_1": { - "frame": { "x": 55, "y": 77, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_2": { - "frame": { "x": 338, "y": 76, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "306_3": { - "frame": { "x": 26, "y": 77, "w": 29, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 29, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "307_2": { - "frame": { "x": 215, "y": 241, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "307_3": { - "frame": { "x": 274, "y": 243, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308-mega_2": { - "frame": { "x": 190, "y": 48, "w": 29, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308-mega_3": { - "frame": { "x": 219, "y": 48, "w": 29, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 29, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308_2": { - "frame": { "x": 0, "y": 199, "w": 17, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "308_3": { - "frame": { "x": 235, "y": 202, "w": 17, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 3, "w": 17, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "309_2": { - "frame": { "x": 45, "y": 268, "w": 19, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "309_3": { - "frame": { "x": 253, "y": 99, "w": 19, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 13, "w": 19, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310-mega_2": { - "frame": { "x": 25, "y": 101, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310-mega_3": { - "frame": { "x": 338, "y": 100, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310_2": { - "frame": { "x": 323, "y": 187, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "310_3": { - "frame": { "x": 167, "y": 186, "w": 20, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 20, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_1": { - "frame": { "x": 164, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_2": { - "frame": { "x": 77, "y": 250, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "311_3": { - "frame": { "x": 314, "y": 250, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "312_2": { - "frame": { "x": 196, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "312_3": { - "frame": { "x": 180, "y": 256, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "315_2": { - "frame": { "x": 153, "y": 144, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "315_3": { - "frame": { "x": 290, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "320_2": { - "frame": { "x": 211, "y": 200, "w": 24, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "320_3": { - "frame": { "x": 268, "y": 200, "w": 24, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 10, "w": 24, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "321_2": { - "frame": { "x": 84, "y": 98, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "321_3": { - "frame": { "x": 308, "y": 93, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "327_2": { - "frame": { "x": 364, "y": 100, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "327_3": { - "frame": { "x": 0, "y": 247, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "328_2": { - "frame": { "x": 177, "y": 237, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "328_3": { - "frame": { "x": 196, "y": 237, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "329_2": { - "frame": { "x": 229, "y": 160, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "329_3": { - "frame": { "x": 290, "y": 160, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "330_2": { - "frame": { "x": 51, "y": 101, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "330_3": { - "frame": { "x": 139, "y": 104, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "333_2": { - "frame": { "x": 45, "y": 252, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "333_3": { - "frame": { "x": 120, "y": 259, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334-mega_2": { - "frame": { "x": 280, "y": 114, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334-mega_3": { - "frame": { "x": 253, "y": 114, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334_2": { - "frame": { "x": 73, "y": 168, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "334_3": { - "frame": { "x": 23, "y": 167, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "335_2": { - "frame": { "x": 0, "y": 156, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "335_3": { - "frame": { "x": 121, "y": 150, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "336_2": { - "frame": { "x": 137, "y": 187, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "336_3": { - "frame": { "x": 300, "y": 187, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 8, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "337_2": { - "frame": { "x": 277, "y": 161, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "337_3": { - "frame": { "x": 154, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "338_2": { - "frame": { "x": 43, "y": 170, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "338_3": { - "frame": { "x": 201, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "339_2": { - "frame": { "x": 226, "y": 268, "w": 21, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "339_3": { - "frame": { "x": 64, "y": 269, "w": 21, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "340_2": { - "frame": { "x": 187, "y": 191, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "340_3": { - "frame": { "x": 343, "y": 187, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "341_2": { - "frame": { "x": 252, "y": 218, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "341_3": { - "frame": { "x": 195, "y": 218, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "342_2": { - "frame": { "x": 129, "y": 127, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "342_3": { - "frame": { "x": 243, "y": 137, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_1": { - "frame": { "x": 330, "y": 261, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_2": { - "frame": { "x": 344, "y": 262, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-rainy_3": { - "frame": { "x": 212, "y": 261, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_1": { - "frame": { "x": 216, "y": 218, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_2": { - "frame": { "x": 363, "y": 206, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-snowy_3": { - "frame": { "x": 0, "y": 224, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_1": { - "frame": { "x": 59, "y": 232, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_2": { - "frame": { "x": 316, "y": 230, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351-sunny_3": { - "frame": { "x": 362, "y": 124, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351_2": { - "frame": { "x": 367, "y": 76, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "351_3": { - "frame": { "x": 367, "y": 144, "w": 13, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 13, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_1": { - "frame": { "x": 37, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_2": { - "frame": { "x": 57, "y": 212, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "352_3": { - "frame": { "x": 314, "y": 210, "w": 20, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 20, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "353_2": { - "frame": { "x": 262, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "353_3": { - "frame": { "x": 292, "y": 263, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354-mega_2": { - "frame": { "x": 0, "y": 51, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354-mega_3": { - "frame": { "x": 248, "y": 48, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354_2": { - "frame": { "x": 137, "y": 207, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "354_3": { - "frame": { "x": 292, "y": 207, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "357_2": { - "frame": { "x": 31, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "357_3": { - "frame": { "x": 0, "y": 25, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_1": { - "frame": { "x": 232, "y": 247, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_2": { - "frame": { "x": 15, "y": 250, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "358_3": { - "frame": { "x": 30, "y": 250, "w": 15, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "361_2": { - "frame": { "x": 0, "y": 268, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "361_3": { - "frame": { "x": 358, "y": 262, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362-mega_2": { - "frame": { "x": 0, "y": 132, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362-mega_3": { - "frame": { "x": 267, "y": 137, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362_2": { - "frame": { "x": 233, "y": 227, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "362_3": { - "frame": { "x": 361, "y": 166, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "369_2": { - "frame": { "x": 204, "y": 148, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "369_3": { - "frame": { "x": 23, "y": 146, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "371_2": { - "frame": { "x": 247, "y": 259, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "371_3": { - "frame": { "x": 93, "y": 261, "w": 15, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 15, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "372_2": { - "frame": { "x": 343, "y": 206, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "372_3": { - "frame": { "x": 190, "y": 27, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373-mega_2": { - "frame": { "x": 111, "y": 0, "w": 35, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373-mega_3": { - "frame": { "x": 76, "y": 0, "w": 35, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 2, "y": 3, "w": 35, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373_2": { - "frame": { "x": 86, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "373_3": { - "frame": { "x": 118, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "374_2": { - "frame": { "x": 145, "y": 246, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "374_3": { - "frame": { "x": 334, "y": 244, "w": 19, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "375_2": { - "frame": { "x": 166, "y": 122, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "375_3": { - "frame": { "x": 193, "y": 122, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376-mega_2": { - "frame": { "x": 118, "y": 51, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376-mega_3": { - "frame": { "x": 86, "y": 51, "w": 32, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 5, "w": 32, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376_2": { - "frame": { "x": 178, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "376_3": { - "frame": { "x": 210, "y": 75, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380-mega_2": { - "frame": { "x": 282, "y": 0, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380-mega_3": { - "frame": { "x": 317, "y": 0, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380_2": { - "frame": { "x": 23, "y": 125, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "380_3": { - "frame": { "x": 335, "y": 124, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381-mega_2": { - "frame": { "x": 210, "y": 24, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381-mega_3": { - "frame": { "x": 245, "y": 24, "w": 35, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 35, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381_2": { - "frame": { "x": 78, "y": 121, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "381_3": { - "frame": { "x": 307, "y": 116, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382-primal_2": { - "frame": { "x": 302, "y": 72, "w": 36, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382-primal_3": { - "frame": { "x": 302, "y": 51, "w": 36, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 8, "w": 36, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382_2": { - "frame": { "x": 275, "y": 93, "w": 33, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "382_3": { - "frame": { "x": 242, "y": 78, "w": 33, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 8, "w": 33, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383-primal_2": { - "frame": { "x": 246, "y": 0, "w": 36, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383-primal_3": { - "frame": { "x": 210, "y": 0, "w": 36, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 4, "w": 36, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383_2": { - "frame": { "x": 157, "y": 27, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "383_3": { - "frame": { "x": 124, "y": 27, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 4, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384-mega_2": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384-mega_3": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 3, "w": 38, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384_2": { - "frame": { "x": 311, "y": 24, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "384_3": { - "frame": { "x": 280, "y": 24, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_1": { - "frame": { "x": 22, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_2": { - "frame": { "x": 93, "y": 191, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "385_3": { - "frame": { "x": 44, "y": 192, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_3": { - "frame": { "x": 114, "y": 98, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_3": { - "frame": { "x": 74, "y": 143, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_3v.png", - "format": "RGBA8888", - "size": { "w": 380, "h": 294 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_3v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "255-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "255_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "256_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "257_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "261_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "261_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "262_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "262_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "263_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "263_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "264_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "264_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "276_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "276_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "277_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "277_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "278_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "279_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "280_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "280_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "281_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "281_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "282_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "285_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "285_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "286_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "286_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "290_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "291_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "292_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "298_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "298_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "300_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "301_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "302_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "303_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "304_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "305_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "306_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "307_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "307_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "308_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "309_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "309_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "310-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "310_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "311_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "312_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "312_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "315_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "315_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "320_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "320_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "321_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "321_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "327_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "327_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "328_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "328_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "329_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "329_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "330_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "330_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "333_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "333_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "334-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "334-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "334_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "334_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "335_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "335_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "336_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "336_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "337_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "337_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "338_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "338_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "339_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "339_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "340_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "340_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "341_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "341_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "342_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "342_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-rainy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-snowy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351-sunny_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "351_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "352_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "353_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "353_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "354_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "357_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "357_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "358_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "359_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "361_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "361_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "362_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "362_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "369_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "369_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "370_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "370_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "371_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "371_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "372_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "372_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "373_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "374_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "374_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "375_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "375_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "376_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "377_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "377_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "378_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "379_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "379_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "380_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "381_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382-primal_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382-primal_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "382_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "382_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383-primal_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383-primal_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "383_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "384_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "385_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:673055e796ec5f9913fd1dd04284765c:1804ddee68059c3372bf99289c91dd89:039b026190bf1878996b3e03190bcdf3$" + } } diff --git a/public/images/pokemon_icons_3v.png b/public/images/pokemon_icons_3v.png index 51a1707ea35..6b699b3bfa9 100644 Binary files a/public/images/pokemon_icons_3v.png and b/public/images/pokemon_icons_3v.png differ diff --git a/public/images/pokemon_icons_4v.json b/public/images/pokemon_icons_4v.json index 9113fe89dc8..2f171915e01 100644 --- a/public/images/pokemon_icons_4v.json +++ b/public/images/pokemon_icons_4v.json @@ -1,1390 +1,4409 @@ -{ "frames": { - "387_2": { - "frame": { "x": 39, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "387_3": { - "frame": { "x": 148, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "388_2": { - "frame": { "x": 261, "y": 187, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "388_3": { - "frame": { "x": 64, "y": 190, "w": 22, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "389_2": { - "frame": { "x": 272, "y": 47, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "389_3": { - "frame": { "x": 244, "y": 47, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "393_2": { - "frame": { "x": 69, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "393_3": { - "frame": { "x": 285, "y": 275, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "394_2": { - "frame": { "x": 321, "y": 232, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "394_3": { - "frame": { "x": 0, "y": 244, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "395_2": { - "frame": { "x": 340, "y": 95, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "395_3": { - "frame": { "x": 24, "y": 98, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "399_2": { - "frame": { "x": 24, "y": 123, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "399_3": { - "frame": { "x": 108, "y": 267, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "400_2": { - "frame": { "x": 217, "y": 180, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "400_3": { - "frame": { "x": 239, "y": 180, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "401_2": { - "frame": { "x": 279, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "401_3": { - "frame": { "x": 201, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "402_2": { - "frame": { "x": 97, "y": 186, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "402_3": { - "frame": { "x": 289, "y": 182, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "406_2": { - "frame": { "x": 298, "y": 275, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "406_3": { - "frame": { "x": 184, "y": 225, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "407_2": { - "frame": { "x": 177, "y": 203, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "407_3": { - "frame": { "x": 86, "y": 210, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_1": { - "frame": { "x": 338, "y": 232, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_2": { - "frame": { "x": 184, "y": 243, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-plant_3": { - "frame": { "x": 99, "y": 242, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_1": { - "frame": { "x": 164, "y": 247, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_2": { - "frame": { "x": 76, "y": 252, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-sandy_3": { - "frame": { "x": 296, "y": 252, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_1": { - "frame": { "x": 218, "y": 245, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_2": { - "frame": { "x": 132, "y": 244, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "412-trash_3": { - "frame": { "x": 116, "y": 244, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_1": { - "frame": { "x": 333, "y": 168, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_2": { - "frame": { "x": 311, "y": 168, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-plant_3": { - "frame": { "x": 75, "y": 167, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_1": { - "frame": { "x": 0, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_2": { - "frame": { "x": 292, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-sandy_3": { - "frame": { "x": 316, "y": 117, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_1": { - "frame": { "x": 125, "y": 157, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_2": { - "frame": { "x": 319, "y": 145, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "413-trash_3": { - "frame": { "x": 266, "y": 142, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "414_2": { - "frame": { "x": 120, "y": 180, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "414_3": { - "frame": { "x": 145, "y": 180, "w": 25, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "418_2": { - "frame": { "x": 127, "y": 224, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "418_3": { - "frame": { "x": 0, "y": 224, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "419_2": { - "frame": { "x": 221, "y": 159, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "419_3": { - "frame": { "x": 50, "y": 158, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_1": { - "frame": { "x": 197, "y": 203, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_2": { - "frame": { "x": 302, "y": 232, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-east_3": { - "frame": { "x": 80, "y": 232, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_1": { - "frame": { "x": 36, "y": 265, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_2": { - "frame": { "x": 91, "y": 264, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "422-west_3": { - "frame": { "x": 253, "y": 264, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_1": { - "frame": { "x": 148, "y": 157, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_2": { - "frame": { "x": 266, "y": 165, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-east_3": { - "frame": { "x": 41, "y": 179, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_1": { - "frame": { "x": 97, "y": 164, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_2": { - "frame": { "x": 194, "y": 160, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "423-west_3": { - "frame": { "x": 171, "y": 160, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "424_2": { - "frame": { "x": 303, "y": 0, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "424_3": { - "frame": { "x": 274, "y": 0, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "425_2": { - "frame": { "x": 270, "y": 265, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "425_3": { - "frame": { "x": 234, "y": 265, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "426_2": { - "frame": { "x": 110, "y": 96, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "426_3": { - "frame": { "x": 268, "y": 96, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "427_2": { - "frame": { "x": 21, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "427_3": { - "frame": { "x": 166, "y": 225, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428-mega_2": { - "frame": { "x": 95, "y": 0, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428-mega_3": { - "frame": { "x": 62, "y": 0, "w": 33, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 5, "w": 33, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428_2": { - "frame": { "x": 47, "y": 117, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "428_3": { - "frame": { "x": 73, "y": 117, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_1": { - "frame": { "x": 247, "y": 138, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_2": { - "frame": { "x": 0, "y": 140, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "429_3": { - "frame": { "x": 78, "y": 139, "w": 19, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 19, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_1": { - "frame": { "x": 328, "y": 213, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_2": { - "frame": { "x": 305, "y": 213, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "433_3": { - "frame": { "x": 61, "y": 211, "w": 23, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 23, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "436_2": { - "frame": { "x": 0, "y": 284, "w": 13, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "436_3": { - "frame": { "x": 108, "y": 283, "w": 13, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 13, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "437_2": { - "frame": { "x": 239, "y": 117, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "437_3": { - "frame": { "x": 212, "y": 117, "w": 27, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "438_2": { - "frame": { "x": 351, "y": 211, "w": 12, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "438_3": { - "frame": { "x": 351, "y": 191, "w": 12, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 12, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_1": { - "frame": { "x": 163, "y": 270, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_2": { - "frame": { "x": 343, "y": 271, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "440_3": { - "frame": { "x": 329, "y": 271, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "441_2": { - "frame": { "x": 157, "y": 203, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "441_3": { - "frame": { "x": 237, "y": 202, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "442_2": { - "frame": { "x": 106, "y": 222, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "442_3": { - "frame": { "x": 197, "y": 223, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_1": { - "frame": { "x": 256, "y": 245, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_2": { - "frame": { "x": 17, "y": 247, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "443_3": { - "frame": { "x": 234, "y": 246, "w": 19, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 19, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_1": { - "frame": { "x": 170, "y": 182, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_2": { - "frame": { "x": 0, "y": 183, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "444_3": { - "frame": { "x": 193, "y": 182, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_1": { - "frame": { "x": 214, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_2": { - "frame": { "x": 184, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445-mega_3": { - "frame": { "x": 244, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_1": { - "frame": { "x": 207, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_2": { - "frame": { "x": 87, "y": 49, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "445_3": { - "frame": { "x": 331, "y": 49, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_1": { - "frame": { "x": 23, "y": 183, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_2": { - "frame": { "x": 0, "y": 266, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "447_3": { - "frame": { "x": 18, "y": 266, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_1": { - "frame": { "x": 138, "y": 200, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_2": { - "frame": { "x": 42, "y": 201, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448-mega_3": { - "frame": { "x": 23, "y": 201, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_1": { - "frame": { "x": 195, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_2": { - "frame": { "x": 179, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "448_3": { - "frame": { "x": 53, "y": 265, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "453_2": { - "frame": { "x": 128, "y": 267, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "453_3": { - "frame": { "x": 211, "y": 268, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "454_2": { - "frame": { "x": 330, "y": 191, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "454_3": { - "frame": { "x": 342, "y": 145, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "456_2": { - "frame": { "x": 56, "y": 247, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "456_3": { - "frame": { "x": 36, "y": 247, "w": 20, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 20, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "457_2": { - "frame": { "x": 19, "y": 160, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "457_3": { - "frame": { "x": 289, "y": 159, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "458_2": { - "frame": { "x": 311, "y": 254, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "458_3": { - "frame": { "x": 331, "y": 254, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "461_2": { - "frame": { "x": 218, "y": 223, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "461_3": { - "frame": { "x": 237, "y": 224, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "462_2": { - "frame": { "x": 58, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "462_3": { - "frame": { "x": 329, "y": 71, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "464_2": { - "frame": { "x": 83, "y": 95, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "464_3": { - "frame": { "x": 313, "y": 95, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "465_2": { - "frame": { "x": 145, "y": 53, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "465_3": { - "frame": { "x": 300, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_1": { - "frame": { "x": 216, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_2": { - "frame": { "x": 242, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "466_3": { - "frame": { "x": 57, "y": 94, "w": 26, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "467_2": { - "frame": { "x": 171, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "467_3": { - "frame": { "x": 121, "y": 120, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_1": { - "frame": { "x": 97, "y": 145, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_2": { - "frame": { "x": 291, "y": 140, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "468_3": { - "frame": { "x": 50, "y": 139, "w": 28, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 28, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "469_2": { - "frame": { "x": 204, "y": 70, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "469_3": { - "frame": { "x": 174, "y": 70, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_1": { - "frame": { "x": 266, "y": 120, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_2": { - "frame": { "x": 146, "y": 135, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "470_3": { - "frame": { "x": 196, "y": 138, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_1": { - "frame": { "x": 110, "y": 73, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_2": { - "frame": { "x": 286, "y": 73, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "471_3": { - "frame": { "x": 137, "y": 75, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "472_2": { - "frame": { "x": 275, "y": 25, "w": 31, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "472_3": { - "frame": { "x": 244, "y": 25, "w": 31, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 6, "w": 31, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "474_2": { - "frame": { "x": 292, "y": 96, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "474_3": { - "frame": { "x": 216, "y": 202, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_2": { - "frame": { "x": 120, "y": 47, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475-mega_3": { - "frame": { "x": 33, "y": 28, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_2": { - "frame": { "x": 99, "y": 120, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "475_3": { - "frame": { "x": 340, "y": 120, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "478_2": { - "frame": { "x": 148, "y": 247, "w": 16, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "478_3": { - "frame": { "x": 313, "y": 73, "w": 16, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 16, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-fan_2": { - "frame": { "x": 221, "y": 138, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-fan_3": { - "frame": { "x": 24, "y": 139, "w": 26, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 26, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-frost_2": { - "frame": { "x": 214, "y": 25, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-frost_3": { - "frame": { "x": 184, "y": 25, "w": 30, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 30, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-heat_2": { - "frame": { "x": 58, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-heat_3": { - "frame": { "x": 0, "y": 70, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-mow_2": { - "frame": { "x": 192, "y": 91, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-mow_3": { - "frame": { "x": 0, "y": 92, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-wash_2": { - "frame": { "x": 164, "y": 91, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479-wash_3": { - "frame": { "x": 29, "y": 76, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479_2": { - "frame": { "x": 156, "y": 0, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "479_3": { - "frame": { "x": 128, "y": 0, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_1": { - "frame": { "x": 186, "y": 116, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_2": { - "frame": { "x": 160, "y": 113, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "480_3": { - "frame": { "x": 134, "y": 98, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_1": { - "frame": { "x": 178, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_2": { - "frame": { "x": 0, "y": 48, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "481_3": { - "frame": { "x": 29, "y": 54, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_1": { - "frame": { "x": 84, "y": 71, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_2": { - "frame": { "x": 260, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "482_3": { - "frame": { "x": 234, "y": 70, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "485_2": { - "frame": { "x": 0, "y": 28, "w": 33, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "485_3": { - "frame": { "x": 120, "y": 27, "w": 33, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 33, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-altered_2": { - "frame": { "x": 332, "y": 0, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-altered_3": { - "frame": { "x": 62, "y": 24, "w": 30, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 4, "w": 30, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-origin_2": { - "frame": { "x": 92, "y": 24, "w": 28, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "487-origin_3": { - "frame": { "x": 332, "y": 24, "w": 28, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 28, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "488_2": { - "frame": { "x": 153, "y": 27, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "488_3": { - "frame": { "x": 306, "y": 25, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_1": { - "frame": { "x": 57, "y": 230, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_2": { - "frame": { "x": 279, "y": 226, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "489_3": { - "frame": { "x": 256, "y": 228, "w": 23, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 11, "w": 23, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_1": { - "frame": { "x": 257, "y": 208, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_2": { - "frame": { "x": 283, "y": 206, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "490_3": { - "frame": { "x": 0, "y": 204, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "491_2": { - "frame": { "x": 0, "y": 0, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "491_3": { - "frame": { "x": 31, "y": 0, "w": 31, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 31, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-land_2": { - "frame": { "x": 145, "y": 269, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-land_3": { - "frame": { "x": 311, "y": 271, "w": 18, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 18, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-sky_2": { - "frame": { "x": 117, "y": 200, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "492-sky_3": { - "frame": { "x": 309, "y": 191, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_4v.png", - "format": "RGBA8888", - "size": { "w": 363, "h": 300 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_4v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "387_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "387_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "388_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "388_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "389_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "389_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "390_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "390_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "391_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "391_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "392_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "392_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "393_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "393_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "394_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "394_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "395_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "395_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "399_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "399_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "400_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "400_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "401_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "401_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "402_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "402_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "406_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "406_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "407_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "407_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-plant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-sandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "412-trash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-plant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-sandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "413-trash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "414_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "414_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "418_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "418_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "419_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "419_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-east_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "422-west_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-east_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "423-west_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "424_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "424_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "425_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "425_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "426_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "426_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "427_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "427_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "428_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "429_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "430_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "430_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "433_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "436_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "436_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "437_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "437_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "438_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "438_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "440_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "441_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "441_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "442_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "442_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "443_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "444_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "445_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "447_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "448_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "453_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "453_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "454_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "454_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "455_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "455_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "456_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "456_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "457_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "457_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "458_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "458_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "461_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "461_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "462_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "462_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "464_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "464_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "465_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "465_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "466_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "467_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "467_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "468_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "469_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "469_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "470_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "471_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "472_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "472_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "474_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "474_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "475_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "478_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "478_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-fan_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-fan_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-frost_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-frost_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-heat_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-heat_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-mow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-mow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-wash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479-wash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "479_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "480_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "481_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "482_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "485_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "485_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "486_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "486_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-altered_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-altered_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-origin_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "487-origin_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "488_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "488_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "489_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "490_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "491_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "491_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-land_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-land_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-sky_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "492-sky_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:2288ca6bd49f36a5ca5b49f1bcaab17a:e83f40529aad7883718910695eafd075:ebc3f8ec5b2480b298192d752b6e57dc$" + } } diff --git a/public/images/pokemon_icons_4v.png b/public/images/pokemon_icons_4v.png index 4dbf5cc6918..7cfab80312a 100644 Binary files a/public/images/pokemon_icons_4v.png and b/public/images/pokemon_icons_4v.png differ diff --git a/public/images/pokemon_icons_5v.json b/public/images/pokemon_icons_5v.json index ef3ce80e8ef..7da5a765c0c 100644 --- a/public/images/pokemon_icons_5v.json +++ b/public/images/pokemon_icons_5v.json @@ -1,1341 +1,4640 @@ -{ "frames": { - "494_2": { - "frame": { "x": 251, "y": 190, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "494_3": { - "frame": { "x": 212, "y": 186, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "495_2": { - "frame": { "x": 192, "y": 225, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "495_3": { - "frame": { "x": 103, "y": 224, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "496_2": { - "frame": { "x": 138, "y": 180, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "496_3": { - "frame": { "x": 95, "y": 183, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "497_2": { - "frame": { "x": 28, "y": 94, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "497_3": { - "frame": { "x": 242, "y": 74, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "517_2": { - "frame": { "x": 92, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "517_3": { - "frame": { "x": 62, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "518_2": { - "frame": { "x": 288, "y": 149, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "518_3": { - "frame": { "x": 0, "y": 164, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "524_2": { - "frame": { "x": 88, "y": 140, "w": 11, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "524_3": { - "frame": { "x": 99, "y": 118, "w": 11, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 15, "y": 11, "w": 11, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "525_2": { - "frame": { "x": 47, "y": 164, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "525_3": { - "frame": { "x": 23, "y": 164, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "526_2": { - "frame": { "x": 95, "y": 26, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "526_3": { - "frame": { "x": 157, "y": 26, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "529_2": { - "frame": { "x": 202, "y": 208, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "529_3": { - "frame": { "x": 269, "y": 209, "w": 21, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 11, "w": 21, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "530_2": { - "frame": { "x": 183, "y": 71, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "530_3": { - "frame": { "x": 0, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531-mega_2": { - "frame": { "x": 292, "y": 97, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531-mega_3": { - "frame": { "x": 270, "y": 74, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531_2": { - "frame": { "x": 311, "y": 169, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "531_3": { - "frame": { "x": 263, "y": 168, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "532_2": { - "frame": { "x": 71, "y": 179, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "532_3": { - "frame": { "x": 60, "y": 75, "w": 24, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 9, "w": 24, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "533_2": { - "frame": { "x": 242, "y": 50, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "533_3": { - "frame": { "x": 269, "y": 50, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "534_2": { - "frame": { "x": 249, "y": 0, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "534_3": { - "frame": { "x": 218, "y": 0, "w": 31, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 5, "w": 31, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "538_2": { - "frame": { "x": 166, "y": 115, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "538_3": { - "frame": { "x": 0, "y": 116, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "539_2": { - "frame": { "x": 169, "y": 165, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "539_3": { - "frame": { "x": 208, "y": 164, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "540_2": { - "frame": { "x": 16, "y": 248, "w": 15, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "540_3": { - "frame": { "x": 297, "y": 245, "w": 15, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 15, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "541_2": { - "frame": { "x": 288, "y": 229, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "541_3": { - "frame": { "x": 57, "y": 230, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "542_2": { - "frame": { "x": 195, "y": 242, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "542_3": { - "frame": { "x": 181, "y": 242, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "543_2": { - "frame": { "x": 312, "y": 249, "w": 18, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "543_3": { - "frame": { "x": 241, "y": 249, "w": 18, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 18, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "544_2": { - "frame": { "x": 223, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "544_3": { - "frame": { "x": 245, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "545_2": { - "frame": { "x": 154, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "545_3": { - "frame": { "x": 115, "y": 71, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "546_2": { - "frame": { "x": 160, "y": 242, "w": 21, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "546_3": { - "frame": { "x": 139, "y": 242, "w": 21, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 21, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "547_2": { - "frame": { "x": 230, "y": 171, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "547_3": { - "frame": { "x": 285, "y": 171, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_1": { - "frame": { "x": 251, "y": 171, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_2": { - "frame": { "x": 340, "y": 97, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "548_3": { - "frame": { "x": 228, "y": 97, "w": 12, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 12, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "549_2": { - "frame": { "x": 191, "y": 165, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "549_3": { - "frame": { "x": 335, "y": 119, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "551_2": { - "frame": { "x": 324, "y": 211, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "551_3": { - "frame": { "x": 62, "y": 214, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 13, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "552_2": { - "frame": { "x": 88, "y": 158, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "552_3": { - "frame": { "x": 144, "y": 159, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "553_2": { - "frame": { "x": 324, "y": 50, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "553_3": { - "frame": { "x": 296, "y": 50, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "556_2": { - "frame": { "x": 99, "y": 135, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "556_3": { - "frame": { "x": 253, "y": 124, "w": 23, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 23, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_1": { - "frame": { "x": 166, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_2": { - "frame": { "x": 136, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "559_3": { - "frame": { "x": 151, "y": 256, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_1": { - "frame": { "x": 144, "y": 138, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_2": { - "frame": { "x": 117, "y": 183, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "560_3": { - "frame": { "x": 23, "y": 185, "w": 20, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 20, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "562_2": { - "frame": { "x": 127, "y": 220, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "562_3": { - "frame": { "x": 290, "y": 213, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "563_2": { - "frame": { "x": 218, "y": 25, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "563_3": { - "frame": { "x": 307, "y": 0, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 3, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "568_2": { - "frame": { "x": 181, "y": 205, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "568_3": { - "frame": { "x": 0, "y": 205, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569-gigantamax_2": { - "frame": { "x": 32, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569-gigantamax_3": { - "frame": { "x": 0, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569_2": { - "frame": { "x": 277, "y": 28, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "569_3": { - "frame": { "x": 0, "y": 29, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "570_2": { - "frame": { "x": 209, "y": 247, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "570_3": { - "frame": { "x": 225, "y": 247, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "571_2": { - "frame": { "x": 86, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "571_3": { - "frame": { "x": 29, "y": 51, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "572_2": { - "frame": { "x": 43, "y": 185, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "572_3": { - "frame": { "x": 0, "y": 186, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_1": { - "frame": { "x": 47, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_2": { - "frame": { "x": 71, "y": 164, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "577_3": { - "frame": { "x": 77, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_1": { - "frame": { "x": 0, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_2": { - "frame": { "x": 93, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "578_3": { - "frame": { "x": 77, "y": 241, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_1": { - "frame": { "x": 0, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_2": { - "frame": { "x": 30, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "579_3": { - "frame": { "x": 144, "y": 73, "w": 30, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-autumn_1": { - "frame": { "x": 333, "y": 145, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-spring_1": { - "frame": { "x": 333, "y": 167, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-summer_1": { - "frame": { "x": 333, "y": 189, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "585-winter_1": { - "frame": { "x": 306, "y": 191, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-autumn_1": { - "frame": { "x": 86, "y": 73, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-spring_1": { - "frame": { "x": 51, "y": 116, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-summer_1": { - "frame": { "x": 28, "y": 116, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "586-winter_1": { - "frame": { "x": 267, "y": 100, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_1": { - "frame": { "x": 89, "y": 203, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_2": { - "frame": { "x": 43, "y": 204, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592-f_3": { - "frame": { "x": 108, "y": 204, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592_2": { - "frame": { "x": 137, "y": 200, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "592_3": { - "frame": { "x": 230, "y": 193, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_1": { - "frame": { "x": 56, "y": 94, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_2": { - "frame": { "x": 139, "y": 94, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593-f_3": { - "frame": { "x": 240, "y": 96, "w": 27, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 27, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593_2": { - "frame": { "x": 0, "y": 94, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "593_3": { - "frame": { "x": 212, "y": 75, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "594_2": { - "frame": { "x": 264, "y": 242, "w": 13, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "594_3": { - "frame": { "x": 34, "y": 243, "w": 13, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 13, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "595_2": { - "frame": { "x": 149, "y": 226, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "595_3": { - "frame": { "x": 267, "y": 226, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "596_2": { - "frame": { "x": 174, "y": 93, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "596_3": { - "frame": { "x": 111, "y": 93, "w": 28, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "602_2": { - "frame": { "x": 107, "y": 262, "w": 14, "h": 11 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "602_3": { - "frame": { "x": 290, "y": 262, "w": 14, "h": 11 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 17, "w": 14, "h": 11 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "603_2": { - "frame": { "x": 191, "y": 186, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "603_3": { - "frame": { "x": 160, "y": 187, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "604_2": { - "frame": { "x": 186, "y": 49, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "604_3": { - "frame": { "x": 124, "y": 49, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 7, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_1": { - "frame": { "x": 123, "y": 256, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_2": { - "frame": { "x": 330, "y": 249, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "605_3": { - "frame": { "x": 293, "y": 193, "w": 13, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 13, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_1": { - "frame": { "x": 19, "y": 226, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_2": { - "frame": { "x": 312, "y": 227, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "606_3": { - "frame": { "x": 327, "y": 227, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "607_2": { - "frame": { "x": 0, "y": 260, "w": 13, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "607_3": { - "frame": { "x": 277, "y": 259, "w": 13, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 10, "w": 13, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "608_2": { - "frame": { "x": 0, "y": 223, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "608_3": { - "frame": { "x": 84, "y": 223, "w": 19, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 19, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "609_2": { - "frame": { "x": 64, "y": 27, "w": 29, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "609_3": { - "frame": { "x": 186, "y": 26, "w": 29, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 29, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "610_2": { - "frame": { "x": 21, "y": 206, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "610_3": { - "frame": { "x": 156, "y": 206, "w": 18, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 18, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "611_2": { - "frame": { "x": 113, "y": 162, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "611_3": { - "frame": { "x": 263, "y": 147, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "612_2": { - "frame": { "x": 322, "y": 73, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "612_3": { - "frame": { "x": 296, "y": 73, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "618_2": { - "frame": { "x": 277, "y": 245, "w": 20, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "618_3": { - "frame": { "x": 47, "y": 246, "w": 20, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 14, "w": 20, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "619_2": { - "frame": { "x": 39, "y": 224, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "619_3": { - "frame": { "x": 174, "y": 223, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "620_2": { - "frame": { "x": 228, "y": 118, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "620_3": { - "frame": { "x": 74, "y": 118, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "622_2": { - "frame": { "x": 212, "y": 229, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "622_3": { - "frame": { "x": 230, "y": 229, "w": 18, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 18, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "623_2": { - "frame": { "x": 60, "y": 50, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "623_3": { - "frame": { "x": 216, "y": 50, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "631_2": { - "frame": { "x": 83, "y": 98, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "631_3": { - "frame": { "x": 111, "y": 115, "w": 28, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 8, "w": 28, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "632_2": { - "frame": { "x": 65, "y": 198, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "632_3": { - "frame": { "x": 269, "y": 193, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "633_2": { - "frame": { "x": 248, "y": 229, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "633_3": { - "frame": { "x": 123, "y": 236, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "634_2": { - "frame": { "x": 202, "y": 97, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "634_3": { - "frame": { "x": 314, "y": 97, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "635_2": { - "frame": { "x": 307, "y": 25, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "635_3": { - "frame": { "x": 248, "y": 25, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "640_2": { - "frame": { "x": 290, "y": 123, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "640_3": { - "frame": { "x": 314, "y": 119, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "641-incarnate_1": { - "frame": { "x": 188, "y": 0, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "641-therian_1": { - "frame": { "x": 127, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "642-incarnate_1": { - "frame": { "x": 64, "y": 0, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "642-therian_1": { - "frame": { "x": 95, "y": 0, "w": 32, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 3, "w": 32, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "645-incarnate_1": { - "frame": { "x": 157, "y": 0, "w": 31, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 2, "w": 31, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "645-therian_1": { - "frame": { "x": 280, "y": 0, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-ordinary_2": { - "frame": { "x": 194, "y": 119, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-ordinary_3": { - "frame": { "x": 139, "y": 116, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-resolute_2": { - "frame": { "x": 124, "y": 27, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "647-resolute_3": { - "frame": { "x": 30, "y": 29, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-aria_2": { - "frame": { "x": 109, "y": 241, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-aria_3": { - "frame": { "x": 276, "y": 124, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-pirouette_2": { - "frame": { "x": 337, "y": 23, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "648-pirouette_3": { - "frame": { "x": 337, "y": 0, "w": 15, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 15, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-burn_2": { - "frame": { "x": 22, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-burn_3": { - "frame": { "x": 122, "y": 138, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-chill_2": { - "frame": { "x": 0, "y": 136, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-chill_3": { - "frame": { "x": 164, "y": 135, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-douse_2": { - "frame": { "x": 241, "y": 147, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-douse_3": { - "frame": { "x": 311, "y": 145, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-shock_2": { - "frame": { "x": 186, "y": 141, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649-shock_3": { - "frame": { "x": 219, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649_2": { - "frame": { "x": 66, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "649_3": { - "frame": { "x": 44, "y": 140, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_5v.png", - "format": "RGBA8888", - "size": { "w": 352, "h": 278 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_5v.png", + "format": "RGBA8888", + "size": { + "w": 520, + "h": 520 + }, + "scale": 1, + "frames": [ + { + "filename": "494_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "494_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "495_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "495_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "496_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "496_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "497_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "497_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "501_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "501_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "502_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "502_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "503_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "503_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "517_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "517_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "518_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "518_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "524_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "524_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "525_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "525_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "526_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "526_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "527_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "527_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "528_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "528_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "529_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "529_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "530_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "530_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531-mega_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531-mega_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "531_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "532_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "532_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "533_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "533_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "534_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "534_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "538_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "538_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "539_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "539_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "540_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "540_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "541_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "541_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "542_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "542_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "543_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "543_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "544_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "544_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "545_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "545_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "546_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "546_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "547_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "547_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "548_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "549_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "549_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "551_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "551_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "552_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "552_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "553_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "553_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "556_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "556_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "559_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "560_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "562_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "562_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "563_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "563_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "568_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "568_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "569_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "570_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "570_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "571_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "571_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "572_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "572_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "577_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "578_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "579_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-autumn_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-spring_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-summer_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "585-winter_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-autumn_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-spring_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-summer_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "586-winter_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "587_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "587_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "588_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "588_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "589_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "589_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "590_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "590_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "591_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "591_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "592_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593-f_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "593_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "594_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "594_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "595_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "595_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "596_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "596_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "602_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "602_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "603_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "603_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "604_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "604_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "605_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "606_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "607_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "607_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "608_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "608_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "609_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "609_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "610_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "610_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "611_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "611_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "612_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "612_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "616_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "616_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "617_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "617_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "618_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "618_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "619_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "619_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "620_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "620_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "621_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "621_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "622_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "622_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "623_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "623_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "631_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "631_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "632_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "632_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "633_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "633_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "634_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "634_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "635_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "635_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "636_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "636_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "637_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "637_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "640_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "640_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "641-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "641-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "642-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "642-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "645-incarnate_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "645-therian_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-ordinary_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-ordinary_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-resolute_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "647-resolute_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-aria_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-aria_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 480, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-pirouette_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "648-pirouette_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-burn_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-burn_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-chill_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-chill_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-douse_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-douse_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-shock_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649-shock_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "649_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:b615ea9a62bec26b97d0171030d11a55:35fd8571f91311ef2e9944578f979466:f1931bc28ee7f32dba7543723757cf2a$" + } } diff --git a/public/images/pokemon_icons_5v.png b/public/images/pokemon_icons_5v.png index 917e0621263..9dd1b278ac1 100644 Binary files a/public/images/pokemon_icons_5v.png and b/public/images/pokemon_icons_5v.png differ diff --git a/public/images/pokemon_icons_6v.json b/public/images/pokemon_icons_6v.json index 600624ca730..8061ed9152b 100644 --- a/public/images/pokemon_icons_6v.json +++ b/public/images/pokemon_icons_6v.json @@ -1,1026 +1,3905 @@ -{ "frames": { - "2670_2": { - "frame": { "x": 119, "y": 159, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2670_3": { - "frame": { "x": 175, "y": 157, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "653_2": { - "frame": { "x": 142, "y": 204, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "653_3": { - "frame": { "x": 304, "y": 210, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "654_2": { - "frame": { "x": 322, "y": 22, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "654_3": { - "frame": { "x": 322, "y": 0, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "655_2": { - "frame": { "x": 287, "y": 145, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "655_3": { - "frame": { "x": 260, "y": 145, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "664_2": { - "frame": { "x": 38, "y": 214, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "664_3": { - "frame": { "x": 159, "y": 204, "w": 14, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 14, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "665_2": { - "frame": { "x": 173, "y": 217, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "665_3": { - "frame": { "x": 52, "y": 218, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-archipelago_2": { - "frame": { "x": 78, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-archipelago_3": { - "frame": { "x": 130, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-continental_2": { - "frame": { "x": 156, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-continental_3": { - "frame": { "x": 182, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-elegant_2": { - "frame": { "x": 260, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-elegant_3": { - "frame": { "x": 286, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-fancy_2": { - "frame": { "x": 52, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-fancy_3": { - "frame": { "x": 208, "y": 126, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-garden_2": { - "frame": { "x": 156, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-garden_3": { - "frame": { "x": 234, "y": 126, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-high-plains_2": { - "frame": { "x": 0, "y": 130, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-high-plains_3": { - "frame": { "x": 26, "y": 130, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-icy-snow_2": { - "frame": { "x": 0, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-icy-snow_3": { - "frame": { "x": 26, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-jungle_2": { - "frame": { "x": 52, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-jungle_3": { - "frame": { "x": 78, "y": 55, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-marine_2": { - "frame": { "x": 104, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-marine_3": { - "frame": { "x": 130, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-meadow_2": { - "frame": { "x": 156, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-meadow_3": { - "frame": { "x": 182, "y": 57, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-modern_2": { - "frame": { "x": 268, "y": 70, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-modern_3": { - "frame": { "x": 294, "y": 70, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-monsoon_2": { - "frame": { "x": 208, "y": 76, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-monsoon_3": { - "frame": { "x": 234, "y": 76, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-ocean_2": { - "frame": { "x": 312, "y": 120, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-ocean_3": { - "frame": { "x": 0, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-poke-ball_2": { - "frame": { "x": 26, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-poke-ball_3": { - "frame": { "x": 52, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-polar_2": { - "frame": { "x": 78, "y": 80, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-polar_3": { - "frame": { "x": 104, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-river_2": { - "frame": { "x": 130, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-river_3": { - "frame": { "x": 104, "y": 107, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sandstorm_2": { - "frame": { "x": 182, "y": 82, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sandstorm_3": { - "frame": { "x": 260, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-savanna_2": { - "frame": { "x": 286, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-savanna_3": { - "frame": { "x": 312, "y": 95, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sun_2": { - "frame": { "x": 208, "y": 101, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-sun_3": { - "frame": { "x": 234, "y": 101, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-tundra_2": { - "frame": { "x": 0, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "666-tundra_3": { - "frame": { "x": 26, "y": 105, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-blue_2": { - "frame": { "x": 0, "y": 220, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-blue_3": { - "frame": { "x": 142, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-orange_2": { - "frame": { "x": 83, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-orange_3": { - "frame": { "x": 113, "y": 224, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-red_2": { - "frame": { "x": 157, "y": 225, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-red_3": { - "frame": { "x": 229, "y": 229, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-white_2": { - "frame": { "x": 296, "y": 229, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-white_3": { - "frame": { "x": 189, "y": 218, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-yellow_2": { - "frame": { "x": 98, "y": 219, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "669-yellow_3": { - "frame": { "x": 68, "y": 223, "w": 15, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 10, "w": 15, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-blue_2": { - "frame": { "x": 175, "y": 178, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-blue_3": { - "frame": { "x": 138, "y": 180, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-orage_2": { - "frame": { "x": 86, "y": 182, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-orage_3": { - "frame": { "x": 268, "y": 190, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-red_2": { - "frame": { "x": 67, "y": 179, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-red_3": { - "frame": { "x": 119, "y": 180, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-white_2": { - "frame": { "x": 249, "y": 190, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-white_3": { - "frame": { "x": 198, "y": 175, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-yellow_2": { - "frame": { "x": 0, "y": 177, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "670-yellow_3": { - "frame": { "x": 19, "y": 177, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-blue_2": { - "frame": { "x": 230, "y": 27, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-blue_3": { - "frame": { "x": 182, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-orange_2": { - "frame": { "x": 156, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-orange_3": { - "frame": { "x": 256, "y": 27, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-red_2": { - "frame": { "x": 0, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-red_3": { - "frame": { "x": 26, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-white_2": { - "frame": { "x": 52, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-white_3": { - "frame": { "x": 130, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-yellow_2": { - "frame": { "x": 78, "y": 28, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "671-yellow_3": { - "frame": { "x": 104, "y": 30, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "672_2": { - "frame": { "x": 263, "y": 212, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "672_3": { - "frame": { "x": 321, "y": 213, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "673_2": { - "frame": { "x": 23, "y": 155, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "673_3": { - "frame": { "x": 0, "y": 155, "w": 23, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 23, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "677_2": { - "frame": { "x": 280, "y": 215, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "677_3": { - "frame": { "x": 18, "y": 216, "w": 16, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 10, "w": 16, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678-female_2": { - "frame": { "x": 316, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678-female_3": { - "frame": { "x": 253, "y": 168, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678_2": { - "frame": { "x": 295, "y": 169, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "678_3": { - "frame": { "x": 274, "y": 168, "w": 21, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 21, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "690_2": { - "frame": { "x": 194, "y": 197, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "690_3": { - "frame": { "x": 0, "y": 199, "w": 18, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 18, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "691_2": { - "frame": { "x": 290, "y": 0, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "691_3": { - "frame": { "x": 290, "y": 23, "w": 32, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 32, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "696_2": { - "frame": { "x": 174, "y": 200, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "696_3": { - "frame": { "x": 18, "y": 199, "w": 20, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "697_2": { - "frame": { "x": 208, "y": 54, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "697_3": { - "frame": { "x": 238, "y": 54, "w": 30, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 30, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "698_2": { - "frame": { "x": 157, "y": 180, "w": 17, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "698_3": { - "frame": { "x": 287, "y": 191, "w": 17, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "699_2": { - "frame": { "x": 130, "y": 132, "w": 24, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "699_3": { - "frame": { "x": 106, "y": 132, "w": 24, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 24, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "700_2": { - "frame": { "x": 320, "y": 70, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "700_3": { - "frame": { "x": 208, "y": 30, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "702_2": { - "frame": { "x": 105, "y": 202, "w": 22, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "702_3": { - "frame": { "x": 59, "y": 201, "w": 22, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 11, "w": 22, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "703_2": { - "frame": { "x": 105, "y": 182, "w": 14, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "703_3": { - "frame": { "x": 268, "y": 54, "w": 14, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 15, "w": 14, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "704_2": { - "frame": { "x": 142, "y": 159, "w": 12, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "704_3": { - "frame": { "x": 128, "y": 224, "w": 12, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 14, "w": 12, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "705_2": { - "frame": { "x": 325, "y": 191, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "705_3": { - "frame": { "x": 127, "y": 202, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "706_2": { - "frame": { "x": 204, "y": 151, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "706_3": { - "frame": { "x": 314, "y": 145, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "708_2": { - "frame": { "x": 228, "y": 151, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "708_3": { - "frame": { "x": 52, "y": 154, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "709_2": { - "frame": { "x": 154, "y": 132, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "709_3": { - "frame": { "x": 179, "y": 132, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "710_2": { - "frame": { "x": 81, "y": 204, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "710_3": { - "frame": { "x": 212, "y": 211, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 9, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_1": { - "frame": { "x": 77, "y": 156, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_2": { - "frame": { "x": 154, "y": 157, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "711_3": { - "frame": { "x": 98, "y": 159, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "712_2": { - "frame": { "x": 229, "y": 211, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "712_3": { - "frame": { "x": 246, "y": 212, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 10, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "713_2": { - "frame": { "x": 52, "y": 130, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "713_3": { - "frame": { "x": 79, "y": 132, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "714_2": { - "frame": { "x": 46, "y": 175, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "714_3": { - "frame": { "x": 228, "y": 172, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 6, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "715_2": { - "frame": { "x": 310, "y": 46, "w": 28, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "715_3": { - "frame": { "x": 282, "y": 46, "w": 28, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 4, "w": 28, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-active_2": { - "frame": { "x": 114, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-active_3": { - "frame": { "x": 143, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-neutral_2": { - "frame": { "x": 172, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "716-neutral_3": { - "frame": { "x": 201, "y": 0, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "717_2": { - "frame": { "x": 230, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "717_3": { - "frame": { "x": 260, "y": 0, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_1": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_2": { - "frame": { "x": 76, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720-unbound_3": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 2, "w": 38, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_1": { - "frame": { "x": 217, "y": 192, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_2": { - "frame": { "x": 38, "y": 195, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "720_3": { - "frame": { "x": 304, "y": 191, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_6v.png", - "format": "RGBA8888", - "size": { "w": 342, "h": 247 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_6v.png", + "format": "RGBA8888", + "size": { + "w": 480, + "h": 480 + }, + "scale": 1, + "frames": [ + { + "filename": "653_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "653_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "654_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "654_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "655_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "655_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "656_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "656_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "657_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "657_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658-ash_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658-ash_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "658_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "658_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "664_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "664_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "665_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "665_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-archipelago_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-archipelago_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-continental_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-continental_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-elegant_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-elegant_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-fancy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-fancy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-garden_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-garden_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-high-plains_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-high-plains_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-icy-snow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-icy-snow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-jungle_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-jungle_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-marine_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-marine_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-meadow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-meadow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-modern_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-modern_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-monsoon_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-monsoon_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-ocean_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-ocean_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-poke-ball_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-poke-ball_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-polar_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-polar_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-river_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-river_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sandstorm_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sandstorm_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-savanna_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-savanna_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sun_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-sun_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-tundra_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "666-tundra_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "669-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "670-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-blue_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-blue_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-orange_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-orange_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-red_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-red_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-white_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-white_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-yellow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "671-yellow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "672_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "672_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "673_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "673_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-dandy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-dandy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-debutante_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-debutante_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-diamond_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-diamond_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-heart_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-heart_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-kabuki_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-kabuki_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-la-reine_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-la-reine_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-matron_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-matron_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-pharaoh_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-pharaoh_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-star_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676-star_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "676_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "677_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "677_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678-female_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678-female_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "678_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "682_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "682_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "683_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "683_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "684_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "684_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "685_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "685_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "688_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "688_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "689_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "689_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "690_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "690_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "691_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "691_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "696_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "696_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "697_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "697_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "698_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "698_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "699_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "699_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "700_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "700_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "702_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "702_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "703_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "703_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "704_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "704_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "705_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "705_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "706_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "706_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "708_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "708_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "709_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "709_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "710_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "710_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "711_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "712_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "712_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "713_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "713_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "714_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "714_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "715_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "715_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-active_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-active_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-neutral_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "716-neutral_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "717_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "717_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720-unbound_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "720_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "2670_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "2670_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:41960148e7a74c451d8ed1c46adc4e09:5dc2b45aa8a432e966da6c4070905be6:8a74f769af240f74b0e67390bbb36c14$" + } } diff --git a/public/images/pokemon_icons_6v.png b/public/images/pokemon_icons_6v.png index 83e29e28738..29d00876b50 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_7v.json b/public/images/pokemon_icons_7v.json index a7f828a0fe1..30e12ce3bb4 100644 --- a/public/images/pokemon_icons_7v.json +++ b/public/images/pokemon_icons_7v.json @@ -1,956 +1,2981 @@ -{ "frames": { - "2027_2": { - "frame": { "x": 160, "y": 218, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2027_3": { - "frame": { "x": 91, "y": 218, "w": 21, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 10, "w": 21, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2028_2": { - "frame": { "x": 26, "y": 148, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2028_3": { - "frame": { "x": 104, "y": 148, "w": 25, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 25, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2052_2": { - "frame": { "x": 144, "y": 195, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2052_3": { - "frame": { "x": 331, "y": 195, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2053_2": { - "frame": { "x": 121, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "2053_3": { - "frame": { "x": 312, "y": 172, "w": 24, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 24, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "728_2": { - "frame": { "x": 62, "y": 219, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "728_3": { - "frame": { "x": 45, "y": 219, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "729_2": { - "frame": { "x": 158, "y": 171, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "729_3": { - "frame": { "x": 98, "y": 172, "w": 23, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 23, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "730_2": { - "frame": { "x": 130, "y": 145, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "730_3": { - "frame": { "x": 234, "y": 147, "w": 28, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 28, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "734_2": { - "frame": { "x": 306, "y": 214, "w": 25, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "734_3": { - "frame": { "x": 20, "y": 215, "w": 25, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 25, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "735_2": { - "frame": { "x": 268, "y": 175, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "735_3": { - "frame": { "x": 288, "y": 175, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "742_2": { - "frame": { "x": 187, "y": 217, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "742_3": { - "frame": { "x": 283, "y": 217, "w": 19, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 19, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "743_2": { - "frame": { "x": 0, "y": 197, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "743_3": { - "frame": { "x": 96, "y": 196, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "747_2": { - "frame": { "x": 165, "y": 198, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "747_3": { - "frame": { "x": 202, "y": 197, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "748_2": { - "frame": { "x": 0, "y": 148, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "748_3": { - "frame": { "x": 312, "y": 147, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "751_2": { - "frame": { "x": 104, "y": 60, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "751_3": { - "frame": { "x": 130, "y": 88, "w": 14, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 14, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "752_2": { - "frame": { "x": 283, "y": 199, "w": 23, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "752_3": { - "frame": { "x": 116, "y": 214, "w": 23, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 8, "w": 23, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "753_2": { - "frame": { "x": 187, "y": 198, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "753_3": { - "frame": { "x": 234, "y": 118, "w": 14, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 8, "w": 14, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "754_2": { - "frame": { "x": 71, "y": 197, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "754_3": { - "frame": { "x": 224, "y": 198, "w": 20, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 20, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "755_2": { - "frame": { "x": 346, "y": 52, "w": 13, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "755_3": { - "frame": { "x": 268, "y": 30, "w": 13, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 14, "y": 4, "w": 13, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "756_2": { - "frame": { "x": 338, "y": 171, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "756_3": { - "frame": { "x": 0, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "761_2": { - "frame": { "x": 323, "y": 235, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "761_3": { - "frame": { "x": 129, "y": 235, "w": 16, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 16, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "762_2": { - "frame": { "x": 342, "y": 29, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "762_3": { - "frame": { "x": 265, "y": 199, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 4, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "763_2": { - "frame": { "x": 50, "y": 175, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "763_3": { - "frame": { "x": 181, "y": 174, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "767_2": { - "frame": { "x": 223, "y": 220, "w": 24, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "767_3": { - "frame": { "x": 17, "y": 231, "w": 24, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 11, "w": 24, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "768_2": { - "frame": { "x": 26, "y": 172, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "768_3": { - "frame": { "x": 74, "y": 150, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "771_2": { - "frame": { "x": 163, "y": 236, "w": 18, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "771_3": { - "frame": { "x": 145, "y": 236, "w": 18, "h": 13 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 11, "w": 18, "h": 13 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "772_2": { - "frame": { "x": 262, "y": 147, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "772_3": { - "frame": { "x": 287, "y": 147, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-bug_2": { - "frame": { "x": 0, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-bug_3": { - "frame": { "x": 26, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dark_2": { - "frame": { "x": 104, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dark_3": { - "frame": { "x": 182, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dragon_2": { - "frame": { "x": 208, "y": 118, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-dragon_3": { - "frame": { "x": 52, "y": 120, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-electric_2": { - "frame": { "x": 78, "y": 120, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-electric_3": { - "frame": { "x": 268, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fairy_2": { - "frame": { "x": 294, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fairy_3": { - "frame": { "x": 320, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fighting_2": { - "frame": { "x": 0, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fighting_3": { - "frame": { "x": 26, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fire_2": { - "frame": { "x": 118, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-fire_3": { - "frame": { "x": 203, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-flying_2": { - "frame": { "x": 229, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-flying_3": { - "frame": { "x": 326, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ghost_2": { - "frame": { "x": 78, "y": 60, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ghost_3": { - "frame": { "x": 144, "y": 85, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-grass_2": { - "frame": { "x": 170, "y": 85, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-grass_3": { - "frame": { "x": 255, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ground_2": { - "frame": { "x": 281, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ground_3": { - "frame": { "x": 307, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ice_2": { - "frame": { "x": 333, "y": 87, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-ice_3": { - "frame": { "x": 0, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-poison_2": { - "frame": { "x": 26, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-poison_3": { - "frame": { "x": 104, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-psychic_2": { - "frame": { "x": 196, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-psychic_3": { - "frame": { "x": 222, "y": 88, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-rock_2": { - "frame": { "x": 52, "y": 90, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-rock_3": { - "frame": { "x": 78, "y": 90, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-steel_2": { - "frame": { "x": 130, "y": 115, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-steel_3": { - "frame": { "x": 52, "y": 60, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-water_2": { - "frame": { "x": 156, "y": 115, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773-water_3": { - "frame": { "x": 248, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773_2": { - "frame": { "x": 274, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "773_3": { - "frame": { "x": 300, "y": 117, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "776_2": { - "frame": { "x": 181, "y": 148, "w": 23, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "776_3": { - "frame": { "x": 158, "y": 145, "w": 23, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "777_2": { - "frame": { "x": 223, "y": 234, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "777_3": { - "frame": { "x": 112, "y": 232, "w": 17, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 8, "w": 17, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-busted_2": { - "frame": { "x": 302, "y": 230, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-busted_3": { - "frame": { "x": 247, "y": 222, "w": 21, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 12, "w": 21, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-disguised_2": { - "frame": { "x": 206, "y": 217, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "778-disguised_3": { - "frame": { "x": 0, "y": 219, "w": 17, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 5, "w": 17, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "779_2": { - "frame": { "x": 244, "y": 199, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "779_3": { - "frame": { "x": 45, "y": 199, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_1": { - "frame": { "x": 308, "y": 194, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_2": { - "frame": { "x": 22, "y": 195, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "789_3": { - "frame": { "x": 121, "y": 194, "w": 23, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 6, "w": 23, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "790_2": { - "frame": { "x": 331, "y": 216, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "790_3": { - "frame": { "x": 139, "y": 216, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_1": { - "frame": { "x": 239, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_2": { - "frame": { "x": 210, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "791_3": { - "frame": { "x": 118, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "792_2": { - "frame": { "x": 175, "y": 57, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "792_3": { - "frame": { "x": 147, "y": 57, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 1, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "793_2": { - "frame": { "x": 247, "y": 175, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "793_3": { - "frame": { "x": 226, "y": 174, "w": 21, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "797_2": { - "frame": { "x": 250, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "797_3": { - "frame": { "x": 218, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "798_2": { - "frame": { "x": 179, "y": 28, "w": 31, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "798_3": { - "frame": { "x": 148, "y": 28, "w": 31, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dawn-wings_2": { - "frame": { "x": 31, "y": 28, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dawn-wings_3": { - "frame": { "x": 0, "y": 28, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dusk-mane_2": { - "frame": { "x": 114, "y": 0, "w": 34, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-dusk-mane_3": { - "frame": { "x": 80, "y": 0, "w": 34, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 0, "w": 34, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-ultra_2": { - "frame": { "x": 183, "y": 0, "w": 35, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800-ultra_3": { - "frame": { "x": 148, "y": 0, "w": 35, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 35, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800_2": { - "frame": { "x": 90, "y": 30, "w": 28, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "800_3": { - "frame": { "x": 62, "y": 30, "w": 28, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 28, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_1": { - "frame": { "x": 74, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_2": { - "frame": { "x": 204, "y": 173, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "802_3": { - "frame": { "x": 338, "y": 147, "w": 22, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 4, "w": 22, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "803_2": { - "frame": { "x": 51, "y": 150, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "803_3": { - "frame": { "x": 204, "y": 148, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "804_2": { - "frame": { "x": 315, "y": 0, "w": 33, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "804_3": { - "frame": { "x": 282, "y": 0, "w": 33, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 33, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "808_2": { - "frame": { "x": 339, "y": 235, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "808_3": { - "frame": { "x": 79, "y": 236, "w": 17, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 17, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809-gigantamax_2": { - "frame": { "x": 312, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809-gigantamax_3": { - "frame": { "x": 282, "y": 29, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809_2": { - "frame": { "x": 40, "y": 0, "w": 40, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "809_3": { - "frame": { "x": 0, "y": 0, "w": 40, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 0, "y": 1, "w": 40, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_6v.png", - "format": "RGBA8888", - "size": { "w": 360, "h": 254 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_7v.png", + "format": "RGBA8888", + "size": { + "w": 440, + "h": 440 + }, + "scale": 1, + "frames": [ + { + "filename": "728_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "728_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "729_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "729_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "730_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "730_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "734_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "734_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "735_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "735_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "742_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "742_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "743_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "743_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "747_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "747_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "748_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "748_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "751_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "751_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "752_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "752_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "753_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "753_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "754_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "754_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "755_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "755_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "756_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "756_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "761_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "761_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "762_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "762_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "763_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "763_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "767_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "767_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "768_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "768_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "771_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "771_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "772_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "772_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-bug_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-bug_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dark_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dark_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dragon_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-dragon_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-electric_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-electric_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fairy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fairy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fighting_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fighting_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fire_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-fire_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-flying_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-flying_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ghost_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ghost_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-grass_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-grass_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ground_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ground_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ice_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-ice_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-poison_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-poison_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-psychic_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-psychic_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-rock_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-rock_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-steel_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-steel_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-water_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "773-water_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "773_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "773_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "776_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "776_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "777_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "777_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-busted_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-busted_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-disguised_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "778-disguised_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "779_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "779_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "789_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "790_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "790_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "791_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "792_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "792_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "793_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "793_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "797_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "797_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "798_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "798_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dawn-wings_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-dusk-mane_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-ultra_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800-ultra_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "800_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "802_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "803_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "803_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "804_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "804_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "807_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "807_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "808_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "808_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "809_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2026_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2026_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2027_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "2027_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2028_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2028_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2052_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2052_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2053_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2053_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2103_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "2103_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:914c9869d6dab145bbbe443bdc3f932c:80b9ecf9647b68af17c07b88e1a1856e:d5975df27e1e94206a68aa1fd3c2c8d0$" + } } diff --git a/public/images/pokemon_icons_7v.png b/public/images/pokemon_icons_7v.png index 50fee6de396..1f7d6e5f826 100644 Binary files a/public/images/pokemon_icons_7v.png and b/public/images/pokemon_icons_7v.png differ diff --git a/public/images/pokemon_icons_8v.json b/public/images/pokemon_icons_8v.json index 002957bba0c..a33f88e9d9b 100644 --- a/public/images/pokemon_icons_8v.json +++ b/public/images/pokemon_icons_8v.json @@ -1,1306 +1,4115 @@ -{ "frames": { - "4052_2": { - "frame": { "x": 85, "y": 209, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4052_3": { - "frame": { "x": 106, "y": 210, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4077_2": { - "frame": { "x": 203, "y": 112, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4077_3": { - "frame": { "x": 48, "y": 112, "w": 24, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 24, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4078_2": { - "frame": { "x": 230, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4078_3": { - "frame": { "x": 203, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4079_2": { - "frame": { "x": 79, "y": 250, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4079_3": { - "frame": { "x": 351, "y": 250, "w": 26, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 8, "w": 26, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_1": { - "frame": { "x": 352, "y": 161, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_2": { - "frame": { "x": 23, "y": 161, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4080_3": { - "frame": { "x": 328, "y": 160, "w": 24, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4144_2": { - "frame": { "x": 146, "y": 230, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4144_3": { - "frame": { "x": 85, "y": 231, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4145_2": { - "frame": { "x": 228, "y": 110, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4145_3": { - "frame": { "x": 97, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4146_2": { - "frame": { "x": 240, "y": 200, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4146_3": { - "frame": { "x": 212, "y": 200, "w": 28, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 6, "w": 28, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_1": { - "frame": { "x": 360, "y": 30, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_2": { - "frame": { "x": 96, "y": 182, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4199_3": { - "frame": { "x": 192, "y": 179, "w": 20, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4222_2": { - "frame": { "x": 309, "y": 228, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4222_3": { - "frame": { "x": 330, "y": 228, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4263_2": { - "frame": { "x": 216, "y": 258, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4263_3": { - "frame": { "x": 304, "y": 265, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4264_2": { - "frame": { "x": 287, "y": 210, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4264_3": { - "frame": { "x": 160, "y": 210, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4562_2": { - "frame": { "x": 76, "y": 264, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "4562_3": { - "frame": { "x": 351, "y": 264, "w": 22, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 22, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6100_2": { - "frame": { "x": 168, "y": 230, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6100_3": { - "frame": { "x": 49, "y": 277, "w": 14, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 14, "w": 14, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6101_2": { - "frame": { "x": 312, "y": 187, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6101_3": { - "frame": { "x": 266, "y": 271, "w": 16, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 16, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6215_2": { - "frame": { "x": 182, "y": 251, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6215_3": { - "frame": { "x": 126, "y": 250, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6549_2": { - "frame": { "x": 288, "y": 249, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6549_3": { - "frame": { "x": 286, "y": 58, "w": 16, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 5, "w": 16, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6570_2": { - "frame": { "x": 146, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6570_3": { - "frame": { "x": 333, "y": 248, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 6, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6571_2": { - "frame": { "x": 193, "y": 156, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6571_3": { - "frame": { "x": 23, "y": 138, "w": 25, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 25, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6705_2": { - "frame": { "x": 125, "y": 89, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6705_3": { - "frame": { "x": 34, "y": 271, "w": 15, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 6, "w": 15, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6706_2": { - "frame": { "x": 234, "y": 85, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6706_3": { - "frame": { "x": 260, "y": 85, "w": 26, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 26, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6713_2": { - "frame": { "x": 257, "y": 133, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "6713_3": { - "frame": { "x": 48, "y": 134, "w": 27, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 5, "w": 27, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "816_2": { - "frame": { "x": 0, "y": 188, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "816_3": { - "frame": { "x": 290, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "817_2": { - "frame": { "x": 308, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "817_3": { - "frame": { "x": 332, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818-gigantamax_2": { - "frame": { "x": 214, "y": 28, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818-gigantamax_3": { - "frame": { "x": 348, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818_2": { - "frame": { "x": 75, "y": 134, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "818_3": { - "frame": { "x": 123, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "821_2": { - "frame": { "x": 139, "y": 271, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "821_3": { - "frame": { "x": 158, "y": 271, "w": 19, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 7, "w": 19, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "822_2": { - "frame": { "x": 0, "y": 231, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "822_3": { - "frame": { "x": 287, "y": 230, "w": 22, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823-gigantamax_2": { - "frame": { "x": 302, "y": 28, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823-gigantamax_3": { - "frame": { "x": 0, "y": 30, "w": 32, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 32, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823_2": { - "frame": { "x": 140, "y": 87, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "823_3": { - "frame": { "x": 201, "y": 88, "w": 27, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 27, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "829_2": { - "frame": { "x": 270, "y": 231, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "829_3": { - "frame": { "x": 122, "y": 271, "w": 17, "h": 18 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 6, "w": 17, "h": 18 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "830_2": { - "frame": { "x": 42, "y": 226, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "830_3": { - "frame": { "x": 233, "y": 218, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "835_2": { - "frame": { "x": 211, "y": 218, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "835_3": { - "frame": { "x": 0, "y": 211, "w": 22, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "836_2": { - "frame": { "x": 189, "y": 206, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "836_3": { - "frame": { "x": 138, "y": 205, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "850_2": { - "frame": { "x": 194, "y": 276, "w": 21, "h": 10 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "850_3": { - "frame": { "x": 233, "y": 275, "w": 21, "h": 10 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 10, "w": 21, "h": 10 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "851_2": { - "frame": { "x": 113, "y": 0, "w": 37, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "851_3": { - "frame": { "x": 76, "y": 0, "w": 37, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 37, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "854_2": { - "frame": { "x": 98, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "854_3": { - "frame": { "x": 177, "y": 272, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "855_2": { - "frame": { "x": 116, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "855_3": { - "frame": { "x": 167, "y": 187, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "856_2": { - "frame": { "x": 127, "y": 227, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "856_3": { - "frame": { "x": 182, "y": 228, "w": 19, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "857_2": { - "frame": { "x": 312, "y": 206, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "857_3": { - "frame": { "x": 44, "y": 204, "w": 22, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 4, "w": 22, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858-gigantamax_2": { - "frame": { "x": 273, "y": 28, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858-gigantamax_3": { - "frame": { "x": 244, "y": 28, "w": 29, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 29, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858_2": { - "frame": { "x": 47, "y": 179, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "858_3": { - "frame": { "x": 74, "y": 161, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "859_2": { - "frame": { "x": 326, "y": 270, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "859_3": { - "frame": { "x": 0, "y": 271, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "860_2": { - "frame": { "x": 22, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "860_3": { - "frame": { "x": 69, "y": 186, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861-gigantamax_2": { - "frame": { "x": 0, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861-gigantamax_3": { - "frame": { "x": 302, "y": 55, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861_2": { - "frame": { "x": 286, "y": 85, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "861_3": { - "frame": { "x": 72, "y": 83, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "863_2": { - "frame": { "x": 22, "y": 207, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "863_3": { - "frame": { "x": 360, "y": 112, "w": 20, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "864_2": { - "frame": { "x": 94, "y": 30, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "864_3": { - "frame": { "x": 151, "y": 30, "w": 30, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "867_2": { - "frame": { "x": 32, "y": 30, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "867_3": { - "frame": { "x": 63, "y": 30, "w": 31, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 1, "w": 31, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_1": { - "frame": { "x": 282, "y": 272, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_2": { - "frame": { "x": 216, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "872_3": { - "frame": { "x": 17, "y": 274, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_1": { - "frame": { "x": 243, "y": 178, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_2": { - "frame": { "x": 218, "y": 178, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "873_3": { - "frame": { "x": 270, "y": 162, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876-female_2": { - "frame": { "x": 350, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876-female_3": { - "frame": { "x": 268, "y": 184, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876_2": { - "frame": { "x": 268, "y": 207, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "876_3": { - "frame": { "x": 66, "y": 209, "w": 19, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_1": { - "frame": { "x": 105, "y": 253, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_2": { - "frame": { "x": 249, "y": 254, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877-hangry_3": { - "frame": { "x": 199, "y": 255, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_1": { - "frame": { "x": 59, "y": 256, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_2": { - "frame": { "x": 0, "y": 250, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "877_3": { - "frame": { "x": 17, "y": 253, "w": 17, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 17, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "880_2": { - "frame": { "x": 244, "y": 156, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "880_3": { - "frame": { "x": 218, "y": 156, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "881_2": { - "frame": { "x": 252, "y": 231, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "881_3": { - "frame": { "x": 61, "y": 233, "w": 18, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 3, "w": 18, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "882_2": { - "frame": { "x": 328, "y": 183, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "882_3": { - "frame": { "x": 145, "y": 182, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 3, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "883_2": { - "frame": { "x": 357, "y": 207, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "883_3": { - "frame": { "x": 334, "y": 207, "w": 23, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 4, "w": 23, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884-gigantamax_2": { - "frame": { "x": 124, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884-gigantamax_3": { - "frame": { "x": 181, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884_2": { - "frame": { "x": 123, "y": 162, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "884_3": { - "frame": { "x": 0, "y": 163, "w": 22, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 22, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_1": { - "frame": { "x": 201, "y": 238, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_2": { - "frame": { "x": 225, "y": 241, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "885_3": { - "frame": { "x": 309, "y": 248, "w": 24, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 6, "w": 24, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_1": { - "frame": { "x": 308, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_2": { - "frame": { "x": 125, "y": 111, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "886_3": { - "frame": { "x": 177, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_1": { - "frame": { "x": 86, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_2": { - "frame": { "x": 56, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "887_3": { - "frame": { "x": 26, "y": 57, "w": 30, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 2, "w": 30, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888-crowned_2": { - "frame": { "x": 182, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888-crowned_3": { - "frame": { "x": 150, "y": 0, "w": 32, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888_2": { - "frame": { "x": 167, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "888_3": { - "frame": { "x": 311, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889-crowned_2": { - "frame": { "x": 214, "y": 0, "w": 34, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889-crowned_3": { - "frame": { "x": 248, "y": 0, "w": 34, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 34, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889_2": { - "frame": { "x": 260, "y": 58, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "889_3": { - "frame": { "x": 234, "y": 58, "w": 26, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 1, "w": 26, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890-eternamax_2": { - "frame": { "x": 0, "y": 0, "w": 38, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890-eternamax_3": { - "frame": { "x": 38, "y": 0, "w": 38, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 1, "y": 0, "w": 38, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890_2": { - "frame": { "x": 282, "y": 0, "w": 33, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "890_3": { - "frame": { "x": 315, "y": 0, "w": 33, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 3, "y": 1, "w": 33, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_1": { - "frame": { "x": 164, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_2": { - "frame": { "x": 270, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "891_3": { - "frame": { "x": 41, "y": 249, "w": 18, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 4, "w": 18, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_1": { - "frame": { "x": 284, "y": 111, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_2": { - "frame": { "x": 0, "y": 112, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-rapid_3": { - "frame": { "x": 24, "y": 112, "w": 24, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 24, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_1": { - "frame": { "x": 26, "y": 83, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_2": { - "frame": { "x": 49, "y": 83, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-gigantamax-single_3": { - "frame": { "x": 352, "y": 60, "w": 23, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_1": { - "frame": { "x": 48, "y": 157, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_2": { - "frame": { "x": 97, "y": 160, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892-rapid-strike_3": { - "frame": { "x": 145, "y": 160, "w": 26, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 4, "w": 26, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_1": { - "frame": { "x": 356, "y": 136, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_2": { - "frame": { "x": 284, "y": 137, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "892_3": { - "frame": { "x": 0, "y": 138, "w": 23, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 2, "w": 23, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_1": { - "frame": { "x": 97, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_2": { - "frame": { "x": 145, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "896_3": { - "frame": { "x": 169, "y": 136, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_1": { - "frame": { "x": 151, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_2": { - "frame": { "x": 97, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "897_3": { - "frame": { "x": 334, "y": 112, "w": 26, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 26, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_1": { - "frame": { "x": 328, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_2": { - "frame": { "x": 116, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-ice_3": { - "frame": { "x": 177, "y": 60, "w": 24, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 24, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_1": { - "frame": { "x": 151, "y": 57, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_2": { - "frame": { "x": 208, "y": 58, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898-shadow_3": { - "frame": { "x": 334, "y": 30, "w": 26, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 0, "w": 26, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_1": { - "frame": { "x": 351, "y": 228, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_2": { - "frame": { "x": 22, "y": 231, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "898_3": { - "frame": { "x": 107, "y": 231, "w": 19, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 19, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "900_2": { - "frame": { "x": 0, "y": 87, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "900_3": { - "frame": { "x": 72, "y": 109, "w": 25, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 3, "w": 25, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "901_2": { - "frame": { "x": 256, "y": 110, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "901_3": { - "frame": { "x": 339, "y": 89, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 5, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "903_2": { - "frame": { "x": 307, "y": 160, "w": 21, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "903_3": { - "frame": { "x": 171, "y": 160, "w": 21, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 21, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_8v.png", - "format": "RGBA8888", - "size": { "w": 380, "h": 293 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_8v.png", + "format": "RGBA8888", + "size": { + "w": 510, + "h": 510 + }, + "scale": 1, + "frames": [ + { + "filename": "816_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "816_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "817_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "817_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "818_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "821_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "821_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "822_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "822_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "823-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "823_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "829_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "829_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "830_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "830_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "835_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "835_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "836_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "836_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "850_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "850_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "851s-gigantamax", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "854_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "854_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "855_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "855_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "856_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "856_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "857_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "857_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "858_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "859_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "859_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "860_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "860_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "861-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "861_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "863_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "863_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "864_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "864_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "867_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "867_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "872_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "873_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876-female_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876-female_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "876_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877-hangry_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "877_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "880_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "880_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "881_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "881_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "882_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "882_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "883_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "883_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884-gigantamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884-gigantamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "884_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "884_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "885_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "886_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "887_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "888-crowned_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "888-crowned_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "888_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "888_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889-crowned_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889-crowned_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "889_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890-eternamax_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890-eternamax_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "890_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "891_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-rapid_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-gigantamax-single_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892-rapid-strike_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "892_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "894_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "894_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "895_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "895_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "896_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "897_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-ice_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898-shadow_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "898_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "900_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "900_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "901_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "901_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "903_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "903_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4052_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4052_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4077_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4077_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4078_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4078_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4079_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4079_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4080_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4144_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4144_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4145_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4145_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4146_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4146_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4199_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4222_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "4222_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4263_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4263_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4264_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4264_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4562_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "4562_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6100_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6100_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6101_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6101_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6215_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "6215_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6503_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6503_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6549_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6549_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6570_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6570_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6571_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6571_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6705_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6705_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6706_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 440, + "y": 450, + "w": 40, + "h": 30 + } + }, + { + "filename": "6706_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "6713_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 480, + "w": 40, + "h": 30 + } + }, + { + "filename": "6713_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 480, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c6192164d1b1971f54a6c5864e11748d:46b3adcf2a25bfb824db3d24cd1c96a9:ec5f05e7f30cd98f74db0c2326109fd3$" + } } diff --git a/public/images/pokemon_icons_8v.png b/public/images/pokemon_icons_8v.png index 1968bfe6214..2af86ac656f 100644 Binary files a/public/images/pokemon_icons_8v.png and b/public/images/pokemon_icons_8v.png differ diff --git a/public/images/pokemon_icons_9v.json b/public/images/pokemon_icons_9v.json index 06909a8298f..6c8b93208e3 100644 --- a/public/images/pokemon_icons_9v.json +++ b/public/images/pokemon_icons_9v.json @@ -1,1047 +1,3296 @@ -{ "frames": { - "1000_1": { - "frame": { "x": 93, "y": 139, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1000_2": { - "frame": { "x": 170, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1000_3": { - "frame": { "x": 192, "y": 135, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1001_2": { - "frame": { "x": 249, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1001_3": { - "frame": { "x": 279, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1003_2": { - "frame": { "x": 27, "y": 58, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1003_3": { - "frame": { "x": 55, "y": 58, "w": 28, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 28, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1004_2": { - "frame": { "x": 249, "y": 207, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1004_3": { - "frame": { "x": 204, "y": 206, "w": 21, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 8, "w": 21, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1006_2": { - "frame": { "x": 44, "y": 140, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1006_3": { - "frame": { "x": 22, "y": 139, "w": 22, "h": 27 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 22, "h": 27 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1007-apex-build_2": { - "frame": { "x": 155, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1007-apex-build_3": { - "frame": { "x": 187, "y": 0, "w": 32, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 32, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_1": { - "frame": { "x": 185, "y": 29, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_2": { - "frame": { "x": 155, "y": 29, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1008-ultimate-mode_3": { - "frame": { "x": 219, "y": 0, "w": 30, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 30, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1010_2": { - "frame": { "x": 271, "y": 179, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1010_3": { - "frame": { "x": 162, "y": 182, "w": 21, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 2, "w": 21, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1018_2": { - "frame": { "x": 0, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1018_3": { - "frame": { "x": 31, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1022_2": { - "frame": { "x": 27, "y": 86, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1022_3": { - "frame": { "x": 163, "y": 84, "w": 29, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 29, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1023_2": { - "frame": { "x": 300, "y": 30, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "1023_3": { - "frame": { "x": 46, "y": 167, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 1, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_1": { - "frame": { "x": 30, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_2": { - "frame": { "x": 60, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "8901_3": { - "frame": { "x": 0, "y": 30, "w": 30, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 1, "w": 30, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "909_2": { - "frame": { "x": 42, "y": 195, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "909_3": { - "frame": { "x": 63, "y": 196, "w": 21, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 5, "w": 21, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "910_2": { - "frame": { "x": 271, "y": 205, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "910_3": { - "frame": { "x": 292, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "911_2": { - "frame": { "x": 131, "y": 112, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "911_3": { - "frame": { "x": 188, "y": 112, "w": 28, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 3, "w": 28, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "912_2": { - "frame": { "x": 36, "y": 244, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "912_3": { - "frame": { "x": 178, "y": 244, "w": 15, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 9, "w": 15, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "913_2": { - "frame": { "x": 84, "y": 217, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "913_3": { - "frame": { "x": 197, "y": 59, "w": 17, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 5, "w": 17, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "914_2": { - "frame": { "x": 122, "y": 135, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "914_3": { - "frame": { "x": 146, "y": 135, "w": 24, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 3, "w": 24, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_1": { - "frame": { "x": 0, "y": 253, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_2": { - "frame": { "x": 51, "y": 250, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "919_3": { - "frame": { "x": 95, "y": 247, "w": 16, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 13, "w": 16, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_1": { - "frame": { "x": 0, "y": 190, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_2": { - "frame": { "x": 208, "y": 183, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "920_3": { - "frame": { "x": 0, "y": 143, "w": 22, "h": 23 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 5, "w": 22, "h": 23 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_1": { - "frame": { "x": 237, "y": 152, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_2": { - "frame": { "x": 144, "y": 162, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "924_3": { - "frame": { "x": 266, "y": 159, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_1": { - "frame": { "x": 93, "y": 117, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_2": { - "frame": { "x": 245, "y": 130, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-four_3": { - "frame": { "x": 216, "y": 112, "w": 29, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 6, "w": 29, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_1": { - "frame": { "x": 115, "y": 160, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_2": { - "frame": { "x": 202, "y": 163, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "925-three_3": { - "frame": { "x": 173, "y": 162, "w": 29, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 8, "w": 29, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "932_2": { - "frame": { "x": 202, "y": 226, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "932_3": { - "frame": { "x": 292, "y": 225, "w": 18, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 9, "w": 18, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "933_2": { - "frame": { "x": 183, "y": 183, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "933_3": { - "frame": { "x": 292, "y": 183, "w": 25, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 7, "w": 25, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "934_2": { - "frame": { "x": 273, "y": 30, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "934_3": { - "frame": { "x": 0, "y": 58, "w": 27, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 0, "w": 27, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_1": { - "frame": { "x": 300, "y": 244, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_2": { - "frame": { "x": 287, "y": 244, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "935_3": { - "frame": { "x": 236, "y": 241, "w": 13, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 13, "y": 7, "w": 13, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_1": { - "frame": { "x": 251, "y": 179, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_2": { - "frame": { "x": 66, "y": 168, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "936_3": { - "frame": { "x": 231, "y": 172, "w": 20, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 0, "w": 20, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_1": { - "frame": { "x": 215, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_2": { - "frame": { "x": 244, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_3": { - "frame": { "x": 90, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "937_9": { - "frame": { "x": 119, "y": 30, "w": 29, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 5, "y": 0, "w": 29, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "940_2": { - "frame": { "x": 245, "y": 116, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "940_3": { - "frame": { "x": 153, "y": 254, "w": 17, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 14, "w": 17, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "941_2": { - "frame": { "x": 183, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "941_3": { - "frame": { "x": 125, "y": 204, "w": 21, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 7, "w": 21, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "948_2": { - "frame": { "x": 249, "y": 227, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "948_3": { - "frame": { "x": 0, "y": 232, "w": 16, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 7, "w": 16, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "949_2": { - "frame": { "x": 22, "y": 193, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "949_3": { - "frame": { "x": 86, "y": 192, "w": 20, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 20, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "951_2": { - "frame": { "x": 220, "y": 241, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "951_3": { - "frame": { "x": 162, "y": 234, "w": 16, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 8, "w": 16, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "952_2": { - "frame": { "x": 112, "y": 180, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "952_3": { - "frame": { "x": 137, "y": 182, "w": 25, "h": 22 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 6, "w": 25, "h": 22 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "953_2": { - "frame": { "x": 51, "y": 219, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "953_3": { - "frame": { "x": 225, "y": 225, "w": 24, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 12, "w": 24, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "954_2": { - "frame": { "x": 296, "y": 130, "w": 21, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "954_3": { - "frame": { "x": 216, "y": 134, "w": 21, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 21, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_1": { - "frame": { "x": 193, "y": 245, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_2": { - "frame": { "x": 301, "y": 113, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "957_3": { - "frame": { "x": 265, "y": 246, "w": 16, "h": 17 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 11, "w": 16, "h": 17 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_1": { - "frame": { "x": 270, "y": 226, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_2": { - "frame": { "x": 145, "y": 227, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "958_3": { - "frame": { "x": 101, "y": 227, "w": 17, "h": 20 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 8, "w": 17, "h": 20 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_1": { - "frame": { "x": 62, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_2": { - "frame": { "x": 93, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "959_3": { - "frame": { "x": 124, "y": 0, "w": 31, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 0, "w": 31, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_1": { - "frame": { "x": 301, "y": 88, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_2": { - "frame": { "x": 230, "y": 200, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "962_3": { - "frame": { "x": 106, "y": 202, "w": 19, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 3, "w": 19, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "967_2": { - "frame": { "x": 182, "y": 225, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "967_3": { - "frame": { "x": 125, "y": 225, "w": 20, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 9, "w": 20, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "968_2": { - "frame": { "x": 48, "y": 112, "w": 23, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "968_3": { - "frame": { "x": 25, "y": 111, "w": 23, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 23, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "969_2": { - "frame": { "x": 16, "y": 260, "w": 18, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "969_3": { - "frame": { "x": 67, "y": 255, "w": 18, "h": 12 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 11, "y": 16, "w": 18, "h": 12 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "970_2": { - "frame": { "x": 118, "y": 244, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "970_3": { - "frame": { "x": 16, "y": 244, "w": 20, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 12, "w": 20, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_1": { - "frame": { "x": 167, "y": 208, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_2": { - "frame": { "x": 21, "y": 218, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "973_3": { - "frame": { "x": 36, "y": 218, "w": 15, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 2, "w": 15, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "974_2": { - "frame": { "x": 73, "y": 240, "w": 22, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "974_3": { - "frame": { "x": 51, "y": 235, "w": 22, "h": 15 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 13, "w": 22, "h": 15 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "975_2": { - "frame": { "x": 269, "y": 109, "w": 32, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "975_3": { - "frame": { "x": 269, "y": 88, "w": 32, "h": 21 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 4, "y": 7, "w": 32, "h": 21 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-curly_2": { - "frame": { "x": 111, "y": 260, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-curly_3": { - "frame": { "x": 209, "y": 261, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-droopy_2": { - "frame": { "x": 85, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-droopy_3": { - "frame": { "x": 193, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-stretchy_2": { - "frame": { "x": 224, "y": 262, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "978-stretchy_3": { - "frame": { "x": 34, "y": 263, "w": 15, "h": 14 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 14, "w": 15, "h": 14 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_1": { - "frame": { "x": 56, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_2": { - "frame": { "x": 192, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "979_3": { - "frame": { "x": 219, "y": 86, "w": 27, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 27, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "981_2": { - "frame": { "x": 108, "y": 87, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "981_3": { - "frame": { "x": 246, "y": 86, "w": 23, "h": 30 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 23, "h": 30 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982-three-segment_2": { - "frame": { "x": 83, "y": 87, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982-three-segment_3": { - "frame": { "x": 295, "y": 60, "w": 25, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 25, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982_2": { - "frame": { "x": 24, "y": 167, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "982_3": { - "frame": { "x": 90, "y": 166, "w": 22, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 2, "w": 22, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_1": { - "frame": { "x": 66, "y": 144, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_2": { - "frame": { "x": 295, "y": 159, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "987_3": { - "frame": { "x": 0, "y": 166, "w": 24, "h": 24 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 10, "y": 4, "w": 24, "h": 24 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "988_2": { - "frame": { "x": 137, "y": 84, "w": 26, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "988_3": { - "frame": { "x": 269, "y": 60, "w": 26, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 26, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "993_2": { - "frame": { "x": 167, "y": 59, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "993_3": { - "frame": { "x": 137, "y": 59, "w": 30, "h": 25 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 6, "y": 2, "w": 30, "h": 25 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "994_2": { - "frame": { "x": 242, "y": 58, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "994_3": { - "frame": { "x": 215, "y": 58, "w": 27, "h": 28 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 1, "w": 27, "h": 28 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "995_2": { - "frame": { "x": 110, "y": 58, "w": 27, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "995_3": { - "frame": { "x": 83, "y": 58, "w": 27, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 8, "y": 0, "w": 27, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "996_2": { - "frame": { "x": 138, "y": 247, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "996_3": { - "frame": { "x": 249, "y": 248, "w": 15, "h": 16 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 12, "y": 12, "w": 15, "h": 16 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "997_2": { - "frame": { "x": 146, "y": 208, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "997_3": { - "frame": { "x": 0, "y": 213, "w": 21, "h": 19 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 9, "w": 21, "h": 19 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "998_2": { - "frame": { "x": 163, "y": 109, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "998_3": { - "frame": { "x": 0, "y": 88, "w": 25, "h": 26 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 7, "y": 2, "w": 25, "h": 26 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_1": { - "frame": { "x": 274, "y": 130, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_2": { - "frame": { "x": 71, "y": 115, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - }, - "999_3": { - "frame": { "x": 0, "y": 114, "w": 22, "h": 29 }, - "rotated": false, - "trimmed": true, - "spriteSourceSize": { "x": 9, "y": 0, "w": 22, "h": 29 }, - "sourceSize": { "w": 40, "h": 30 } - } - }, - "meta": { - "app": "https://www.aseprite.org/", - "version": "1.3.7-dev", - "image": "pokemon_icons_9v.png", - "format": "RGBA8888", - "size": { "w": 320, "h": 277 }, - "scale": "1" - } +{ + "textures": [ + { + "image": "pokemon_icons_9v.png", + "format": "RGBA8888", + "size": { + "w": 450, + "h": 450 + }, + "scale": 1, + "frames": [ + { + "filename": "909_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "909_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "910_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "910_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "911_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "911_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "912_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "912_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "913_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "913_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "914_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 0, + "w": 40, + "h": 30 + } + }, + { + "filename": "914_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "919_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "920_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "924_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 30, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-four_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "925-three_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "932_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "932_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "933_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "933_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "934_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "934_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 60, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "935_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "936_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "937_9", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "940_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 90, + "w": 40, + "h": 30 + } + }, + { + "filename": "940_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "941_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "941_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "944_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "944_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "945_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "945_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "948_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "948_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "949_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "949_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 120, + "w": 40, + "h": 30 + } + }, + { + "filename": "951_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "951_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "952_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "952_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "953_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "953_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "954_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "954_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "957_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 150, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "958_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "959_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "962_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "967_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "967_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 180, + "w": 40, + "h": 30 + } + }, + { + "filename": "968_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "968_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "969_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "969_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "970_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "970_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "973_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "974_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "974_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 210, + "w": 40, + "h": 30 + } + }, + { + "filename": "975_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "975_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-curly_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-curly_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-droopy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-droopy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-stretchy_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "978-stretchy_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "979_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 240, + "w": 40, + "h": 30 + } + }, + { + "filename": "981_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "981_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982-three-segment_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982-three-segment_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "982_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "987_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "988_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "988_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 270, + "w": 40, + "h": 30 + } + }, + { + "filename": "993_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "993_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "994_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "994_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "995_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "995_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "996_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "996_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "997_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "997_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "998_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 300, + "w": 40, + "h": 30 + } + }, + { + "filename": "998_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "999_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1000_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1001_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1001_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1003_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1003_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 330, + "w": 40, + "h": 30 + } + }, + { + "filename": "1004_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1004_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1006_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1006_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1007-apex-build_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1007-apex-build_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1008-ultimate-mode_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1010_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1010_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 360, + "w": 40, + "h": 30 + } + }, + { + "filename": "1012-counterfeit_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1012-counterfeit_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1013-unremarkable_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 80, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1013-unremarkable_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 120, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1018_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 160, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1018_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 200, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1022_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 240, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1022_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 280, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1023_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 320, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "1023_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 360, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_1", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 400, + "y": 390, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_2", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 0, + "y": 420, + "w": 40, + "h": 30 + } + }, + { + "filename": "8901_3", + "rotated": false, + "trimmed": false, + "sourceSize": { + "w": 40, + "h": 30 + }, + "spriteSourceSize": { + "x": 0, + "y": 0, + "w": 40, + "h": 30 + }, + "frame": { + "x": 40, + "y": 420, + "w": 40, + "h": 30 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:c13ec323095f727665fa953e64e98300:e7531bea9b5e1bef44def5b357c81630:3ec5c0bc286c296cfb7fa30a8b06f3da$" + } } diff --git a/public/images/pokemon_icons_9v.png b/public/images/pokemon_icons_9v.png index 5d0908d0590..f71b6c5ada5 100644 Binary files a/public/images/pokemon_icons_9v.png and b/public/images/pokemon_icons_9v.png differ diff --git a/public/images/statuses_es.json b/public/images/statuses_es-ES.json similarity index 98% rename from public/images/statuses_es.json rename to public/images/statuses_es-ES.json index 4b44aa117e4..dbb3783842a 100644 --- a/public/images/statuses_es.json +++ b/public/images/statuses_es-ES.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "statuses_es.png", + "image": "statuses_es-ES.png", "format": "RGBA8888", "size": { "w": 22, diff --git a/public/images/statuses_es.png b/public/images/statuses_es-ES.png similarity index 100% rename from public/images/statuses_es.png rename to public/images/statuses_es-ES.png diff --git a/public/images/trainer/future_self_f.json b/public/images/trainer/future_self_f.json new file mode 100644 index 00000000000..0831828c2bc --- /dev/null +++ b/public/images/trainer/future_self_f.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "future_self_f.png", + "format": "RGBA8888", + "size": { + "w": 29, + "h": 69 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 69, + "h": 69 + }, + "spriteSourceSize": { + "x": 21, + "y": 0, + "w": 29, + "h": 69 + }, + "frame": { + "x": 0, + "y": 0, + "w": 29, + "h": 69 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:4eb16332c2e77886e4e621b62269f05e:26f1bc53c853efdbe228d67604b95b54:d25525a5db42bd57d2afe4b6e3081ee1$" + } +} diff --git a/public/images/trainer/future_self_f.png b/public/images/trainer/future_self_f.png new file mode 100644 index 00000000000..e75c5e5e65b Binary files /dev/null and b/public/images/trainer/future_self_f.png differ diff --git a/public/images/trainer/future_self_m.json b/public/images/trainer/future_self_m.json new file mode 100644 index 00000000000..f5d60ff5add --- /dev/null +++ b/public/images/trainer/future_self_m.json @@ -0,0 +1,41 @@ +{ + "textures": [ + { + "image": "future_self_m.png", + "format": "RGBA8888", + "size": { + "w": 36, + "h": 73 + }, + "scale": 1, + "frames": [ + { + "filename": "0001.png", + "rotated": false, + "trimmed": true, + "sourceSize": { + "w": 73, + "h": 73 + }, + "spriteSourceSize": { + "x": 18, + "y": 0, + "w": 36, + "h": 73 + }, + "frame": { + "x": 0, + "y": 0, + "w": 36, + "h": 73 + } + } + ] + } + ], + "meta": { + "app": "https://www.codeandweb.com/texturepacker", + "version": "3.0", + "smartupdate": "$TexturePacker:SmartUpdate:0d8d68d06ae75bc93d72b54183a9df02:d3d509801da9ff5c0bd4793a05ece391:83c4b8c2ed25ea7d9795bec5c40c8602$" + } +} diff --git a/public/images/trainer/future_self_m.png b/public/images/trainer/future_self_m.png new file mode 100644 index 00000000000..edd15cb6ea3 Binary files /dev/null and b/public/images/trainer/future_self_m.png differ diff --git a/public/images/types_es.json b/public/images/types_es-ES.json similarity index 99% rename from public/images/types_es.json rename to public/images/types_es-ES.json index 0fb922e8939..198899c0f12 100644 --- a/public/images/types_es.json +++ b/public/images/types_es-ES.json @@ -1,7 +1,7 @@ { "textures": [ { - "image": "types_es.png", + "image": "types_es-ES.png", "format": "RGBA8888", "size": { "w": 32, diff --git a/public/images/types_es.png b/public/images/types_es-ES.png similarity index 100% rename from public/images/types_es.png rename to public/images/types_es-ES.png diff --git a/public/images/ui/legacy/link_icon.png b/public/images/ui/legacy/link_icon.png new file mode 100644 index 00000000000..56081261b9c Binary files /dev/null and b/public/images/ui/legacy/link_icon.png differ diff --git a/public/images/ui/legacy/unlink_icon.png b/public/images/ui/legacy/unlink_icon.png new file mode 100644 index 00000000000..f0da5f8e3ed Binary files /dev/null and b/public/images/ui/legacy/unlink_icon.png differ diff --git a/public/images/ui/link_icon.png b/public/images/ui/link_icon.png new file mode 100644 index 00000000000..56081261b9c Binary files /dev/null and b/public/images/ui/link_icon.png differ diff --git a/public/images/ui/unlink_icon.png b/public/images/ui/unlink_icon.png new file mode 100644 index 00000000000..f0da5f8e3ed Binary files /dev/null and b/public/images/ui/unlink_icon.png differ diff --git a/src/battle-scene.ts b/src/battle-scene.ts index c6fff1e209a..3c561206abe 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -86,7 +86,7 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; import MysteryEncounter from "#app/data/mystery-encounters/mystery-encounter"; -import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome, WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; +import { allMysteryEncounters, ANTI_VARIANCE_WEIGHT_MODIFIER, AVERAGE_ENCOUNTERS_PER_RUN_TARGET, BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT, MYSTERY_ENCOUNTER_SPAWN_MAX_WEIGHT, mysteryEncountersByBiome } from "#app/data/mystery-encounters/mystery-encounters"; import { MysteryEncounterSaveData } from "#app/data/mystery-encounters/mystery-encounter-save-data"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; @@ -323,6 +323,7 @@ export default class BattleScene extends SceneBase { this.conditionalQueue = []; this.phaseQueuePrependSpliceIndex = -1; this.nextCommandPhaseQueue = []; + this.eventManager = new TimedEventManager(); this.updateGameInfo(); } @@ -378,7 +379,6 @@ export default class BattleScene extends SceneBase { this.fieldSpritePipeline = new FieldSpritePipeline(this.game); (this.renderer as Phaser.Renderer.WebGL.WebGLRenderer).pipelines.add("FieldSprite", this.fieldSpritePipeline); - this.eventManager = new TimedEventManager(); this.launchBattle(); } @@ -1191,10 +1191,7 @@ export default class BattleScene extends SceneBase { if (trainerConfigs[trainerType].doubleOnly) { doubleTrainer = true; } else if (trainerConfigs[trainerType].hasDouble) { - const doubleChance = new Utils.IntegerHolder(newWaveIndex % 10 === 0 ? 32 : 8); - this.applyModifiers(DoubleBattleChanceBoosterModifier, true, doubleChance); - playerField.forEach(p => applyAbAttrs(DoubleBattleChanceAbAttr, p, null, false, doubleChance)); - doubleTrainer = !Utils.randSeedInt(doubleChance.value); + doubleTrainer = !Utils.randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance if (trainerConfigs[trainerType].trainerTypeDouble && ![ TrainerType.TATE, TrainerType.LIZA ].includes(trainerType)) { doubleTrainer = false; @@ -1207,12 +1204,10 @@ export default class BattleScene extends SceneBase { // Check for mystery encounter // Can only occur in place of a standard (non-boss) wild battle, waves 10-180 - if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex, mysteryEncounterType) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { + if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { newBattleType = BattleType.MYSTERY_ENCOUNTER; - // Reset base spawn weight + // Reset to base spawn weight this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; - } else if (newBattleType === BattleType.WILD) { - this.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; } } @@ -1359,69 +1354,69 @@ export default class BattleScene extends SceneBase { } switch (species.speciesId) { - case Species.UNOWN: - case Species.SHELLOS: - case Species.GASTRODON: - case Species.BASCULIN: - case Species.DEERLING: - case Species.SAWSBUCK: - case Species.FROAKIE: - case Species.FROGADIER: - case Species.SCATTERBUG: - case Species.SPEWPA: - case Species.VIVILLON: - case Species.FLABEBE: - case Species.FLOETTE: - case Species.FLORGES: - case Species.FURFROU: - case Species.PUMPKABOO: - case Species.GOURGEIST: - case Species.ORICORIO: - case Species.MAGEARNA: - case Species.ZARUDE: - case Species.SQUAWKABILLY: - case Species.TATSUGIRI: - case Species.PALDEA_TAUROS: - return Utils.randSeedInt(species.forms.length); - case Species.PIKACHU: - return Utils.randSeedInt(8); - case Species.EEVEE: - return Utils.randSeedInt(2); - case Species.GRENINJA: - return Utils.randSeedInt(2); - case Species.ZYGARDE: - return Utils.randSeedInt(4); - case Species.MINIOR: - return Utils.randSeedInt(6); - case Species.ALCREMIE: - return Utils.randSeedInt(9); - case Species.MEOWSTIC: - case Species.INDEEDEE: - case Species.BASCULEGION: - case Species.OINKOLOGNE: - return gender === Gender.FEMALE ? 1 : 0; - case Species.TOXTRICITY: - const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; - if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { - return 1; - } - return 0; - case Species.GIMMIGHOUL: - // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs - if (this.gameMode.hasMysteryEncounters) { - return 1; // Wandering form - } else { + case Species.UNOWN: + case Species.SHELLOS: + case Species.GASTRODON: + case Species.BASCULIN: + case Species.DEERLING: + case Species.SAWSBUCK: + case Species.FROAKIE: + case Species.FROGADIER: + case Species.SCATTERBUG: + case Species.SPEWPA: + case Species.VIVILLON: + case Species.FLABEBE: + case Species.FLOETTE: + case Species.FLORGES: + case Species.FURFROU: + case Species.PUMPKABOO: + case Species.GOURGEIST: + case Species.ORICORIO: + case Species.MAGEARNA: + case Species.ZARUDE: + case Species.SQUAWKABILLY: + case Species.TATSUGIRI: + case Species.PALDEA_TAUROS: return Utils.randSeedInt(species.forms.length); - } + case Species.PIKACHU: + return Utils.randSeedInt(8); + case Species.EEVEE: + return Utils.randSeedInt(2); + case Species.GRENINJA: + return Utils.randSeedInt(2); + case Species.ZYGARDE: + return Utils.randSeedInt(4); + case Species.MINIOR: + return Utils.randSeedInt(7); + case Species.ALCREMIE: + return Utils.randSeedInt(9); + case Species.MEOWSTIC: + case Species.INDEEDEE: + case Species.BASCULEGION: + case Species.OINKOLOGNE: + return gender === Gender.FEMALE ? 1 : 0; + case Species.TOXTRICITY: + const lowkeyNatures = [ Nature.LONELY, Nature.BOLD, Nature.RELAXED, Nature.TIMID, Nature.SERIOUS, Nature.MODEST, Nature.MILD, Nature.QUIET, Nature.BASHFUL, Nature.CALM, Nature.GENTLE, Nature.CAREFUL ]; + if (nature !== undefined && lowkeyNatures.indexOf(nature) > -1) { + return 1; + } + return 0; + case Species.GIMMIGHOUL: + // Chest form can only be found in Mysterious Chest Encounter, if this is a game mode with MEs + if (this.gameMode.hasMysteryEncounters) { + return 1; // Wandering form + } else { + return Utils.randSeedInt(species.forms.length); + } } if (ignoreArena) { switch (species.speciesId) { - case Species.BURMY: - case Species.WORMADAM: - case Species.ROTOM: - case Species.LYCANROC: - return Utils.randSeedInt(species.forms.length); + case Species.BURMY: + case Species.WORMADAM: + case Species.ROTOM: + case Species.LYCANROC: + return Utils.randSeedInt(species.forms.length); } return 0; } @@ -1886,17 +1881,17 @@ export default class BattleScene extends SceneBase { const soundDetails = sound.key.split("/"); switch (soundDetails[0]) { - case "battle_anims": - case "cry": - if (soundDetails[1].startsWith("PRSFX- ")) { - sound.setVolume(this.masterVolume * this.fieldVolume * 0.5); - } else { - sound.setVolume(this.masterVolume * this.fieldVolume); - } - break; - case "se": - case "ui": - sound.setVolume(this.masterVolume * this.seVolume); + case "battle_anims": + case "cry": + if (soundDetails[1].startsWith("PRSFX- ")) { + sound.setVolume(this.masterVolume * this.fieldVolume * 0.5); + } else { + sound.setVolume(this.masterVolume * this.fieldVolume); + } + break; + case "se": + case "ui": + sound.setVolume(this.masterVolume * this.seVolume); } } } @@ -1936,31 +1931,31 @@ export default class BattleScene extends SceneBase { const keyDetails = key.split("/"); config["volume"] = config["volume"] ?? 1; switch (keyDetails[0]) { - case "level_up_fanfare": - case "item_fanfare": - case "minor_fanfare": - case "heal": - case "evolution": - case "evolution_fanfare": + case "level_up_fanfare": + case "item_fanfare": + case "minor_fanfare": + case "heal": + case "evolution": + case "evolution_fanfare": // These sounds are loaded in as BGM, but played as sound effects // When these sounds are updated in updateVolume(), they are treated as BGM however because they are placed in the BGM Cache through being called by playSoundWithoutBGM() - config["volume"] *= (this.masterVolume * this.bgmVolume); - break; - case "battle_anims": - case "cry": - config["volume"] *= (this.masterVolume * this.fieldVolume); - //PRSFX sound files are unusually loud - if (keyDetails[1].startsWith("PRSFX- ")) { - config["volume"] *= 0.5; - } - break; - case "ui": + config["volume"] *= (this.masterVolume * this.bgmVolume); + break; + case "battle_anims": + case "cry": + config["volume"] *= (this.masterVolume * this.fieldVolume); + //PRSFX sound files are unusually loud + if (keyDetails[1].startsWith("PRSFX- ")) { + config["volume"] *= 0.5; + } + break; + case "ui": //As of, right now this applies to the "select", "menu_open", "error" sound effects - config["volume"] *= (this.masterVolume * this.uiVolume); - break; - case "se": - config["volume"] *= (this.masterVolume * this.seVolume); - break; + config["volume"] *= (this.masterVolume * this.uiVolume); + break; + case "se": + config["volume"] *= (this.masterVolume * this.seVolume); + break; } this.sound.play(key, config); return this.sound.get(key) as AnySound; @@ -1989,208 +1984,208 @@ export default class BattleScene extends SceneBase { getBgmLoopPoint(bgmName: string): number { switch (bgmName) { - case "battle_kanto_champion": //B2W2 Kanto Champion Battle - return 13.950; - case "battle_johto_champion": //B2W2 Johto Champion Battle - return 23.498; - case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle - return 11.328; - case "battle_hoenn_champion_g6": //ORAS Hoenn Champion Battle - return 11.762; - case "battle_sinnoh_champion": //B2W2 Sinnoh Champion Battle - return 12.235; - case "battle_champion_alder": //BW Unova Champion Battle - return 27.653; - case "battle_champion_iris": //B2W2 Unova Champion Battle - return 10.145; - case "battle_kalos_champion": //XY Kalos Champion Battle - return 10.380; - case "battle_alola_champion": //USUM Alola Champion Battle - return 13.025; - case "battle_galar_champion": //SWSH Galar Champion Battle - return 61.635; - case "battle_champion_geeta": //SV Champion Geeta Battle - return 37.447; - case "battle_champion_nemona": //SV Champion Nemona Battle - return 14.914; - case "battle_champion_kieran": //SV Champion Kieran Battle - return 7.206; - case "battle_hoenn_elite": //ORAS Elite Four Battle - return 11.350; - case "battle_unova_elite": //BW Elite Four Battle - return 17.730; - case "battle_kalos_elite": //XY Elite Four Battle - return 12.340; - case "battle_alola_elite": //SM Elite Four Battle - return 19.212; - case "battle_galar_elite": //SWSH League Tournament Battle - return 164.069; - case "battle_paldea_elite": //SV Elite Four Battle - return 12.770; - case "battle_bb_elite": //SV BB League Elite Four Battle - return 19.434; - case "battle_final_encounter": //PMD RTDX Rayquaza's Domain - return 19.159; - case "battle_final": //BW Ghetsis Battle - return 16.453; - case "battle_kanto_gym": //B2W2 Kanto Gym Battle - return 13.857; - case "battle_johto_gym": //B2W2 Johto Gym Battle - return 12.911; - case "battle_hoenn_gym": //B2W2 Hoenn Gym Battle - return 12.379; - case "battle_sinnoh_gym": //B2W2 Sinnoh Gym Battle - return 13.122; - case "battle_unova_gym": //BW Unova Gym Battle - return 19.145; - case "battle_kalos_gym": //XY Kalos Gym Battle - return 44.810; - case "battle_galar_gym": //SWSH Galar Gym Battle - return 171.262; - case "battle_paldea_gym": //SV Paldea Gym Battle - return 127.489; - case "battle_legendary_kanto": //XY Kanto Legendary Battle - return 32.966; - case "battle_legendary_raikou": //HGSS Raikou Battle - return 12.632; - case "battle_legendary_entei": //HGSS Entei Battle - return 2.905; - case "battle_legendary_suicune": //HGSS Suicune Battle - return 12.636; - case "battle_legendary_lugia": //HGSS Lugia Battle - return 19.770; - case "battle_legendary_ho_oh": //HGSS Ho-oh Battle - return 17.668; - case "battle_legendary_regis_g5": //B2W2 Legendary Titan Battle - return 49.500; - case "battle_legendary_regis_g6": //ORAS Legendary Titan Battle - return 21.130; - case "battle_legendary_gro_kyo": //ORAS Groudon & Kyogre Battle - return 10.547; - case "battle_legendary_rayquaza": //ORAS Rayquaza Battle - return 10.495; - case "battle_legendary_deoxys": //ORAS Deoxys Battle - return 13.333; - case "battle_legendary_lake_trio": //ORAS Lake Guardians Battle - return 16.887; - case "battle_legendary_sinnoh": //ORAS Sinnoh Legendary Battle - return 22.770; - case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle - return 16.009; - case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle - return 18.961; - case "battle_legendary_giratina": //ORAS Giratina Battle - return 10.451; - case "battle_legendary_arceus": //HGSS Arceus Battle - return 9.595; - case "battle_legendary_unova": //BW Unova Legendary Battle - return 13.855; - case "battle_legendary_kyurem": //BW Kyurem Battle - return 18.314; - case "battle_legendary_res_zek": //BW Reshiram & Zekrom Battle - return 18.329; - case "battle_legendary_xern_yvel": //XY Xerneas & Yveltal Battle - return 26.468; - case "battle_legendary_tapu": //SM Tapu Battle - return 0.000; - case "battle_legendary_sol_lun": //SM Solgaleo & Lunala Battle - return 6.525; - case "battle_legendary_ub": //SM Ultra Beast Battle - return 9.818; - case "battle_legendary_dusk_dawn": //USUM Dusk Mane & Dawn Wings Necrozma Battle - return 5.211; - case "battle_legendary_ultra_nec": //USUM Ultra Necrozma Battle - return 10.344; - case "battle_legendary_zac_zam": //SWSH Zacian & Zamazenta Battle - return 11.424; - case "battle_legendary_glas_spec": //SWSH Glastrier & Spectrier Battle - return 12.503; - case "battle_legendary_calyrex": //SWSH Calyrex Battle - return 50.641; - case "battle_legendary_riders": //SWSH Ice & Shadow Rider Calyrex Battle - return 18.155; - case "battle_legendary_birds_galar": //SWSH Galarian Legendary Birds Battle - 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 - return 14.335; - case "battle_legendary_terapagos": //SV Terapagos Battle - return 24.377; - case "battle_legendary_pecharunt": //SV Pecharunt Battle - return 6.508; - case "battle_rival": //BW Rival Battle - return 14.110; - case "battle_rival_2": //BW N Battle - return 17.714; - case "battle_rival_3": //BW Final N Battle - return 17.586; - case "battle_trainer": //BW Trainer Battle - return 13.686; - case "battle_wild": //BW Wild Battle - return 12.703; - case "battle_wild_strong": //BW Strong Wild Battle - 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_aether_grunt": // SM Aether Foundation Battle - return 16.00; - case "battle_skull_grunt": // SM Team Skull Battle - return 20.87; - case "battle_macro_grunt": // SWSH Trainer Battle - return 11.56; - case "battle_star_grunt": //SV Team Star Battle - return 133.362; - case "battle_galactic_admin": //BDSP Team Galactic Admin Battle - return 11.997; - case "battle_skull_admin": //SM Team Skull Admin Battle - return 15.463; - case "battle_oleana": //SWSH Oleana Battle - return 14.110; - case "battle_star_admin": //SV Team Star Boss Battle - return 9.493; - 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; - case "battle_aether_boss": //SM Lusamine Battle - return 11.33; - case "battle_skull_boss": //SM Guzma Battle - return 13.13; - case "battle_macro_boss": //SWSH Rose Battle - return 11.42; - case "battle_star_boss": //SV Cassiopeia Battle - return 25.764; - case "mystery_encounter_gen_5_gts": // BW GTS - return 8.52; - case "mystery_encounter_gen_6_gts": // XY GTS - return 9.24; - case "mystery_encounter_fun_and_games": // EoS Guildmaster Wigglytuff - return 4.78; - case "mystery_encounter_weird_dream": // EoS Temporal Spire - return 41.42; - case "mystery_encounter_delibirdy": // Firel Delibirdy - return 82.28; + case "battle_kanto_champion": //B2W2 Kanto Champion Battle + return 13.950; + case "battle_johto_champion": //B2W2 Johto Champion Battle + return 23.498; + case "battle_hoenn_champion_g5": //B2W2 Hoenn Champion Battle + return 11.328; + case "battle_hoenn_champion_g6": //ORAS Hoenn Champion Battle + return 11.762; + case "battle_sinnoh_champion": //B2W2 Sinnoh Champion Battle + return 12.235; + case "battle_champion_alder": //BW Unova Champion Battle + return 27.653; + case "battle_champion_iris": //B2W2 Unova Champion Battle + return 10.145; + case "battle_kalos_champion": //XY Kalos Champion Battle + return 10.380; + case "battle_alola_champion": //USUM Alola Champion Battle + return 13.025; + case "battle_galar_champion": //SWSH Galar Champion Battle + return 61.635; + case "battle_champion_geeta": //SV Champion Geeta Battle + return 37.447; + case "battle_champion_nemona": //SV Champion Nemona Battle + return 14.914; + case "battle_champion_kieran": //SV Champion Kieran Battle + return 7.206; + case "battle_hoenn_elite": //ORAS Elite Four Battle + return 11.350; + case "battle_unova_elite": //BW Elite Four Battle + return 17.730; + case "battle_kalos_elite": //XY Elite Four Battle + return 12.340; + case "battle_alola_elite": //SM Elite Four Battle + return 19.212; + case "battle_galar_elite": //SWSH League Tournament Battle + return 164.069; + case "battle_paldea_elite": //SV Elite Four Battle + return 12.770; + case "battle_bb_elite": //SV BB League Elite Four Battle + return 19.434; + case "battle_final_encounter": //PMD RTDX Rayquaza's Domain + return 19.159; + case "battle_final": //BW Ghetsis Battle + return 16.453; + case "battle_kanto_gym": //B2W2 Kanto Gym Battle + return 13.857; + case "battle_johto_gym": //B2W2 Johto Gym Battle + return 12.911; + case "battle_hoenn_gym": //B2W2 Hoenn Gym Battle + return 12.379; + case "battle_sinnoh_gym": //B2W2 Sinnoh Gym Battle + return 13.122; + case "battle_unova_gym": //BW Unova Gym Battle + return 19.145; + case "battle_kalos_gym": //XY Kalos Gym Battle + return 44.810; + case "battle_galar_gym": //SWSH Galar Gym Battle + return 171.262; + case "battle_paldea_gym": //SV Paldea Gym Battle + return 127.489; + case "battle_legendary_kanto": //XY Kanto Legendary Battle + return 32.966; + case "battle_legendary_raikou": //HGSS Raikou Battle + return 12.632; + case "battle_legendary_entei": //HGSS Entei Battle + return 2.905; + case "battle_legendary_suicune": //HGSS Suicune Battle + return 12.636; + case "battle_legendary_lugia": //HGSS Lugia Battle + return 19.770; + case "battle_legendary_ho_oh": //HGSS Ho-oh Battle + return 17.668; + case "battle_legendary_regis_g5": //B2W2 Legendary Titan Battle + return 49.500; + case "battle_legendary_regis_g6": //ORAS Legendary Titan Battle + return 21.130; + case "battle_legendary_gro_kyo": //ORAS Groudon & Kyogre Battle + return 10.547; + case "battle_legendary_rayquaza": //ORAS Rayquaza Battle + return 10.495; + case "battle_legendary_deoxys": //ORAS Deoxys Battle + return 13.333; + case "battle_legendary_lake_trio": //ORAS Lake Guardians Battle + return 16.887; + case "battle_legendary_sinnoh": //ORAS Sinnoh Legendary Battle + return 22.770; + case "battle_legendary_dia_pal": //ORAS Dialga & Palkia Battle + return 16.009; + case "battle_legendary_origin_forme": //LA Origin Dialga & Palkia Battle + return 18.961; + case "battle_legendary_giratina": //ORAS Giratina Battle + return 10.451; + case "battle_legendary_arceus": //HGSS Arceus Battle + return 9.595; + case "battle_legendary_unova": //BW Unova Legendary Battle + return 13.855; + case "battle_legendary_kyurem": //BW Kyurem Battle + return 18.314; + case "battle_legendary_res_zek": //BW Reshiram & Zekrom Battle + return 18.329; + case "battle_legendary_xern_yvel": //XY Xerneas & Yveltal Battle + return 26.468; + case "battle_legendary_tapu": //SM Tapu Battle + return 0.000; + case "battle_legendary_sol_lun": //SM Solgaleo & Lunala Battle + return 6.525; + case "battle_legendary_ub": //SM Ultra Beast Battle + return 9.818; + case "battle_legendary_dusk_dawn": //USUM Dusk Mane & Dawn Wings Necrozma Battle + return 5.211; + case "battle_legendary_ultra_nec": //USUM Ultra Necrozma Battle + return 10.344; + case "battle_legendary_zac_zam": //SWSH Zacian & Zamazenta Battle + return 11.424; + case "battle_legendary_glas_spec": //SWSH Glastrier & Spectrier Battle + return 12.503; + case "battle_legendary_calyrex": //SWSH Calyrex Battle + return 50.641; + case "battle_legendary_riders": //SWSH Ice & Shadow Rider Calyrex Battle + return 18.155; + case "battle_legendary_birds_galar": //SWSH Galarian Legendary Birds Battle + 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 + return 14.335; + case "battle_legendary_terapagos": //SV Terapagos Battle + return 24.377; + case "battle_legendary_pecharunt": //SV Pecharunt Battle + return 6.508; + case "battle_rival": //BW Rival Battle + return 14.110; + case "battle_rival_2": //BW N Battle + return 17.714; + case "battle_rival_3": //BW Final N Battle + return 17.586; + case "battle_trainer": //BW Trainer Battle + return 13.686; + case "battle_wild": //BW Wild Battle + return 12.703; + case "battle_wild_strong": //BW Strong Wild Battle + 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_aether_grunt": // SM Aether Foundation Battle + return 16.00; + case "battle_skull_grunt": // SM Team Skull Battle + return 20.87; + case "battle_macro_grunt": // SWSH Trainer Battle + return 11.56; + case "battle_star_grunt": //SV Team Star Battle + return 133.362; + case "battle_galactic_admin": //BDSP Team Galactic Admin Battle + return 11.997; + case "battle_skull_admin": //SM Team Skull Admin Battle + return 15.463; + case "battle_oleana": //SWSH Oleana Battle + return 14.110; + case "battle_star_admin": //SV Team Star Boss Battle + return 9.493; + 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; + case "battle_aether_boss": //SM Lusamine Battle + return 11.33; + case "battle_skull_boss": //SM Guzma Battle + return 13.13; + case "battle_macro_boss": //SWSH Rose Battle + return 11.42; + case "battle_star_boss": //SV Cassiopeia Battle + return 25.764; + case "mystery_encounter_gen_5_gts": // BW GTS + return 8.52; + case "mystery_encounter_gen_6_gts": // XY GTS + return 9.24; + case "mystery_encounter_fun_and_games": // EoS Guildmaster Wigglytuff + return 4.78; + case "mystery_encounter_weird_dream": // EoS Temporal Spire + return 41.42; + case "mystery_encounter_delibirdy": // Firel Delibirdy + return 82.28; } return 0; @@ -2364,6 +2359,19 @@ export default class BattleScene extends SceneBase { return false; } + /** + * Will search for a specific phase in {@linkcode phaseQueuePrepend} via filter, and remove the first result if a match is found. + * @param phaseFilter filter function + */ + tryRemoveUnshiftedPhase(phaseFilter: (phase: Phase) => boolean): boolean { + const phaseIndex = this.phaseQueuePrepend.findIndex(phaseFilter); + if (phaseIndex > -1) { + this.phaseQueuePrepend.splice(phaseIndex, 1); + return true; + } + return false; + } + /** * Tries to add the input phase to index before target phase in the phaseQueue, else simply calls unshiftPhase() * @param phase {@linkcode Phase} the phase to be added @@ -3125,18 +3133,26 @@ export default class BattleScene extends SceneBase { } } + /** + * Returns if a wave COULD spawn a {@linkcode MysteryEncounter}. + * Even if returns `true`, does not guarantee that a wave will actually be a ME. + * That check is made in {@linkcode BattleScene.isWaveMysteryEncounter} instead. + */ + isMysteryEncounterValidForWave(battleType: BattleType, waveIndex: number): boolean { + const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); + return this.gameMode.hasMysteryEncounters && battleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave; + } + /** * Determines whether a wave should randomly generate a {@linkcode MysteryEncounter}. * Currently, the only modes that MEs are allowed in are Classic and Challenge. * Additionally, MEs cannot spawn outside of waves 10-180 in those modes - * * @param newBattleType * @param waveIndex - * @param sessionDataEncounterType */ - private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number, sessionDataEncounterType?: MysteryEncounterType): boolean { + private isWaveMysteryEncounter(newBattleType: BattleType, waveIndex: number): boolean { const [ lowestMysteryEncounterWave, highestMysteryEncounterWave ] = this.gameMode.getMysteryEncounterLegalWaves(); - if (this.gameMode.hasMysteryEncounters && newBattleType === BattleType.WILD && !this.gameMode.isBoss(waveIndex) && waveIndex < highestMysteryEncounterWave && waveIndex > lowestMysteryEncounterWave) { + if (this.isMysteryEncounterValidForWave(newBattleType, waveIndex)) { // Base spawn weight is BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT/256, and increases by WEIGHT_INCREMENT_ON_SPAWN_MISS/256 for each missed attempt at spawning an encounter on a valid floor const sessionEncounterRate = this.mysteryEncounterSaveData.encounterSpawnChance; const encounteredEvents = this.mysteryEncounterSaveData.encounteredEvents; diff --git a/src/data/ability.ts b/src/data/ability.ts index 5d2ccfc9d36..87f9e89e534 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1,4 +1,4 @@ -import Pokemon, { HitResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; +import Pokemon, { EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove } from "../field/pokemon"; import { Type } from "./type"; import { Constructor } from "#app/utils"; import * as Utils from "../utils"; @@ -7,9 +7,9 @@ import { Weather, WeatherType } from "./weather"; 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, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; +import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move"; import { ArenaTagSide, ArenaTrapTag } from "./arena-tag"; -import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier"; +import { BerryModifier, HitHealModifier, PokemonHeldItemModifier } from "../modifier/modifier"; import { TerrainType } from "./terrain"; import { SpeciesFormChangeManualTrigger, SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "./pokemon-forms"; import i18next from "i18next"; @@ -17,7 +17,7 @@ import { Localizable } from "#app/interfaces/locales"; import { Command } from "../ui/command-ui-handler"; import { BerryModifierType } from "#app/modifier/modifier-type"; import { getPokeballName } from "./pokeball"; -import { BattlerIndex } from "#app/battle"; +import { BattlerIndex, BattleType } from "#app/battle"; import { Abilities } from "#enums/abilities"; import { ArenaTagType } from "#enums/arena-tag-type"; import { BattlerTagType } from "#enums/battler-tag-type"; @@ -29,6 +29,12 @@ import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import BattleScene from "#app/battle-scene"; +import { SwitchType } from "#app/enums/switch-type"; +import { SwitchPhase } from "#app/phases/switch-phase"; +import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; +import { BattleEndPhase } from "#app/phases/battle-end-phase"; +import { NewBattlePhase } from "#app/phases/new-battle-phase"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; export class Ability implements Localizable { public id: Abilities; @@ -330,6 +336,30 @@ export class ReceivedMoveDamageMultiplierAbAttr extends PreDefendAbAttr { } } +/** + * Reduces the damage dealt to an allied Pokemon. Used by Friend Guard. + * @see {@linkcode applyPreDefend} + */ +export class AlliedFieldDamageReductionAbAttr extends PreDefendAbAttr { + private damageMultiplier: number; + + constructor(damageMultiplier: number) { + super(); + this.damageMultiplier = damageMultiplier; + } + + /** + * Handles the damage reduction + * @param args + * - `[0]` {@linkcode Utils.NumberHolder} - The damage being dealt + */ + override applyPreDefend(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _attacker: Pokemon, _move: Move, _cancelled: Utils.BooleanHolder, args: any[]): boolean { + const damage = args[0] as Utils.NumberHolder; + damage.value = Utils.toDmgValue(damage.value * this.damageMultiplier); + return true; + } +} + export class ReceivedTypeDamageMultiplierAbAttr extends ReceivedMoveDamageMultiplierAbAttr { constructor(moveType: Type, damageMultiplier: number) { super((target, user, move) => user.getMoveType(move) === moveType, damageMultiplier); @@ -1139,7 +1169,9 @@ export class MoveEffectChanceMultiplierAbAttr extends AbAttr { apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { // Disable showAbility during getTargetBenefitScore this.showAbility = args[4]; - if ((args[0] as Utils.NumberHolder).value <= 0 || (args[1] as Move).id === Moves.ORDER_UP) { + + const exceptMoves = [ Moves.ORDER_UP, Moves.ELECTRO_SHOT ]; + if ((args[0] as Utils.NumberHolder).value <= 0 || exceptMoves.includes((args[1] as Move).id)) { return false; } @@ -1329,7 +1361,6 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { */ const exceptAttrs: Constructor[] = [ MultiHitAttr, - ChargeAttr, SacrificialAttr, SacrificialAttrOnHit ]; @@ -1345,6 +1376,7 @@ export class AddSecondStrikeAbAttr extends PreAttackAbAttr { /** Also check if this move is an Attack move and if it's only targeting one Pokemon */ return numTargets === 1 + && !move.isChargingMove() && !exceptAttrs.some(attr => move.hasAttr(attr)) && !exceptMoves.some(id => move.id === id) && move.category !== MoveCategory.STATUS; @@ -2420,11 +2452,12 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { super(true); } - applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { + async applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): Promise { const targets = pokemon.getOpponents(); if (simulated || !targets.length) { return simulated; } + const promises: Promise[] = []; let target: Pokemon; if (targets.length > 1) { @@ -2433,7 +2466,7 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { target = targets[0]; } - target = target!; // compiler doesn't know its guranteed to be defined + target = target!; pokemon.summonData.speciesForm = target.getSpeciesForm(); pokemon.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); pokemon.summonData.ability = target.getAbility().id; @@ -2450,18 +2483,26 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr { pokemon.setStatStage(s, target.getStatStage(s)); } - pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m?.moveId ?? Moves.NONE, m?.ppUsed, m?.ppUp)); - pokemon.summonData.types = target.getTypes(); - - - pokemon.scene.playSound("battle_anims/PRSFX- Transform"); - - pokemon.loadAssets(false).then(() => { - pokemon.playAnim(); - pokemon.updateInfo(); + pokemon.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Imposter: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); + } }); + pokemon.summonData.types = target.getTypes(); + promises.push(pokemon.updateInfo()); pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, })); + pokemon.scene.playSound("battle_anims/PRSFX- Transform"); + promises.push(pokemon.loadAssets(false).then(() => { + pokemon.playAnim(); + pokemon.updateInfo(); + })); + + await Promise.all(promises); return true; } @@ -2579,24 +2620,24 @@ export class PreSwitchOutClearWeatherAbAttr extends PreSwitchOutAbAttr { // Clear weather only if user's ability matches the weather and no other pokemon has the ability. switch (weatherType) { - case (WeatherType.HARSH_SUN): - if (pokemon.hasAbility(Abilities.DESOLATE_LAND) + case (WeatherType.HARSH_SUN): + if (pokemon.hasAbility(Abilities.DESOLATE_LAND) && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.HEAVY_RAIN): - if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) + turnOffWeather = true; + } + break; + case (WeatherType.HEAVY_RAIN): + if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.STRONG_WINDS): - if (pokemon.hasAbility(Abilities.DELTA_STREAM) + turnOffWeather = true; + } + break; + case (WeatherType.STRONG_WINDS): + if (pokemon.hasAbility(Abilities.DELTA_STREAM) && pokemon.scene.getField(true).filter(p => p !== pokemon).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { - turnOffWeather = true; - } - break; + turnOffWeather = true; + } + break; } if (simulated) { @@ -3057,7 +3098,7 @@ 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 + * Disables: Color Change, Pickpocket, Berserk, Anger Shell * @returns {AbAttrCondition} If false disables the ability which the condition is applied to. */ function getSheerForceHitDisableAbCondition(): AbAttrCondition { @@ -3579,22 +3620,19 @@ export class MoodyAbAttr extends PostTurnAbAttr { } } -export class PostTurnStatStageChangeAbAttr extends PostTurnAbAttr { - private stats: BattleStat[]; - private stages: number; +export class SpeedBoostAbAttr extends PostTurnAbAttr { - constructor(stats: BattleStat[], stages: number) { + constructor() { super(true); - - this.stats = Array.isArray(stats) - ? stats - : [ stats ]; - this.stages = stages; } applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean { if (!simulated) { - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages)); + if (!pokemon.turnData.switchedInThisTurn && !pokemon.turnData.failedRunAway) { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPD ], 1)); + } else { + return false; + } } return true; } @@ -4079,24 +4117,24 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr { // Clear weather only if user's ability matches the weather and no other pokemon has the ability. switch (weatherType) { - case (WeatherType.HARSH_SUN): - if (pokemon.hasAbility(Abilities.DESOLATE_LAND) + case (WeatherType.HARSH_SUN): + if (pokemon.hasAbility(Abilities.DESOLATE_LAND) && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DESOLATE_LAND)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.HEAVY_RAIN): - if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) + turnOffWeather = true; + } + break; + case (WeatherType.HEAVY_RAIN): + if (pokemon.hasAbility(Abilities.PRIMORDIAL_SEA) && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.PRIMORDIAL_SEA)).length === 0) { - turnOffWeather = true; - } - break; - case (WeatherType.STRONG_WINDS): - if (pokemon.hasAbility(Abilities.DELTA_STREAM) + turnOffWeather = true; + } + break; + case (WeatherType.STRONG_WINDS): + if (pokemon.hasAbility(Abilities.DELTA_STREAM) && pokemon.scene.getField(true).filter(p => p.hasAbility(Abilities.DELTA_STREAM)).length === 0) { - turnOffWeather = true; - } - break; + turnOffWeather = true; + } + break; } if (simulated) { @@ -4200,6 +4238,11 @@ export class RedirectTypeMoveAbAttr extends RedirectMoveAbAttr { export class BlockRedirectAbAttr extends AbAttr { } +/** + * Used by Early Bird, makes the pokemon wake up faster + * @param statusEffect - The {@linkcode StatusEffect} to check for + * @see {@linkcode apply} + */ export class ReduceStatusEffectDurationAbAttr extends AbAttr { private statusEffect: StatusEffect; @@ -4209,9 +4252,19 @@ export class ReduceStatusEffectDurationAbAttr extends AbAttr { this.statusEffect = statusEffect; } - apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean { + /** + * Reduces the number of sleep turns remaining by an extra 1 when applied + * @param args - The args passed to the `AbAttr`: + * - `[0]` - The {@linkcode StatusEffect} of the Pokemon + * - `[1]` - The number of turns remaining until the status is healed + * @returns `true` if the ability was applied + */ + apply(_pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]): boolean { + if (!(args[1] instanceof Utils.NumberHolder)) { + return false; + } if (args[0] === this.statusEffect) { - (args[1] as Utils.IntegerHolder).value = Utils.toDmgValue((args[1] as Utils.IntegerHolder).value / 2); + args[1].value -= 1; return true; } @@ -4342,6 +4395,30 @@ 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 { } +/** + * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Infiltrator_(Ability) | Infiltrator}. + * Allows the source's moves to bypass the effects of opposing Light Screen, Reflect, Aurora Veil, Safeguard, Mist, and Substitute. + */ +export class InfiltratorAbAttr extends AbAttr { + /** + * Sets a flag to bypass screens, Substitute, Safeguard, and Mist + * @param pokemon n/a + * @param passive n/a + * @param simulated n/a + * @param cancelled n/a + * @param args `[0]` a {@linkcode Utils.BooleanHolder | BooleanHolder} containing the flag + * @returns `true` if the bypass flag was successfully set; `false` otherwise. + */ + override apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: null, args: any[]): boolean { + const bypassed = args[0]; + if (args[0] instanceof Utils.BooleanHolder) { + bypassed.value = true; + return true; + } + return false; + } +} + export class UncopiableAbilityAbAttr extends AbAttr { constructor() { super(false); @@ -4629,6 +4706,84 @@ export class PreventBypassSpeedChanceAbAttr extends AbAttr { } } +/** + * This applies a terrain-based type change to the Pokemon. + * Used by Mimicry. + */ +export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { + constructor() { + super(true); + } + + override apply(pokemon: Pokemon, _passive: boolean, _simulated: boolean, _cancelled: Utils.BooleanHolder, _args: any[]): boolean { + if (pokemon.isTerastallized()) { + return false; + } + const currentTerrain = pokemon.scene.arena.getTerrainType(); + const typeChange: Type[] = this.determineTypeChange(pokemon, currentTerrain); + if (typeChange.length !== 0) { + if (pokemon.summonData.addedType && typeChange.includes(pokemon.summonData.addedType)) { + pokemon.summonData.addedType = null; + } + pokemon.summonData.types = typeChange; + pokemon.updateInfo(); + } + return true; + } + + /** + * Retrieves the type(s) the Pokemon should change to in response to a terrain + * @param pokemon + * @param currentTerrain {@linkcode TerrainType} + * @returns a list of type(s) + */ + private determineTypeChange(pokemon: Pokemon, currentTerrain: TerrainType): Type[] { + const typeChange: Type[] = []; + switch (currentTerrain) { + case TerrainType.ELECTRIC: + typeChange.push(Type.ELECTRIC); + break; + case TerrainType.MISTY: + typeChange.push(Type.FAIRY); + break; + case TerrainType.GRASSY: + typeChange.push(Type.GRASS); + break; + case TerrainType.PSYCHIC: + typeChange.push(Type.PSYCHIC); + break; + default: + pokemon.getTypes(false, false, true).forEach(t => { + typeChange.push(t); + }); + break; + } + return typeChange; + } + + /** + * Checks if the Pokemon should change types if summoned into an active terrain + * @returns `true` if there is an active terrain requiring a type change | `false` if not + */ + override applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + if (pokemon.scene.arena.getTerrainType() !== TerrainType.NONE) { + return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); + } + return false; + } + + override getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]) { + const currentTerrain = pokemon.scene.arena.getTerrainType(); + const pokemonNameWithAffix = getPokemonNameWithAffix(pokemon); + if (currentTerrain === TerrainType.NONE) { + return i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix }); + } else { + const moveType = i18next.t(`pokemonInfo:Type.${Type[this.determineTypeChange(pokemon, currentTerrain)[0]]}`); + return i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix, moveType }); + } + } +} + async function applyAbAttrsInternal( attrType: Constructor, pokemon: Pokemon | null, @@ -4684,6 +4839,239 @@ async function applyAbAttrsInternal( } } +class ForceSwitchOutHelper { + constructor(private switchType: SwitchType) {} + + /** + * Handles the logic for switching out a Pokémon based on battle conditions, HP, and the switch type. + * + * @param pokemon The {@linkcode Pokemon} attempting to switch out. + * @returns `true` if the switch is successful + */ + public switchOutLogic(pokemon: Pokemon): boolean { + const switchOutTarget = pokemon; + /** + * If the switch-out target is a player-controlled Pokémon, the function checks: + * - Whether there are available party members to switch in. + * - If the Pokémon is still alive (hp > 0), and if so, it leaves the field and a new SwitchPhase is initiated. + */ + if (switchOutTarget instanceof PlayerPokemon) { + if (switchOutTarget.scene.getParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + return false; + } + + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + pokemon.scene.prependToPhase(new SwitchPhase(pokemon.scene, this.switchType, switchOutTarget.getFieldIndex(), true, true), MoveEndPhase); + return true; + } + /** + * For non-wild battles, it checks if the opposing party has any available Pokémon to switch in. + * If yes, the Pokémon leaves the field and a new SwitchSummonPhase is initiated. + */ + } else if (pokemon.scene.currentBattle.battleType !== BattleType.WILD) { + if (switchOutTarget.scene.getEnemyParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { + return false; + } + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(this.switchType === SwitchType.SWITCH); + pokemon.scene.prependToPhase(new SwitchSummonPhase(pokemon.scene, this.switchType, switchOutTarget.getFieldIndex(), + (pokemon.scene.currentBattle.trainer ? pokemon.scene.currentBattle.trainer.getNextSummonIndex((switchOutTarget as EnemyPokemon).trainerSlot) : 0), + false, false), MoveEndPhase); + return true; + } + /** + * For wild Pokémon battles, the Pokémon will flee if the conditions are met (waveIndex and double battles). + */ + } else { + if (!pokemon.scene.currentBattle.waveIndex && pokemon.scene.currentBattle.waveIndex % 10 === 0) { + return false; + } + + if (switchOutTarget.hp > 0) { + switchOutTarget.leaveField(false); + pokemon.scene.queueMessage(i18next.t("moveTriggers:fled", { pokemonName: getPokemonNameWithAffix(switchOutTarget) }), null, true, 500); + + if (switchOutTarget.scene.currentBattle.double) { + const allyPokemon = switchOutTarget.getAlly(); + switchOutTarget.scene.redirectPokemonMoves(switchOutTarget, allyPokemon); + } + } + + if (!switchOutTarget.getAlly()?.isActive(true)) { + pokemon.scene.clearEnemyHeldItemModifiers(); + + if (switchOutTarget.hp) { + pokemon.scene.pushPhase(new BattleEndPhase(pokemon.scene)); + pokemon.scene.pushPhase(new NewBattlePhase(pokemon.scene)); + } + } + } + return false; + } + + /** + * Determines if a Pokémon can switch out based on its status, the opponent's status, and battle conditions. + * + * @param pokemon The Pokémon attempting to switch out. + * @param opponent The opponent Pokémon. + * @returns `true` if the switch-out condition is met + */ + public getSwitchOutCondition(pokemon: Pokemon, opponent: Pokemon): boolean { + const switchOutTarget = pokemon; + const player = switchOutTarget instanceof PlayerPokemon; + + if (player) { + const blockedByAbility = new Utils.BooleanHolder(false); + applyAbAttrs(ForceSwitchOutImmunityAbAttr, opponent, blockedByAbility); + return !blockedByAbility.value; + } + + if (!player && pokemon.scene.currentBattle.battleType === BattleType.WILD) { + if (!pokemon.scene.currentBattle.waveIndex && pokemon.scene.currentBattle.waveIndex % 10 === 0) { + return false; + } + } + + if (!player && pokemon.scene.currentBattle.isBattleMysteryEncounter() && !pokemon.scene.currentBattle.mysteryEncounter?.fleeAllowed) { + return false; + } + + const party = player ? pokemon.scene.getParty() : pokemon.scene.getEnemyParty(); + return (!player && pokemon.scene.currentBattle.battleType === BattleType.WILD) + || party.filter(p => p.isAllowedInBattle() + && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > pokemon.scene.currentBattle.getBattlerCount(); + } + + /** + * Returns a message if the switch-out attempt fails due to ability effects. + * + * @param target The target Pokémon. + * @returns The failure message, or `null` if no failure. + */ + public getFailedText(target: Pokemon): string | null { + const blockedByAbility = new Utils.BooleanHolder(false); + applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); + return blockedByAbility.value ? i18next.t("moveTriggers:cannotBeSwitchedOut", { pokemonName: getPokemonNameWithAffix(target) }) : null; + } +} + +/** + * Calculates the amount of recovery from the Shell Bell item. + * + * If the Pokémon is holding a Shell Bell, this function computes the amount of health + * recovered based on the damage dealt in the current turn. The recovery is multiplied by the + * Shell Bell's modifier (if any). + * + * @param pokemon - The Pokémon whose Shell Bell recovery is being calculated. + * @returns The amount of health recovered by Shell Bell. + */ +function calculateShellBellRecovery(pokemon: Pokemon): number { + const shellBellModifier = pokemon.getHeldItems().find(m => m instanceof HitHealModifier); + if (shellBellModifier) { + return Utils.toDmgValue(pokemon.turnData.totalDamageDealt / 8) * shellBellModifier.stackCount; + } + return 0; +} + +/** + * Triggers after the Pokemon takes any damage + * @extends AbAttr + */ +export class PostDamageAbAttr extends AbAttr { + public applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + return false; + } +} + +/** + * Ability attribute for forcing a Pokémon to switch out after its health drops below half. + * This attribute checks various conditions related to the damage received, the moves used by the Pokémon + * and its opponents, and determines whether a forced switch-out should occur. + * + * Used by Wimp Out and Emergency Exit + * + * @extends PostDamageAbAttr + * @see {@linkcode applyPostDamage} + */ +export class PostDamageForceSwitchAbAttr extends PostDamageAbAttr { + private helper: ForceSwitchOutHelper = new ForceSwitchOutHelper(SwitchType.SWITCH); + private hpRatio: number; + + constructor(hpRatio: number = 0.5) { + super(); + this.hpRatio = hpRatio; + } + + /** + * Applies the switch-out logic after the Pokémon takes damage. + * Checks various conditions based on the moves used by the Pokémon, the opponents' moves, and + * the Pokémon's health after damage to determine whether the switch-out should occur. + * + * @param pokemon The Pokémon that took damage. + * @param damage The amount of damage taken by the Pokémon. + * @param passive N/A + * @param simulated Whether the ability is being simulated. + * @param args N/A + * @param source The Pokemon that dealt damage + * @returns `true` if the switch-out logic was successfully applied + */ + public override applyPostDamage(pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean, args: any[], source?: Pokemon): boolean | Promise { + const moveHistory = pokemon.getMoveHistory(); + // Will not activate when the Pokémon's HP is lowered by cutting its own HP + const fordbiddenAttackingMoves = [ Moves.BELLY_DRUM, Moves.SUBSTITUTE, Moves.CURSE, Moves.PAIN_SPLIT ]; + if (moveHistory.length > 0) { + const lastMoveUsed = moveHistory[moveHistory.length - 1]; + if (fordbiddenAttackingMoves.includes(lastMoveUsed.move)) { + return false; + } + } + + // Dragon Tail and Circle Throw switch out Pokémon before the Ability activates. + const fordbiddenDefendingMoves = [ Moves.DRAGON_TAIL, Moves.CIRCLE_THROW ]; + if (source) { + const enemyMoveHistory = source.getMoveHistory(); + if (enemyMoveHistory.length > 0) { + const enemyLastMoveUsed = enemyMoveHistory[enemyMoveHistory.length - 1]; + // Will not activate if the Pokémon's HP falls below half while it is in the air during Sky Drop. + if (fordbiddenDefendingMoves.includes(enemyLastMoveUsed.move) || enemyLastMoveUsed.move === Moves.SKY_DROP && enemyLastMoveUsed.result === MoveResult.OTHER) { + return false; + // Will not activate if the Pokémon's HP falls below half by a move affected by Sheer Force. + } else if (allMoves[enemyLastMoveUsed.move].chance >= 0 && source.hasAbility(Abilities.SHEER_FORCE)) { + return false; + // Activate only after the last hit of multistrike moves + } else if (source.turnData.hitsLeft > 1) { + return false; + } + if (source.turnData.hitCount > 1) { + damage = pokemon.turnData.damageTaken; + } + } + } + + if (pokemon.hp + damage >= pokemon.getMaxHp() * this.hpRatio) { + // Activates if it falls below half and recovers back above half from a Shell Bell + const shellBellHeal = calculateShellBellRecovery(pokemon); + if (pokemon.hp - shellBellHeal < pokemon.getMaxHp() * this.hpRatio) { + for (const opponent of pokemon.getOpponents()) { + if (!this.helper.getSwitchOutCondition(pokemon, opponent)) { + return false; + } + } + return this.helper.switchOutLogic(pokemon); + } else { + return false; + } + } else { + return false; + } + } + public getFailedText(user: Pokemon, target: Pokemon, move: Move, cancelled: Utils.BooleanHolder): string | null { + return this.helper.getFailedText(target); + } +} + + export function applyAbAttrs(attrType: Constructor, pokemon: Pokemon, cancelled: Utils.BooleanHolder | null, simulated: boolean = false, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.apply(pokemon, passive, simulated, cancelled, args), args, false, simulated); } @@ -4717,6 +5105,11 @@ export function applyPostSetStatusAbAttrs(attrType: Constructor(attrType, pokemon, (attr, passive) => attr.applyPostSetStatus(pokemon, sourcePokemon, passive, effect, simulated, args), args, false, simulated); } +export function applyPostDamageAbAttrs(attrType: Constructor, + pokemon: Pokemon, damage: number, passive: boolean, simulated: boolean = false, args: any[], source?: Pokemon): Promise { + return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostDamage(pokemon, damage, passive, simulated, args, source), args); +} + /** * Applies a field Stat multiplier attribute * @param attrType {@linkcode FieldMultiplyStatAbAttr} should always be FieldMultiplyBattleStatAbAttr for the time being @@ -4859,7 +5252,7 @@ export function initAbilities() { .attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN), new Ability(Abilities.SPEED_BOOST, 3) - .attr(PostTurnStatStageChangeAbAttr, [ Stat.SPD ], 1), + .attr(SpeedBoostAbAttr), new Ability(Abilities.BATTLE_ARMOR, 3) .attr(BlockCritAbAttr) .ignorable(), @@ -4913,7 +5306,8 @@ export function initAbilities() { .attr(TypeImmunityAddBattlerTagAbAttr, Type.FIRE, BattlerTagType.FIRE_BOOST, 1) .ignorable(), new Ability(Abilities.SHIELD_DUST, 3) - .attr(IgnoreMoveEffectsAbAttr), + .attr(IgnoreMoveEffectsAbAttr) + .ignorable(), new Ability(Abilities.OWN_TEMPO, 3) .attr(BattlerTagImmunityAbAttr, BattlerTagType.CONFUSED) .attr(IntimidateImmunityAbAttr) @@ -5031,11 +5425,9 @@ export function initAbilities() { new Ability(Abilities.CUTE_CHARM, 3) .attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED), new Ability(Abilities.PLUS, 3) - .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5) - .ignorable(), + .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5), new Ability(Abilities.MINUS, 3) - .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5) - .ignorable(), + .conditionalAttr(p => p.scene.currentBattle.double && [ Abilities.PLUS, Abilities.MINUS ].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5), new Ability(Abilities.FORECAST, 3) .attr(UncopiableAbilityAbAttr) .attr(NoFusionAbilityAbAttr) @@ -5260,8 +5652,8 @@ export function initAbilities() { new Ability(Abilities.HEALER, 5) .conditionalAttr(pokemon => pokemon.getAlly() && Utils.randSeedInt(10) < 3, PostTurnResetStatusAbAttr, true), new Ability(Abilities.FRIEND_GUARD, 5) - .ignorable() - .unimplemented(), + .attr(AlliedFieldDamageReductionAbAttr, 0.75) + .ignorable(), new Ability(Abilities.WEAK_ARMOR, 5) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.DEF, -1) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.SPD, 2), @@ -5321,7 +5713,8 @@ export function initAbilities() { .attr(PostSummonTransformAbAttr) .attr(UncopiableAbilityAbAttr), new Ability(Abilities.INFILTRATOR, 5) - .unimplemented(), + .attr(InfiltratorAbAttr) + .partial(), // does not bypass Mist new Ability(Abilities.MUMMY, 5) .attr(PostDefendAbilityGiveAbAttr, Abilities.MUMMY) .bypassFaint(), @@ -5372,7 +5765,8 @@ export function initAbilities() { .attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTeravolt", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })) .attr(MoveAbilityBypassAbAttr), new Ability(Abilities.AROMA_VEIL, 6) - .attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK ]), + .attr(UserFieldBattlerTagImmunityAbAttr, [ BattlerTagType.INFATUATED, BattlerTagType.TAUNT, BattlerTagType.DISABLED, BattlerTagType.TORMENT, BattlerTagType.HEAL_BLOCK ]) + .ignorable(), new Ability(Abilities.FLOWER_VEIL, 6) .ignorable() .unimplemented(), @@ -5457,11 +5851,11 @@ export function initAbilities() { new Ability(Abilities.STAMINA, 7) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.DEF, 1), new Ability(Abilities.WIMP_OUT, 7) - .condition(getSheerForceHitDisableAbCondition()) - .unimplemented(), + .attr(PostDamageForceSwitchAbAttr) + .edgeCase(), // Should not trigger when hurting itself in confusion new Ability(Abilities.EMERGENCY_EXIT, 7) - .condition(getSheerForceHitDisableAbCondition()) - .unimplemented(), + .attr(PostDamageForceSwitchAbAttr) + .edgeCase(), // Should not trigger when hurting itself in confusion new Ability(Abilities.WATER_COMPACTION, 7) .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => user.getMoveType(move) === Type.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2), new Ability(Abilities.MERCILESS, 7) @@ -5692,7 +6086,7 @@ export function initAbilities() { new Ability(Abilities.POWER_SPOT, 8) .attr(AllyMoveCategoryPowerBoostAbAttr, [ MoveCategory.SPECIAL, MoveCategory.PHYSICAL ], 1.3), new Ability(Abilities.MIMICRY, 8) - .unimplemented(), + .attr(TerrainEventTypeChangeAbAttr), new Ability(Abilities.SCREEN_CLEANER, 8) .attr(PostSummonRemoveArenaTagAbAttr, [ ArenaTagType.AURORA_VEIL, ArenaTagType.LIGHT_SCREEN, ArenaTagType.REFLECT ]), new Ability(Abilities.STEELY_SPIRIT, 8) @@ -5823,16 +6217,14 @@ export function initAbilities() { .ignorable(), new Ability(Abilities.SWORD_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.DEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.DEF)) })) - .ignorable(), + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.DEF)) })), new Ability(Abilities.TABLETS_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.ATK, 0.75) .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonTabletsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) })) .ignorable(), new Ability(Abilities.BEADS_OF_RUIN, 9) .attr(FieldMultiplyStatAbAttr, Stat.SPDEF, 0.75) - .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPDEF)) })) - .ignorable(), + .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPDEF)) })), new Ability(Abilities.ORICHALCUM_PULSE, 9) .attr(PostSummonWeatherChangeAbAttr, WeatherType.SUNNY) .attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SUNNY) @@ -5849,7 +6241,7 @@ export function initAbilities() { .attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SLICING_MOVE), 1.5), new Ability(Abilities.SUPREME_OVERLORD, 9) .attr(VariableMovePowerBoostAbAttr, (user, target, move) => 1 + 0.1 * Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 5)) - .partial(), // Counter resets every wave + .partial(), // Counter resets every wave instead of on arena reset new Ability(Abilities.COSTAR, 9) .attr(PostSummonCopyAllyStatsAbAttr), new Ability(Abilities.TOXIC_DEBRIS, 9) diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts index 2bd6ae09877..43de6e02dcb 100644 --- a/src/data/arena-tag.ts +++ b/src/data/arena-tag.ts @@ -7,7 +7,7 @@ import { getPokemonNameWithAffix } from "#app/messages"; import Pokemon, { HitResult, PokemonMove } from "#app/field/pokemon"; import { StatusEffect } from "#app/data/status-effect"; import { BattlerIndex } from "#app/battle"; -import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; +import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, InfiltratorAbAttr, ProtectStatAbAttr, applyAbAttrs } from "#app/data/ability"; import { Stat } from "#enums/stat"; import { CommonAnim, CommonBattleAnim } from "#app/data/battle-anims"; import i18next from "i18next"; @@ -88,13 +88,13 @@ export abstract class ArenaTag { */ public getAffectedPokemon(scene: BattleScene): Pokemon[] { switch (this.side) { - case ArenaTagSide.PLAYER: - return scene.getPlayerField() ?? []; - case ArenaTagSide.ENEMY: - return scene.getEnemyField() ?? []; - case ArenaTagSide.BOTH: - default: - return scene.getField(true) ?? []; + case ArenaTagSide.PLAYER: + return scene.getPlayerField() ?? []; + case ArenaTagSide.ENEMY: + return scene.getEnemyField() ?? []; + case ArenaTagSide.BOTH: + default: + return scene.getField(true) ?? []; } } } @@ -126,11 +126,23 @@ export class MistTag extends ArenaTag { * Cancels the lowering of stats * @param arena the {@linkcode Arena} containing this effect * @param simulated `true` if the effect should be applied quietly + * @param attacker the {@linkcode Pokemon} using a move into this effect. * @param cancelled a {@linkcode BooleanHolder} whose value is set to `true` * to flag the stat reduction as cancelled * @returns `true` if a stat reduction was cancelled; `false` otherwise */ - override apply(arena: Arena, simulated: boolean, cancelled: BooleanHolder): boolean { + override apply(arena: Arena, simulated: boolean, attacker: Pokemon, cancelled: BooleanHolder): boolean { + // `StatStageChangePhase` currently doesn't have a reference to the source of stat drops, + // so this code currently has no effect on gameplay. + if (attacker) { + const bypassed = new BooleanHolder(false); + // TODO: Allow this to be simulated + applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); + if (bypassed.value) { + return false; + } + } + cancelled.value = true; if (!simulated) { @@ -169,12 +181,18 @@ export class WeakenMoveScreenTag extends ArenaTag { * * @param arena the {@linkcode Arena} where the move is applied. * @param simulated n/a + * @param attacker the attacking {@linkcode Pokemon} * @param moveCategory the attacking move's {@linkcode MoveCategory}. * @param damageMultiplier A {@linkcode NumberHolder} containing the damage multiplier * @returns `true` if the attacking move was weakened; `false` otherwise. */ - override apply(arena: Arena, simulated: boolean, moveCategory: MoveCategory, damageMultiplier: NumberHolder): boolean { + override apply(arena: Arena, simulated: boolean, attacker: Pokemon, moveCategory: MoveCategory, damageMultiplier: NumberHolder): boolean { if (this.weakenedCategories.includes(moveCategory)) { + const bypassed = new BooleanHolder(false); + applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); + if (bypassed.value) { + return false; + } damageMultiplier.value = arena.scene.currentBattle.double ? 2732 / 4096 : 0.5; return true; } @@ -332,11 +350,11 @@ const WideGuardConditionFunc: ProtectConditionFunc = (arena, moveId) : boolean = const move = allMoves[moveId]; switch (move.moveTarget) { - case MoveTarget.ALL_ENEMIES: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_OTHERS: - case MoveTarget.ALL_NEAR_OTHERS: - return true; + case MoveTarget.ALL_ENEMIES: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_OTHERS: + case MoveTarget.ALL_NEAR_OTHERS: + return true; } return false; }; @@ -626,7 +644,7 @@ export class ArenaTrapTag extends ArenaTag { * @returns `true` if this hazard affects the given Pokemon; `false` otherwise. */ override apply(arena: Arena, simulated: boolean, pokemon: Pokemon): boolean { - if (this.sourceId === pokemon.id || (this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) { + if ((this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) { return false; } @@ -807,24 +825,24 @@ class StealthRockTag extends ArenaTrapTag { let damageHpRatio: number = 0; switch (effectiveness) { - case 0: - damageHpRatio = 0; - break; - case 0.25: - damageHpRatio = 0.03125; - break; - case 0.5: - damageHpRatio = 0.0625; - break; - case 1: - damageHpRatio = 0.125; - break; - case 2: - damageHpRatio = 0.25; - break; - case 4: - damageHpRatio = 0.5; - break; + case 0: + damageHpRatio = 0; + break; + case 0.25: + damageHpRatio = 0.03125; + break; + case 0.5: + damageHpRatio = 0.0625; + break; + case 1: + damageHpRatio = 0.125; + break; + case 2: + damageHpRatio = 0.25; + break; + case 4: + damageHpRatio = 0.5; + break; } return damageHpRatio; @@ -953,6 +971,9 @@ export class GravityTag extends ArenaTag { if (pokemon !== null) { pokemon.removeTag(BattlerTagType.FLOATING); pokemon.removeTag(BattlerTagType.TELEKINESIS); + if (pokemon.getTag(BattlerTagType.FLYING)) { + pokemon.addTag(BattlerTagType.INTERRUPTED); + } } }); } @@ -1185,63 +1206,63 @@ class GrassWaterPledgeTag extends ArenaTag { // TODO: swap `sourceMove` and `sourceId` and make `sourceMove` an optional parameter export function getArenaTag(tagType: ArenaTagType, turnCount: number, sourceMove: Moves | undefined, sourceId: number, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null { switch (tagType) { - case ArenaTagType.MIST: - return new MistTag(turnCount, sourceId, side); - case ArenaTagType.QUICK_GUARD: - return new QuickGuardTag(sourceId, side); - case ArenaTagType.WIDE_GUARD: - return new WideGuardTag(sourceId, side); - case ArenaTagType.MAT_BLOCK: - return new MatBlockTag(sourceId, side); - case ArenaTagType.CRAFTY_SHIELD: - return new CraftyShieldTag(sourceId, side); - case ArenaTagType.NO_CRIT: - return new NoCritTag(turnCount, sourceMove!, sourceId, side); // TODO: is this bang correct? - case ArenaTagType.MUD_SPORT: - return new MudSportTag(turnCount, sourceId); - case ArenaTagType.WATER_SPORT: - return new WaterSportTag(turnCount, sourceId); - case ArenaTagType.ION_DELUGE: - return new IonDelugeTag(sourceMove); - case ArenaTagType.SPIKES: - return new SpikesTag(sourceId, side); - case ArenaTagType.TOXIC_SPIKES: - return new ToxicSpikesTag(sourceId, side); - case ArenaTagType.FUTURE_SIGHT: - case ArenaTagType.DOOM_DESIRE: - return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex!); // TODO:questionable bang - case ArenaTagType.WISH: - return new WishTag(turnCount, sourceId, side); - case ArenaTagType.STEALTH_ROCK: - return new StealthRockTag(sourceId, side); - case ArenaTagType.STICKY_WEB: - return new StickyWebTag(sourceId, side); - case ArenaTagType.TRICK_ROOM: - return new TrickRoomTag(turnCount, sourceId); - case ArenaTagType.GRAVITY: - return new GravityTag(turnCount); - case ArenaTagType.REFLECT: - return new ReflectTag(turnCount, sourceId, side); - case ArenaTagType.LIGHT_SCREEN: - return new LightScreenTag(turnCount, sourceId, side); - case ArenaTagType.AURORA_VEIL: - return new AuroraVeilTag(turnCount, sourceId, side); - case ArenaTagType.TAILWIND: - return new TailwindTag(turnCount, sourceId, side); - case ArenaTagType.HAPPY_HOUR: - return new HappyHourTag(turnCount, sourceId, side); - case ArenaTagType.SAFEGUARD: - return new SafeguardTag(turnCount, sourceId, side); - case ArenaTagType.IMPRISON: - return new ImprisonTag(sourceId, side); - case ArenaTagType.FIRE_GRASS_PLEDGE: - return new FireGrassPledgeTag(sourceId, side); - case ArenaTagType.WATER_FIRE_PLEDGE: - return new WaterFirePledgeTag(sourceId, side); - case ArenaTagType.GRASS_WATER_PLEDGE: - return new GrassWaterPledgeTag(sourceId, side); - default: - return null; + case ArenaTagType.MIST: + return new MistTag(turnCount, sourceId, side); + case ArenaTagType.QUICK_GUARD: + return new QuickGuardTag(sourceId, side); + case ArenaTagType.WIDE_GUARD: + return new WideGuardTag(sourceId, side); + case ArenaTagType.MAT_BLOCK: + return new MatBlockTag(sourceId, side); + case ArenaTagType.CRAFTY_SHIELD: + return new CraftyShieldTag(sourceId, side); + case ArenaTagType.NO_CRIT: + return new NoCritTag(turnCount, sourceMove!, sourceId, side); // TODO: is this bang correct? + case ArenaTagType.MUD_SPORT: + return new MudSportTag(turnCount, sourceId); + case ArenaTagType.WATER_SPORT: + return new WaterSportTag(turnCount, sourceId); + case ArenaTagType.ION_DELUGE: + return new IonDelugeTag(sourceMove); + case ArenaTagType.SPIKES: + return new SpikesTag(sourceId, side); + case ArenaTagType.TOXIC_SPIKES: + return new ToxicSpikesTag(sourceId, side); + case ArenaTagType.FUTURE_SIGHT: + case ArenaTagType.DOOM_DESIRE: + return new DelayedAttackTag(tagType, sourceMove, sourceId, targetIndex!); // TODO:questionable bang + case ArenaTagType.WISH: + return new WishTag(turnCount, sourceId, side); + case ArenaTagType.STEALTH_ROCK: + return new StealthRockTag(sourceId, side); + case ArenaTagType.STICKY_WEB: + return new StickyWebTag(sourceId, side); + case ArenaTagType.TRICK_ROOM: + return new TrickRoomTag(turnCount, sourceId); + case ArenaTagType.GRAVITY: + return new GravityTag(turnCount); + case ArenaTagType.REFLECT: + return new ReflectTag(turnCount, sourceId, side); + case ArenaTagType.LIGHT_SCREEN: + return new LightScreenTag(turnCount, sourceId, side); + case ArenaTagType.AURORA_VEIL: + return new AuroraVeilTag(turnCount, sourceId, side); + case ArenaTagType.TAILWIND: + return new TailwindTag(turnCount, sourceId, side); + case ArenaTagType.HAPPY_HOUR: + return new HappyHourTag(turnCount, sourceId, side); + case ArenaTagType.SAFEGUARD: + return new SafeguardTag(turnCount, sourceId, side); + case ArenaTagType.IMPRISON: + return new ImprisonTag(sourceId, side); + case ArenaTagType.FIRE_GRASS_PLEDGE: + return new FireGrassPledgeTag(sourceId, side); + case ArenaTagType.WATER_FIRE_PLEDGE: + return new WaterFirePledgeTag(sourceId, side); + case ArenaTagType.GRASS_WATER_PLEDGE: + return new GrassWaterPledgeTag(sourceId, side); + default: + return null; } } diff --git a/src/data/balance/biomes.ts b/src/data/balance/biomes.ts index 7ef83b654db..2ce693c360b 100644 --- a/src/data/balance/biomes.ts +++ b/src/data/balance/biomes.ts @@ -13,14 +13,14 @@ export function getBiomeName(biome: Biome | -1) { return i18next.t("biome:unknownLocation"); } switch (biome) { - case Biome.GRASS: - return i18next.t("biome:GRASS"); - case Biome.RUINS: - return i18next.t("biome:RUINS"); - case Biome.END: - return i18next.t("biome:END"); - default: - return i18next.t(`biome:${Biome[biome].toUpperCase()}`); + case Biome.GRASS: + return i18next.t("biome:GRASS"); + case Biome.RUINS: + return i18next.t("biome:RUINS"); + case Biome.END: + return i18next.t("biome:END"); + default: + return i18next.t(`biome:${Biome[biome].toUpperCase()}`); } } diff --git a/src/data/balance/pokemon-evolutions.ts b/src/data/balance/pokemon-evolutions.ts index c838f6b2c49..c0b213e4def 100644 --- a/src/data/balance/pokemon-evolutions.ts +++ b/src/data/balance/pokemon-evolutions.ts @@ -1,7 +1,6 @@ import { Gender } from "#app/data/gender"; import { PokeballType } from "#app/data/pokeball"; import Pokemon from "#app/field/pokemon"; -import { Stat } from "#enums/stat"; import { Type } from "#app/data/type"; import * as Utils from "#app/utils"; import { WeatherType } from "#app/data/weather"; @@ -10,7 +9,7 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { TimeOfDay } from "#enums/time-of-day"; -import { DamageMoneyRewardModifier, ExtraModifierModifier, MoneyMultiplierModifier } from "#app/modifier/modifier"; +import { DamageMoneyRewardModifier, ExtraModifierModifier, MoneyMultiplierModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; import { SpeciesFormKey } from "#enums/species-form-key"; @@ -271,9 +270,21 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesEvolution(Species.MAROWAK, 28, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY)) ], [Species.TYROGUE]: [ - new SpeciesEvolution(Species.HITMONLEE, 20, null, new SpeciesEvolutionCondition(p => p.stats[Stat.ATK] > p.stats[Stat.DEF])), - new SpeciesEvolution(Species.HITMONCHAN, 20, null, new SpeciesEvolutionCondition(p => p.stats[Stat.ATK] < p.stats[Stat.DEF])), - new SpeciesEvolution(Species.HITMONTOP, 20, null, new SpeciesEvolutionCondition(p => p.stats[Stat.ATK] === p.stats[Stat.DEF])) + /** + * Custom: Evolves into Hitmonlee, Hitmonchan or Hitmontop at level 20 + * if it knows Low Sweep, Mach Punch, or Rapid Spin, respectively. + * If Tyrogue knows multiple of these moves, its evolution is based on + * the first qualifying move in its moveset. + */ + new SpeciesEvolution(Species.HITMONLEE, 20, null, new SpeciesEvolutionCondition(p => + p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.LOW_SWEEP + )), + new SpeciesEvolution(Species.HITMONCHAN, 20, null, new SpeciesEvolutionCondition(p => + p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.MACH_PUNCH + )), + new SpeciesEvolution(Species.HITMONTOP, 20, null, new SpeciesEvolutionCondition(p => + p.getMoveset(true).find(move => move && [ Moves.LOW_SWEEP, Moves.MACH_PUNCH, Moves.RAPID_SPIN ].includes(move?.moveId))?.moveId === Moves.RAPID_SPIN + )), ], [Species.KOFFING]: [ new SpeciesEvolution(Species.GALAR_WEEZING, 35, null, new SpeciesEvolutionCondition(p => p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT)), @@ -1432,7 +1443,7 @@ export const pokemonEvolutions: PokemonEvolutions = { ], [Species.ROCKRUFF]: [ new SpeciesFormEvolution(Species.LYCANROC, "", "midday", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DAWN || p.scene.arena.getTimeOfDay() === TimeOfDay.DAY) && (p.formIndex === 0))), - new SpeciesFormEvolution(Species.LYCANROC, "", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1)), + new SpeciesFormEvolution(Species.LYCANROC, "own-tempo", "dusk", 25, null, new SpeciesEvolutionCondition(p => p.formIndex === 1)), new SpeciesFormEvolution(Species.LYCANROC, "", "midnight", 25, null, new SpeciesEvolutionCondition(p => (p.scene.arena.getTimeOfDay() === TimeOfDay.DUSK || p.scene.arena.getTimeOfDay() === TimeOfDay.NIGHT) && (p.formIndex === 0))) ], [Species.STEENEE]: [ @@ -1652,11 +1663,11 @@ export const pokemonEvolutions: PokemonEvolutions = { new SpeciesFormEvolution(Species.GHOLDENGO, "chest", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter + p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier - || m instanceof ExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG), + || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG), new SpeciesFormEvolution(Species.GHOLDENGO, "roaming", "", 1, null, new SpeciesEvolutionCondition(p => p.evoCounter + p.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length + p.scene.findModifiers(m => m instanceof MoneyMultiplierModifier - || m instanceof ExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG) + || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length > 9), SpeciesWildEvolutionDelay.VERY_LONG) ] }; diff --git a/src/data/balance/pokemon-level-moves.ts b/src/data/balance/pokemon-level-moves.ts index b5608093df2..71d98fb4fc2 100644 --- a/src/data/balance/pokemon-level-moves.ts +++ b/src/data/balance/pokemon-level-moves.ts @@ -93,6 +93,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.GROWL ], [ 1, Moves.EMBER ], [ 1, Moves.SMOKESCREEN ], + [ 1, Moves.FIRE_SPIN ], // Previous Stage Move [ 12, Moves.DRAGON_BREATH ], [ 19, Moves.FIRE_FANG ], [ 24, Moves.SLASH ], @@ -174,6 +175,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.METAPOD]: [ [ EVOLVE_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.TACKLE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STRING_SHOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.HARDEN ], ], [Species.BUTTERFREE]: [ @@ -203,10 +207,17 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.KAKUNA]: [ [ EVOLVE_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.POISON_STING ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STRING_SHOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.HARDEN ], ], [Species.BEEDRILL]: [ [ EVOLVE_MOVE, Moves.TWINEEDLE ], + [ 1, Moves.POISON_STING ], // Previous Stage Move + [ 1, Moves.STRING_SHOT ], // Previous Stage Move + [ 1, Moves.HARDEN ], // Previous Stage Move + [ 1, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.FURY_ATTACK ], [ 11, Moves.FURY_CUTTER ], [ 14, Moves.RAGE ], @@ -454,6 +465,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.POISON_STING ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.CRUSH_CLAW ], + [ 1, Moves.AGILITY ], // Previous Stage Move [ 9, Moves.ROLLOUT ], [ 12, Moves.FURY_CUTTER ], [ 15, Moves.RAPID_SPIN ], @@ -961,6 +973,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.COVET ], // Previous Stage Move [ 1, Moves.FLING ], [ 5, Moves.FURY_SWIPES ], [ 8, Moves.LOW_KICK ], @@ -1044,10 +1057,6 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.POLIWRATH]: [ [ EVOLVE_MOVE, Moves.DYNAMIC_PUNCH ], - [ 1, Moves.BUBBLE_BEAM ], - [ 1, Moves.BODY_SLAM ], - [ 1, Moves.HYPNOSIS ], - [ 1, Moves.WATER_SPORT ], [ RELEARN_MOVE, Moves.POUND ], [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], [ RELEARN_MOVE, Moves.WATER_GUN ], @@ -1057,13 +1066,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ RELEARN_MOVE, Moves.MUD_SHOT ], [ RELEARN_MOVE, Moves.EARTH_POWER ], [ RELEARN_MOVE, Moves.CIRCLE_THROW ], + [ 1, Moves.BUBBLE_BEAM ], + [ 1, Moves.BODY_SLAM ], + [ 1, Moves.HYPNOSIS ], + [ 1, Moves.WATER_SPORT ], ], [Species.ABRA]: [ [ 1, Moves.TELEPORT ], - [ 1, Moves.CONFUSION ], //Custom + [ 1, Moves.CONFUSION ], // Custom ], [Species.KADABRA]: [ - [ EVOLVE_MOVE, Moves.PSYBEAM ], //LGPE + [ EVOLVE_MOVE, Moves.PSYBEAM ], // LGPE + [ 1, Moves.CONFUSION ], // Previous Stage Move, Custom [ 1, Moves.DISABLE ], [ 1, Moves.TELEPORT ], [ 1, Moves.KINESIS ], @@ -1184,10 +1198,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ RELEARN_MOVE, Moves.STOCKPILE ], [ RELEARN_MOVE, Moves.SWALLOW ], [ RELEARN_MOVE, Moves.SPIT_UP ], + [ RELEARN_MOVE, Moves.WRAP ], // Previous Stage Move + [ RELEARN_MOVE, Moves.GROWTH ], // Previous Stage Move + [ RELEARN_MOVE, Moves.ACID ], // Previous Stage Move + [ RELEARN_MOVE, Moves.KNOCK_OFF ], // Previous Stage Move [ RELEARN_MOVE, Moves.GASTRO_ACID ], + [ RELEARN_MOVE, Moves.POISON_JAB ], // Previous Stage Move + [ RELEARN_MOVE, Moves.SLAM ], // Previous Stage Move [ RELEARN_MOVE, Moves.POWER_WHIP ], [ 1, Moves.VINE_WHIP ], [ 1, Moves.SLEEP_POWDER ], + [ 1, Moves.POISON_POWDER ], // Previous Stage Move + [ 1, Moves.STUN_SPORE ], // Previous Stage Move [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RAZOR_LEAF ], [ 44, Moves.LEAF_BLADE ], @@ -1262,6 +1284,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.ROCK_POLISH ], + [ 1, Moves.ROLLOUT ], // Previous Stage Move [ 1, Moves.HEAVY_SLAM ], [ 16, Moves.ROCK_THROW ], [ 18, Moves.SMACK_DOWN ], @@ -1548,7 +1571,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.GASTLY]: [ [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.LICK ], - [ 1, Moves.ACID ], //Custom + [ 1, Moves.ACID ], // Custom [ 4, Moves.HYPNOSIS ], [ 8, Moves.MEAN_LOOK ], [ 12, Moves.PAYBACK ], @@ -1567,6 +1590,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.LICK ], + [ 1, Moves.ACID ], // Previous Stage Move, Custom [ 1, Moves.MEAN_LOOK ], [ 12, Moves.PAYBACK ], [ 16, Moves.SPITE ], @@ -1583,6 +1607,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYPNOSIS ], [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.LICK ], + [ 1, Moves.ACID ], // Previous Stage Move, Custom [ 1, Moves.PERISH_SONG ], [ 1, Moves.MEAN_LOOK ], [ 1, Moves.SHADOW_PUNCH ], @@ -1609,7 +1634,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 12, Moves.DRAGON_BREATH ], [ 16, Moves.CURSE ], [ 20, Moves.ROCK_SLIDE ], - [ 22, Moves.GYRO_BALL ], //Custom, from USUM + [ 22, Moves.GYRO_BALL ], // Custom, from USUM [ 24, Moves.SCREECH ], [ 28, Moves.SAND_TOMB ], [ 32, Moves.STEALTH_ROCK ], @@ -1810,6 +1835,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LOW_SWEEP ], [ 1, Moves.JUMP_KICK ], [ 1, Moves.ROLLING_KICK ], + [ 1, Moves.MACH_PUNCH ], // Previous Stage Move, Custom + [ 1, Moves.RAPID_SPIN ], // Previous Stage Move, Custom [ 4, Moves.DOUBLE_KICK ], [ 8, Moves.LOW_KICK ], [ 12, Moves.ENDURE ], @@ -1832,6 +1859,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.FEINT ], [ 1, Moves.PURSUIT ], [ 1, Moves.COMET_PUNCH ], + [ 1, Moves.LOW_SWEEP ], // Previous Stage Move, Custom + [ 1, Moves.RAPID_SPIN ], // Previous Stage Move, Custom [ 4, Moves.MACH_PUNCH ], [ 8, Moves.VACUUM_WAVE ], [ 12, Moves.DETECT ], @@ -1849,7 +1878,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.LICKITUNG]: [ [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.LICK ], - [ 1, Moves.TACKLE ], //Custom + [ 1, Moves.TACKLE ], // Custom [ 6, Moves.REST ], [ 12, Moves.SUPERSONIC ], [ 18, Moves.WRAP ], @@ -2090,6 +2119,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MR_MIME]: [ [ 1, Moves.POUND ], + [ 1, Moves.TICKLE ], // Previous Stage Move [ 1, Moves.BATON_PASS ], [ 1, Moves.ENCORE ], [ 1, Moves.COPYCAT ], @@ -2122,7 +2152,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.DOUBLE_HIT ], [ 24, Moves.SLASH ], [ 28, Moves.FOCUS_ENERGY ], - [ 30, Moves.STEEL_WING ], //Custom + [ 30, Moves.STEEL_WING ], // Custom [ 32, Moves.AGILITY ], [ 36, Moves.AIR_SLASH ], [ 40, Moves.X_SCISSOR ], @@ -2279,6 +2309,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.VAPOREON]: [ [ EVOLVE_MOVE, Moves.BOUNCY_BUBBLE ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2306,6 +2337,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.JOLTEON]: [ [ EVOLVE_MOVE, Moves.BUZZY_BUZZ ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2333,6 +2365,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.FLAREON]: [ [ EVOLVE_MOVE, Moves.SIZZLY_SLIDE ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -2463,6 +2496,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SNORLAX]: [ [ 1, Moves.TACKLE ], [ 1, Moves.SCREECH ], + [ 1, Moves.ODOR_SLEUTH ], // Previous Stage Move [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.METRONOME ], [ 1, Moves.LICK ], @@ -2632,7 +2666,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CHIKORITA]: [ [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], - [ 5, Moves.RAZOR_LEAF ], //Custom, moved from 6 to 5 + [ 5, Moves.RAZOR_LEAF ], // Custom, moved from 6 to 5 [ 9, Moves.POISON_POWDER ], [ 12, Moves.SYNTHESIS ], [ 17, Moves.REFLECT ], @@ -2682,8 +2716,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CYNDAQUIL]: [ [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], - [ 5, Moves.EMBER ], //Custom, moved from 10 to 5 - [ 10, Moves.SMOKESCREEN ], //Custom, moved from 6 to 10 + [ 5, Moves.EMBER ], // Custom, moved from 10 to 5 + [ 10, Moves.SMOKESCREEN ], // Custom, moved from 6 to 10 [ 13, Moves.QUICK_ATTACK ], [ 19, Moves.FLAME_WHEEL ], [ 22, Moves.DEFENSE_CURL ], @@ -2737,7 +2771,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TOTODILE]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], - [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5 + [ 5, Moves.WATER_GUN ], // Custom, moved from 6 to 5 [ 9, Moves.BITE ], [ 13, Moves.SCARY_FACE ], [ 19, Moves.ICE_FANG ], @@ -3149,6 +3183,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.MOONBLAST ], ], [Species.MARILL]: [ + [ 1, Moves.SPLASH ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], @@ -3168,6 +3203,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 36, Moves.SUPERPOWER ], ], [Species.AZUMARILL]: [ + [ 1, Moves.SPLASH ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], @@ -3189,6 +3225,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SUDOWOODO]: [ [ EVOLVE_MOVE, Moves.SLAM ], [ 1, Moves.ROCK_THROW ], + [ 1, Moves.TACKLE ], // Previous Stage Move, Custom [ 1, Moves.FLAIL ], [ 1, Moves.FAKE_TEARS ], [ 1, Moves.HAMMER_ARM ], @@ -3222,6 +3259,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HYDRO_PUMP ], [ 1, Moves.BELLY_DRUM ], [ 1, Moves.POUND ], + [ 1, Moves.WATER_SPORT ], // Previous Stage Move ], [Species.HOPPIP]: [ [ 1, Moves.TACKLE ], @@ -3315,9 +3353,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 39, Moves.SEED_BOMB ], ], [Species.SUNFLORA]: [ + [ RELEARN_MOVE, Moves.SEED_BOMB ], // Previous Stage Move [ 1, Moves.POUND ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWTH ], + [ 1, Moves.ENDEAVOR ], // Previous Stage Move + [ 1, Moves.SYNTHESIS ], // Previous Stage Move [ 4, Moves.INGRAIN ], [ 7, Moves.ABSORB ], [ 10, Moves.MEGA_DRAIN ], @@ -3382,6 +3423,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ESPEON]: [ [ EVOLVE_MOVE, Moves.GLITZY_GLOW ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -3408,6 +3450,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.UMBREON]: [ [ EVOLVE_MOVE, Moves.BADDY_BAD ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -3464,6 +3507,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 15, Moves.DISABLE ], [ 18, Moves.WATER_PULSE ], [ 21, Moves.HEADBUTT ], + [ 24, Moves.ZEN_HEADBUTT ], // Previous Stage Move, Galar Slowking Level [ 27, Moves.AMNESIA ], [ 30, Moves.SURF ], [ 33, Moves.SLACK_OFF ], @@ -3562,7 +3606,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DUNSPARCE]: [ [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.FLAIL ], - [ 1, Moves.TACKLE ], //Custom + [ 1, Moves.TACKLE ], // Custom [ 4, Moves.MUD_SLAP ], [ 8, Moves.ROLLOUT ], [ 12, Moves.GLARE ], @@ -3609,6 +3653,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 12, Moves.DRAGON_BREATH ], [ 16, Moves.CURSE ], [ 20, Moves.ROCK_SLIDE ], + [ 22, Moves.GYRO_BALL ], // Custom from USUM [ 24, Moves.SCREECH ], [ 28, Moves.SAND_TOMB ], [ 32, Moves.STEALTH_ROCK ], @@ -3688,6 +3733,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.DOUBLE_HIT ], [ 24, Moves.SLASH ], [ 28, Moves.FOCUS_ENERGY ], + [ 30, Moves.STEEL_WING ], // Custom [ 32, Moves.IRON_DEFENSE ], [ 36, Moves.IRON_HEAD ], [ 40, Moves.X_SCISSOR ], @@ -3765,8 +3811,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], - [ 1, Moves.FAKE_TEARS ], [ 1, Moves.COVET ], + [ 1, Moves.FLING ], // Previous Stage Move + [ 1, Moves.BABY_DOLL_EYES ], // Previous Stage Move + [ 1, Moves.FAKE_TEARS ], + [ 1, Moves.CHARM ], // Previous Stage Move [ 8, Moves.FURY_SWIPES ], [ 13, Moves.PAYBACK ], [ 17, Moves.SWEET_SCENT ], @@ -3783,7 +3832,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SLUGMA]: [ [ 1, Moves.SMOG ], [ 1, Moves.YAWN ], - [ 5, Moves.EMBER ], //Custom, Moved from Level 6 to 5 + [ 5, Moves.EMBER ], // Custom, Moved from Level 6 to 5 [ 8, Moves.ROCK_THROW ], [ 13, Moves.HARDEN ], [ 20, Moves.CLEAR_SMOG ], @@ -3898,7 +3947,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 48, Moves.SOAK ], [ 54, Moves.HYPER_BEAM ], ], - [Species.DELIBIRD]: [ //Given a custom level up learnset + [Species.DELIBIRD]: [ // Given a custom level up learnset [ 1, Moves.PRESENT ], [ 1, Moves.METRONOME ], [ 5, Moves.FAKE_OUT ], @@ -3991,6 +4040,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 62, Moves.INFERNO ], ], [Species.KINGDRA]: [ + [ RELEARN_MOVE, Moves.LASER_FOCUS ], // Previous Stage Move [ 1, Moves.LEER ], [ 1, Moves.WATER_GUN ], [ 1, Moves.SMOKESCREEN ], @@ -4025,9 +4075,17 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.DONPHAN]: [ [ EVOLVE_MOVE, Moves.FURY_ATTACK ], - [ 1, Moves.HORN_ATTACK ], + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.GROWL ], + [ 1, Moves.HORN_ATTACK ], [ 1, Moves.DEFENSE_CURL ], + [ 1, Moves.ODOR_SLEUTH ], // Previous Stage Move + [ 1, Moves.FLAIL ], // Previous Stage Move + [ 1, Moves.ENDURE ], // Previous Stage Move + [ 1, Moves.TAKE_DOWN ], // Previous Stage Move + [ 1, Moves.CHARM ], // Previous Stage Move + [ 1, Moves.LAST_RESORT ], // Previous Stage Move + [ 1, Moves.DOUBLE_EDGE ], // Previous Stage Move [ 1, Moves.THUNDER_FANG ], [ 1, Moves.FIRE_FANG ], [ 1, Moves.BULLDOZE ], @@ -4047,6 +4105,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CONVERSION ], [ 1, Moves.RECYCLE ], [ 1, Moves.MAGNET_RISE ], + [ 1, Moves.MAGIC_COAT ], // Previous Stage Move [ 15, Moves.THUNDER_SHOCK ], [ 20, Moves.PSYBEAM ], [ 25, Moves.CONVERSION_2 ], @@ -4093,6 +4152,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.FOCUS_ENERGY ], [ 1, Moves.FAKE_OUT ], [ 1, Moves.HELPING_HAND ], + [ 10, Moves.LOW_SWEEP ], // Custom + [ 10, Moves.MACH_PUNCH ], // Custom + [ 10, Moves.RAPID_SPIN ], // Custom ], [Species.HITMONTOP]: [ [ EVOLVE_MOVE, Moves.TRIPLE_KICK ], @@ -4104,6 +4166,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.FEINT ], [ 1, Moves.PURSUIT ], [ 1, Moves.ROLLING_KICK ], + [ 1, Moves.LOW_SWEEP ], // Previous Stage Move, Custom + [ 1, Moves.MACH_PUNCH ], // Previous Stage Move, Custom [ 4, Moves.QUICK_ATTACK ], [ 8, Moves.GYRO_BALL ], [ 12, Moves.DETECT ], @@ -4513,6 +4577,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MARSHTOMP]: [ [ EVOLVE_MOVE, Moves.MUD_SHOT ], + [ RELEARN_MOVE, Moves.SURF ], // Previous Stage Move [ RELEARN_MOVE, Moves.ROCK_SMASH ], [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], @@ -4634,10 +4699,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SILCOON]: [ [ EVOLVE_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.TACKLE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STRING_SHOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.POISON_STING ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.HARDEN ], ], [Species.BEAUTIFLY]: [ [ EVOLVE_MOVE, Moves.GUST ], + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.BUG_BITE ], [ 1, Moves.GUST ], [ 1, Moves.HARDEN ], @@ -4658,10 +4728,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CASCOON]: [ [ EVOLVE_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.TACKLE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STRING_SHOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.POISON_STING ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.HARDEN ], ], [Species.DUSTOX]: [ [ EVOLVE_MOVE, Moves.GUST ], + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.BUG_BITE ], [ 1, Moves.GUST ], [ 1, Moves.HARDEN ], @@ -4701,6 +4776,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ABSORB ], [ 1, Moves.FLAIL ], [ 1, Moves.FAKE_OUT ], + [ 1, Moves.RAIN_DANCE ], // Previous Stage Move [ 1, Moves.KNOCK_OFF ], [ 1, Moves.TEETER_DANCE ], [ 1, Moves.ASTONISH ], @@ -4728,6 +4804,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ RELEARN_MOVE, Moves.ASTONISH ], [ RELEARN_MOVE, Moves.ENERGY_BALL ], [ RELEARN_MOVE, Moves.ZEN_HEADBUTT ], + [ RELEARN_MOVE, Moves.LEECH_SEED ], // Previous Stage Move + [ RELEARN_MOVE, Moves.GIGA_DRAIN ], // Previous Stage Move [ 1, Moves.FAKE_OUT ], [ 1, Moves.BUBBLE_BEAM ], [ 1, Moves.RAIN_DANCE ], @@ -4757,8 +4835,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.EXPLOSION ], [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], + [ 1, Moves.BIDE ], // Previous Stage Move [ 1, Moves.ABSORB ], [ 1, Moves.ASTONISH ], + [ 1, Moves.HEADBUTT ], // Previous Stage Move [ 9, Moves.GROWTH ], [ 12, Moves.ROLLOUT ], [ 18, Moves.MEGA_DRAIN ], @@ -4773,11 +4853,13 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ EVOLVE_MOVE, Moves.LEAF_BLADE ], [ RELEARN_MOVE, Moves.WHIRLWIND ], [ RELEARN_MOVE, Moves.TACKLE ], + [ RELEARN_MOVE, Moves.BIDE ], // Previous Stage Move [ RELEARN_MOVE, Moves.ABSORB ], [ RELEARN_MOVE, Moves.MEGA_DRAIN ], [ RELEARN_MOVE, Moves.GROWTH ], [ RELEARN_MOVE, Moves.RAZOR_LEAF ], [ RELEARN_MOVE, Moves.HARDEN ], + [ RELEARN_MOVE, Moves.HEADBUTT ], // Previous Stage Move [ RELEARN_MOVE, Moves.EXPLOSION ], [ RELEARN_MOVE, Moves.ROLLOUT ], [ RELEARN_MOVE, Moves.SWAGGER ], @@ -4930,11 +5012,17 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 38, Moves.STICKY_WEB ], ], [Species.MASQUERAIN]: [ + [ RELEARN_MOVE, Moves.BATON_PASS ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STICKY_WEB ], // Previous Stage Move [ 1, Moves.WHIRLWIND ], [ 1, Moves.WATER_GUN ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.SOAK ], + [ 1, Moves.BUBBLE_BEAM ], // Previous Stage Move + [ 1, Moves.AGILITY ], // Previous Stage Move + [ 1, Moves.MIST ], // Previous Stage Move + [ 1, Moves.HAZE ], // Previous Stage Move [ 1, Moves.OMINOUS_WIND ], [ 17, Moves.GUST ], [ 22, Moves.SCARY_FACE ], @@ -4963,6 +5051,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ EVOLVE_MOVE, Moves.MACH_PUNCH ], [ RELEARN_MOVE, Moves.SPORE ], [ 1, Moves.POISON_POWDER ], + [ 1, Moves.GIGA_DRAIN ], // Previous Stage Move [ 1, Moves.GROWTH ], [ 1, Moves.TOXIC ], [ 1, Moves.ABSORB ], @@ -4994,9 +5083,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 38, Moves.PLAY_ROUGH ], ], [Species.VIGOROTH]: [ + [ RELEARN_MOVE, Moves.PLAY_ROUGH ], // Previous Stage Move [ 1, Moves.SCRATCH ], + [ 1, Moves.YAWN ], // Previous Stage Move [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.SLACK_OFF ], // Previous Stage Move [ 1, Moves.ENCORE ], + [ 1, Moves.HEADBUTT ], // Previous Stage Move + [ 1, Moves.AMNESIA ], // Previous Stage Move + [ 1, Moves.COVET ], // Previous Stage Move + [ 1, Moves.FLAIL ], // Previous Stage Move [ 1, Moves.UPROAR ], [ 14, Moves.FURY_SWIPES ], [ 17, Moves.ENDURE ], @@ -5008,11 +5104,20 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SLAKING]: [ [ EVOLVE_MOVE, Moves.SWAGGER ], + [ RELEARN_MOVE, Moves.PLAY_ROUGH ], // Previous Stage Move + [ RELEARN_MOVE, Moves.FOCUS_PUNCH ], // Previous Stage Move [ 1, Moves.SUCKER_PUNCH ], [ 1, Moves.SCRATCH ], [ 1, Moves.YAWN ], + [ 1, Moves.FOCUS_ENERGY ], // Previous Stage Move [ 1, Moves.ENCORE ], [ 1, Moves.SLACK_OFF ], + [ 1, Moves.UPROAR ], // Previous Stage Move + [ 1, Moves.FURY_SWIPES ], // Previous Stage Move + [ 1, Moves.ENDURE ], // Previous Stage Move + [ 1, Moves.HEADBUTT ], // Previous Stage Move + [ 1, Moves.SLASH ], // Previous Stage Move + [ 1, Moves.REVERSAL ], // Previous Stage Move [ 17, Moves.AMNESIA ], [ 23, Moves.COVET ], [ 27, Moves.THROAT_CHOP ], @@ -5148,6 +5253,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BRINE ], [ 1, Moves.TACKLE ], [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.SAND_ATTACK ], // Previous Stage Move [ 1, Moves.ARM_THRUST ], [ 10, Moves.FAKE_OUT ], [ 13, Moves.FORCE_PALM ], @@ -5351,6 +5457,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.DETECT ], [ 1, Moves.WORK_UP ], [ 1, Moves.BIDE ], + [ 1, Moves.REVERSAL ], // Previous Stage Move [ 12, Moves.ENDURE ], [ 15, Moves.FEINT ], [ 17, Moves.FORCE_PALM ], @@ -5520,6 +5627,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.POISON_GAS ], [ 1, Moves.WRING_OUT ], [ 1, Moves.SLUDGE ], + [ 1, Moves.PAIN_SPLIT ], // Previous Stage Move [ 12, Moves.AMNESIA ], [ 17, Moves.ACID_SPRAY ], [ 20, Moves.ENCORE ], @@ -5565,7 +5673,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.WAILMER]: [ [ 1, Moves.SPLASH ], - [ 1, Moves.TACKLE ], //Custom + [ 1, Moves.TACKLE ], // Custom [ 3, Moves.GROWL ], [ 6, Moves.ASTONISH ], [ 12, Moves.WATER_GUN ], @@ -5586,6 +5694,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SOAK ], [ 1, Moves.NOBLE_ROAR ], [ 1, Moves.SPLASH ], + [ 1, Moves.TACKLE ], // Previous Stage Move, Custom [ 1, Moves.GROWL ], [ 1, Moves.ASTONISH ], [ 1, Moves.WATER_GUN ], @@ -5620,6 +5729,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CAMERUPT]: [ [ EVOLVE_MOVE, Moves.ROCK_SLIDE ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], // Previous Stage Move + [ RELEARN_MOVE, Moves.DOUBLE_EDGE ], // Previous Stage Move [ 1, Moves.FISSURE ], [ 1, Moves.ERUPTION ], [ 1, Moves.GROWL ], @@ -5658,7 +5769,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SPOINK]: [ [ 1, Moves.SPLASH ], - [ 5, Moves.CONFUSION ], //Custom, Moved from Level 7 to 5 + [ 5, Moves.CONFUSION ], // Custom, Moved from Level 7 to 5 [ 10, Moves.GROWL ], [ 14, Moves.PSYBEAM ], [ 18, Moves.PSYCH_UP ], @@ -5676,6 +5787,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BELCH ], [ 1, Moves.SPLASH ], [ 1, Moves.CONFUSION ], + [ 1, Moves.GROWL ], // Previous Stage Move [ 1, Moves.PSYBEAM ], [ 18, Moves.PSYCH_UP ], [ 22, Moves.CONFUSE_RAY ], @@ -6167,7 +6279,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SHUPPET]: [ [ 1, Moves.ASTONISH ], - [ 1, Moves.PURSUIT ], //Custom + [ 1, Moves.PURSUIT ], // Custom [ 4, Moves.SCREECH ], [ 7, Moves.NIGHT_SHADE ], [ 10, Moves.SPITE ], @@ -6183,6 +6295,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BANETTE]: [ [ EVOLVE_MOVE, Moves.KNOCK_OFF ], + [ 1, Moves.ASTONISH ], // Previous Stage Move + [ 1, Moves.PURSUIT ], // Previous Stage Move, Custom [ 1, Moves.SCREECH ], [ 1, Moves.NIGHT_SHADE ], [ 1, Moves.SPITE ], @@ -6199,7 +6313,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DUSKULL]: [ [ 1, Moves.ASTONISH ], [ 1, Moves.LEER ], - [ 1, Moves.PURSUIT ], //Custom + [ 1, Moves.PURSUIT ], // Custom [ 4, Moves.DISABLE ], [ 8, Moves.SHADOW_SNEAK ], [ 12, Moves.CONFUSE_RAY ], @@ -6221,6 +6335,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BIND ], [ 1, Moves.ASTONISH ], [ 1, Moves.LEER ], + [ 1, Moves.PURSUIT ], // Previous Stage Move, Custom [ 1, Moves.DISABLE ], [ 1, Moves.SHADOW_SNEAK ], [ 12, Moves.CONFUSE_RAY ], @@ -6252,7 +6367,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CHIMECHO]: [ [ 1, Moves.HEALING_WISH ], + [ 1, Moves.LAST_RESORT ], // Previous Stage Move + [ 1, Moves.ENTRAINMENT ], // Previous Stage Move [ 1, Moves.WRAP ], + [ 1, Moves.PSYWAVE ], // Previous Stage Move, Custom [ 1, Moves.GROWL ], [ 1, Moves.ASTONISH ], [ 1, Moves.CONFUSION ], @@ -6392,6 +6510,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.SHELL_SMASH ], ], [Species.HUNTAIL]: [ + [ 1, Moves.CLAMP ], // Previous Stage Move [ 1, Moves.WATER_GUN ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.SHELL_SMASH ], @@ -6412,6 +6531,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 50, Moves.HYDRO_PUMP ], ], [Species.GOREBYSS]: [ + [ 1, Moves.CLAMP ], // Previous Stage Move [ 1, Moves.WATER_GUN ], [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.SHELL_SMASH ], @@ -6497,6 +6617,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SALAMENCE]: [ [ EVOLVE_MOVE, Moves.FLY ], + [ RELEARN_MOVE, Moves.OUTRAGE ], // Previous Stage Move [ 1, Moves.PROTECT ], [ 1, Moves.DRAGON_TAIL ], [ 1, Moves.DUAL_WINGBEAT ], @@ -6712,7 +6833,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 98, Moves.DOOM_DESIRE ], ], [Species.DEOXYS]: [ - [ 1, Moves.CONFUSION ], //Custom + [ 1, Moves.CONFUSION ], // Custom [ 1, Moves.LEER ], [ 1, Moves.WRAP ], [ 7, Moves.NIGHT_SHADE ], @@ -6731,8 +6852,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TURTWIG]: [ [ 1, Moves.TACKLE ], [ 5, Moves.WITHDRAW ], - [ 5, Moves.LEAFAGE ], //Custom, moved from 10 to 5, BDSP - [ 9, Moves.GROWTH ], //Fill empty moveslot, from BDSP level 6 + [ 5, Moves.LEAFAGE ], // Custom, moved from 10 to 5, BDSP + [ 9, Moves.GROWTH ], // Fill empty moveslot, from BDSP level 6 [ 13, Moves.RAZOR_LEAF ], [ 17, Moves.CURSE ], [ 21, Moves.BITE ], @@ -6748,6 +6869,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ABSORB ], [ 1, Moves.WITHDRAW ], [ 1, Moves.LEAFAGE ], + [ 1, Moves.GROWTH ], // Previous Stage Move [ 13, Moves.RAZOR_LEAF ], [ 17, Moves.CURSE ], [ 22, Moves.BITE ], @@ -6763,6 +6885,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.ABSORB ], [ 1, Moves.LEAFAGE ], + [ 1, Moves.GROWTH ], // Previous Stage Move [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.WITHDRAW ], [ 1, Moves.WOOD_HAMMER ], @@ -6779,7 +6902,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CHIMCHAR]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], - [ 5, Moves.EMBER ], //Custom, moved from 7 to 5 + [ 5, Moves.EMBER ], // Custom, moved from 7 to 5 [ 9, Moves.TAUNT ], [ 15, Moves.FURY_SWIPES ], [ 17, Moves.FLAME_WHEEL ], @@ -6793,6 +6916,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MONFERNO]: [ [ EVOLVE_MOVE, Moves.MACH_PUNCH ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.FACADE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.FLAMETHROWER ], // Previous Stage Move [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -6810,7 +6936,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.INFERNAPE]: [ [ EVOLVE_MOVE, Moves.CLOSE_COMBAT ], [ RELEARN_MOVE, Moves.TAUNT ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.FACADE ], // Previous Stage Move [ RELEARN_MOVE, Moves.SLACK_OFF ], + [ RELEARN_MOVE, Moves.FLAMETHROWER ], // Previous Stage Move [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.EMBER ], @@ -6828,7 +6957,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.PIPLUP]: [ [ 1, Moves.POUND ], [ 4, Moves.GROWL ], - [ 5, Moves.WATER_GUN ], //Custom, moved from 8 to 5 + [ 5, Moves.WATER_GUN ], // Custom, moved from 8 to 5 [ 11, Moves.CHARM ], [ 15, Moves.PECK ], [ 18, Moves.BUBBLE_BEAM ], @@ -6845,6 +6974,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], + [ 1, Moves.CHARM ], // Previous Stage Move [ 15, Moves.PECK ], [ 19, Moves.BUBBLE_BEAM ], [ 24, Moves.SWAGGER ], @@ -6860,6 +6990,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], + [ 1, Moves.CHARM ], // Previous Stage Move [ 1, Moves.METAL_CLAW ], [ 11, Moves.SWORDS_DANCE ], [ 15, Moves.PECK ], @@ -6963,6 +7094,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.BIDE ], + [ 1, Moves.STRUGGLE_BUG ], // Previous Stage Move + [ 1, Moves.BUG_BITE ], // Previous Stage Move [ 14, Moves.ABSORB ], [ 18, Moves.SING ], [ 22, Moves.FOCUS_ENERGY ], @@ -7113,13 +7246,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BURMY]: [ [ 1, Moves.PROTECT ], - [ 1, Moves.STRUGGLE_BUG ], //Custom + [ 1, Moves.STRUGGLE_BUG ], // Custom [ 10, Moves.TACKLE ], [ 15, Moves.BUG_BITE ], [ 20, Moves.STRING_SHOT ], ], [Species.WORMADAM]: [ [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], + [ 1, Moves.STRUGGLE_BUG ], // Previous Stage Move, Custom [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.SUCKER_PUNCH ], @@ -7140,6 +7274,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MOTHIM]: [ [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], + [ 1, Moves.STRUGGLE_BUG ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.BUG_BITE ], @@ -7221,6 +7356,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 49, Moves.WAVE_CRASH ], ], [Species.FLOATZEL]: [ + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.GROWL ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.CRUNCH ], @@ -7368,6 +7504,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.LOPUNNY]: [ [ EVOLVE_MOVE, Moves.RETURN ], + [ 1, Moves.FRUSTRATION ], // Previous Stage Move [ 1, Moves.POUND ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.SPLASH ], @@ -7389,6 +7526,16 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 56, Moves.HIGH_JUMP_KICK ], ], [Species.MISMAGIUS]: [ + // Previous Stage Relearn Learnset + [ RELEARN_MOVE, Moves.CONFUSION ], + [ RELEARN_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.MEAN_LOOK ], + [ RELEARN_MOVE, Moves.HEX ], + [ RELEARN_MOVE, Moves.PSYBEAM ], + [ RELEARN_MOVE, Moves.PAIN_SPLIT ], + [ RELEARN_MOVE, Moves.PAYBACK ], + [ RELEARN_MOVE, Moves.SHADOW_BALL ], + [ RELEARN_MOVE, Moves.PERISH_SONG ], [ 1, Moves.GROWL ], [ 1, Moves.SPITE ], [ 1, Moves.PSYWAVE ], @@ -7400,11 +7547,18 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.MYSTICAL_FIRE ], ], [Species.HONCHKROW]: [ - [ 1, Moves.WING_ATTACK ], - [ 1, Moves.HAZE ], + [ 1, Moves.PECK ], // Previous Stage Move [ 1, Moves.ASTONISH ], + [ 1, Moves.GUST ], // Previous Stage Move + [ 1, Moves.HAZE ], + [ 1, Moves.WING_ATTACK ], + [ 1, Moves.NIGHT_SHADE ], // Previous Stage Move + [ 1, Moves.ASSURANCE ], // Previous Stage Move + [ 1, Moves.TAUNT ], // Previous Stage Move + [ 1, Moves.MEAN_LOOK ], // Previous Stage Move [ 1, Moves.SUCKER_PUNCH ], [ 1, Moves.NIGHT_SLASH ], + [ 1, Moves.TORMENT ], // Previous Stage Move [ 1, Moves.QUASH ], [ 1, Moves.PURSUIT ], [ 25, Moves.SWAGGER ], @@ -7449,7 +7603,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CHINGLING]: [ [ 1, Moves.WRAP ], - [ 1, Moves.PSYWAVE ], //Custom + [ 1, Moves.PSYWAVE ], // Custom [ 4, Moves.GROWL ], [ 7, Moves.ASTONISH ], [ 10, Moves.CONFUSION ], @@ -7482,6 +7636,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SMOKESCREEN ], [ 1, Moves.POISON_GAS ], [ 1, Moves.FEINT ], + [ 1, Moves.ACID_SPRAY ], // Previous Stage Move [ 12, Moves.FURY_SWIPES ], [ 15, Moves.FOCUS_ENERGY ], [ 18, Moves.BITE ], @@ -7533,7 +7688,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.BONSLY]: [ [ 1, Moves.FAKE_TEARS ], [ 1, Moves.COPYCAT ], - [ 1, Moves.TACKLE ], //Custom + [ 1, Moves.TACKLE ], // Custom [ 4, Moves.FLAIL ], [ 8, Moves.ROCK_THROW ], [ 12, Moves.BLOCK ], @@ -7554,11 +7709,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 4, Moves.BATON_PASS ], [ 8, Moves.ENCORE ], [ 12, Moves.CONFUSION ], - [ 16, Moves.MIMIC ], //Custom, swapped with Role Play to be closer to USUM + [ 16, Moves.MIMIC ], // Custom, swapped with Role Play to be closer to USUM [ 20, Moves.PROTECT ], [ 24, Moves.RECYCLE ], [ 28, Moves.PSYBEAM ], - [ 32, Moves.ROLE_PLAY ], //Custom, swapped with Mimic + [ 32, Moves.ROLE_PLAY ], // Custom, swapped with Mimic [ 36, Moves.LIGHT_SCREEN ], [ 36, Moves.REFLECT ], [ 36, Moves.SAFEGUARD ], @@ -7696,6 +7851,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.LUCARIO]: [ [ EVOLVE_MOVE, Moves.AURA_SPHERE ], [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.ENDURE ], // Previous Stage Move [ 1, Moves.SCREECH ], [ 1, Moves.REVERSAL ], [ 1, Moves.DETECT ], @@ -7836,7 +7992,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.CARNIVINE]: [ [ 1, Moves.BIND ], [ 1, Moves.GROWTH ], - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom [ 7, Moves.BITE ], [ 11, Moves.VINE_WHIP ], [ 17, Moves.SWEET_SCENT ], @@ -7973,6 +8129,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SUPERSONIC ], [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.LICK ], + [ 1, Moves.TACKLE ], // Previous Stage Move, Custom [ 1, Moves.ROLLOUT ], [ 1, Moves.WRING_OUT ], [ 6, Moves.REST ], @@ -8086,7 +8243,9 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ RELEARN_MOVE, Moves.HYPNOSIS ], [ 1, Moves.TACKLE ], [ 1, Moves.DOUBLE_TEAM ], + [ 1, Moves.AIR_CUTTER ], // Previous Stage Move [ 1, Moves.NIGHT_SLASH ], + [ 1, Moves.WING_ATTACK ], // Previous Stage Move [ 1, Moves.AIR_SLASH ], [ 1, Moves.BUG_BUZZ ], [ 14, Moves.QUICK_ATTACK ], @@ -8102,6 +8261,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.LEAFEON]: [ [ EVOLVE_MOVE, Moves.SAPPY_SEED ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -8129,6 +8289,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.GLACEON]: [ [ EVOLVE_MOVE, Moves.FREEZY_FROST ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -8154,8 +8315,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 60, Moves.LAST_RESORT ], ], [Species.GLISCOR]: [ + [ 1, Moves.POISON_STING ], // Previous Stage Move [ 1, Moves.SAND_ATTACK ], [ 1, Moves.HARDEN ], + [ 1, Moves.POISON_TAIL ], // Previous Stage Move + [ 1, Moves.SLASH ], // Previous Stage Move [ 1, Moves.POISON_JAB ], [ 1, Moves.THUNDER_FANG ], [ 1, Moves.ICE_FANG ], @@ -8248,8 +8412,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.PROBOPASS]: [ [ EVOLVE_MOVE, Moves.TRI_ATTACK ], [ 1, Moves.TACKLE ], + [ 1, Moves.HARDEN ], // Previous Stage Move [ 1, Moves.IRON_DEFENSE ], [ 1, Moves.BLOCK ], + [ 1, Moves.ROCK_THROW ], // Previous Stage Move [ 1, Moves.GRAVITY ], [ 1, Moves.MAGNET_RISE ], [ 1, Moves.WIDE_GUARD ], @@ -8275,6 +8441,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LEER ], [ 1, Moves.DISABLE ], [ 1, Moves.ASTONISH ], + [ 1, Moves.PURSUIT ], // Previous Stage Move, Custom [ 1, Moves.SHADOW_PUNCH ], [ 1, Moves.GRAVITY ], [ 1, Moves.SHADOW_SNEAK ], @@ -8298,6 +8465,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.POWDER_SNOW ], [ 1, Moves.PROTECT ], [ 1, Moves.DESTINY_BOND ], + [ 1, Moves.WEATHER_BALL ], // Previous Stage Move [ 1, Moves.CRUNCH ], [ 1, Moves.ASTONISH ], [ 1, Moves.ICE_FANG ], @@ -8538,7 +8706,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DARKRAI]: [ [ 1, Moves.DISABLE ], [ 1, Moves.OMINOUS_WIND ], - [ 1, Moves.PURSUIT ], //Custom + [ 1, Moves.PURSUIT ], // Custom [ 11, Moves.QUICK_ATTACK ], [ 20, Moves.HYPNOSIS ], [ 29, Moves.SUCKER_PUNCH ], @@ -8551,7 +8719,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 93, Moves.DARK_PULSE ], ], [Species.SHAYMIN]: [ - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom [ 1, Moves.GROWTH ], [ 10, Moves.MAGICAL_LEAF ], [ 19, Moves.LEECH_SEED ], @@ -8603,7 +8771,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SNIVY]: [ [ 1, Moves.TACKLE ], [ 4, Moves.LEER ], - [ 5, Moves.VINE_WHIP ], //Custom, moved from 7 to 5 + [ 5, Moves.VINE_WHIP ], // Custom, moved from 7 to 5 [ 10, Moves.WRAP ], [ 13, Moves.GROWTH ], [ 16, Moves.MAGICAL_LEAF ], @@ -8651,7 +8819,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.TEPIG]: [ [ 1, Moves.TACKLE ], [ 3, Moves.TAIL_WHIP ], - [ 5, Moves.EMBER ], //Custom, moved from 7 to 5 + [ 5, Moves.EMBER ], // Custom, moved from 7 to 5 [ 9, Moves.ENDURE ], [ 13, Moves.DEFENSE_CURL ], [ 15, Moves.FLAME_CHARGE ], @@ -8705,7 +8873,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.OSHAWOTT]: [ [ 1, Moves.TACKLE ], [ 5, Moves.TAIL_WHIP ], - [ 5, Moves.WATER_GUN ], //Custom, moved from 7 to 5 + [ 5, Moves.WATER_GUN ], // Custom, moved from 7 to 5 [ 11, Moves.SOAK ], [ 13, Moves.FOCUS_ENERGY ], [ 17, Moves.RAZOR_SHELL ], @@ -8776,6 +8944,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.WATCHOG]: [ [ EVOLVE_MOVE, Moves.CONFUSE_RAY ], + [ RELEARN_MOVE, Moves.WORK_UP ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.LEER ], [ 1, Moves.BITE ], @@ -8895,6 +9064,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.CRUNCH ], ], [Species.SIMISAGE]: [ + // Previous Stage Relearn Learnset + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.PLAY_NICE ], + [ RELEARN_MOVE, Moves.VINE_WHIP ], + [ RELEARN_MOVE, Moves.LEECH_SEED ], + [ RELEARN_MOVE, Moves.BITE ], + [ RELEARN_MOVE, Moves.TORMENT ], + [ RELEARN_MOVE, Moves.FLING ], + [ RELEARN_MOVE, Moves.ACROBATICS ], + [ RELEARN_MOVE, Moves.GRASS_KNOT ], + [ RELEARN_MOVE, Moves.RECYCLE ], + [ RELEARN_MOVE, Moves.NATURAL_GIFT ], + [ RELEARN_MOVE, Moves.CRUNCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], [ 1, Moves.FURY_SWIPES ], @@ -8919,6 +9101,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.CRUNCH ], ], [Species.SIMISEAR]: [ + // Previous Stage Relearn Learnset + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.PLAY_NICE ], + [ RELEARN_MOVE, Moves.INCINERATE ], + [ RELEARN_MOVE, Moves.YAWN ], + [ RELEARN_MOVE, Moves.BITE ], + [ RELEARN_MOVE, Moves.AMNESIA ], + [ RELEARN_MOVE, Moves.FLING ], + [ RELEARN_MOVE, Moves.ACROBATICS ], + [ RELEARN_MOVE, Moves.FIRE_BLAST ], + [ RELEARN_MOVE, Moves.RECYCLE ], + [ RELEARN_MOVE, Moves.NATURAL_GIFT ], + [ RELEARN_MOVE, Moves.CRUNCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], [ 1, Moves.FURY_SWIPES ], @@ -8943,6 +9138,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 43, Moves.CRUNCH ], ], [Species.SIMIPOUR]: [ + // Previous Stage Relearn Learnset + [ RELEARN_MOVE, Moves.SCRATCH ], + [ RELEARN_MOVE, Moves.PLAY_NICE ], + [ RELEARN_MOVE, Moves.WATER_GUN ], + [ RELEARN_MOVE, Moves.WATER_SPORT ], + [ RELEARN_MOVE, Moves.BITE ], + [ RELEARN_MOVE, Moves.TAUNT ], + [ RELEARN_MOVE, Moves.FLING ], + [ RELEARN_MOVE, Moves.ACROBATICS ], + [ RELEARN_MOVE, Moves.BRINE ], + [ RELEARN_MOVE, Moves.RECYCLE ], + [ RELEARN_MOVE, Moves.NATURAL_GIFT ], + [ RELEARN_MOVE, Moves.CRUNCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], [ 1, Moves.FURY_SWIPES ], @@ -8967,6 +9175,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 52, Moves.WONDER_ROOM ], ], [Species.MUSHARNA]: [ + [ 1, Moves.PSYWAVE ], // Previous Stage Move [ 1, Moves.PSYBEAM ], [ 1, Moves.PSYCHIC ], [ 1, Moves.HYPNOSIS ], @@ -9295,7 +9504,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 70, Moves.HYDRO_PUMP ], ], [Species.THROH]: [ - [ 1, Moves.ROCK_SMASH ], //Custom + [ 1, Moves.ROCK_SMASH ], // Custom [ 1, Moves.LEER ], [ 1, Moves.BIDE ], [ 1, Moves.MAT_BLOCK ], @@ -9355,9 +9564,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.LEAVANNY]: [ [ EVOLVE_MOVE, Moves.SLASH ], [ RELEARN_MOVE, Moves.BUG_BITE ], + [ RELEARN_MOVE, Moves.STICKY_WEB ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BUZZ ], // Previous Stage Move + [ 1, Moves.PROTECT ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.STRING_SHOT ], + [ 1, Moves.GRASS_WHISTLE ], // Previous Stage Move + [ 1, Moves.ENDURE ], // Previous Stage Move + [ 1, Moves.FLAIL ], // Previous Stage Move [ 1, Moves.FALSE_SWIPE ], [ 22, Moves.STRUGGLE_BUG ], [ 29, Moves.FELL_STINGER ], @@ -9890,6 +10105,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TORMENT ], [ 1, Moves.U_TURN ], [ 1, Moves.HONE_CLAWS ], + [ 1, Moves.SCARY_FACE ], // Previous Stage Move [ 1, Moves.PURSUIT ], [ 12, Moves.FURY_SWIPES ], [ 20, Moves.TAUNT ], @@ -9964,6 +10180,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 28, Moves.FAKE_TEARS ], [ 34, Moves.HEAL_BLOCK ], [ 35, Moves.PSYCH_UP ], + [ 40, Moves.PSYCHIC ], // Previous Stage Move, Gothitelle Level [ 46, Moves.FLATTER ], [ 52, Moves.FUTURE_SIGHT ], [ 58, Moves.MAGIC_ROOM ], @@ -10081,7 +10298,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.VANILLITE]: [ [ 1, Moves.HARDEN ], [ 1, Moves.ASTONISH ], - [ 1, Moves.POWDER_SNOW ], //Custom + [ 1, Moves.POWDER_SNOW ], // Custom [ 4, Moves.TAUNT ], [ 8, Moves.MIST ], [ 12, Moves.ICY_WIND ], @@ -10100,6 +10317,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HARDEN ], [ 1, Moves.TAUNT ], [ 1, Moves.ASTONISH ], + [ 1, Moves.POWDER_SNOW ], // Previous Stage Move, Custom [ 12, Moves.ICY_WIND ], [ 16, Moves.AVALANCHE ], [ 20, Moves.HAIL ], @@ -10116,6 +10334,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.HARDEN ], [ 1, Moves.TAUNT ], [ 1, Moves.ASTONISH ], + [ 1, Moves.POWDER_SNOW ], // Previous Stage Move, Custom [ 1, Moves.WEATHER_BALL ], [ 1, Moves.ICICLE_CRASH ], [ 1, Moves.FREEZE_DRY ], @@ -10428,6 +10647,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.EELEKTRIK]: [ [ EVOLVE_MOVE, Moves.CRUNCH ], + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.HEADBUTT ], [ 1, Moves.THUNDER_WAVE ], [ 1, Moves.SPARK ], @@ -10445,7 +10665,15 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 74, Moves.THRASH ], ], [Species.EELEKTROSS]: [ + [ RELEARN_MOVE, Moves.THUNDERBOLT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.ACID_SPRAY ], // Previous Stage Move + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.HEADBUTT ], + [ 1, Moves.THUNDER_WAVE ], // Previous Stage Move + [ 1, Moves.SPARK ], // Previous Stage Move + [ 1, Moves.CHARGE_BEAM ], // Previous Stage Move + [ 1, Moves.ION_DELUGE ], // Previous Stage Move + [ 1, Moves.BIND ], // Previous Stage Move [ 1, Moves.THRASH ], [ 1, Moves.ACID ], [ 1, Moves.ZAP_CANNON ], @@ -10688,6 +10916,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BODY_SLAM ], [ 1, Moves.ACID ], [ 1, Moves.ABSORB ], + [ 1, Moves.PROTECT ], // Previous Stage Move [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.DOUBLE_TEAM ], [ 1, Moves.ACID_ARMOR ], @@ -10881,6 +11110,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BRAVIARY]: [ [ EVOLVE_MOVE, Moves.SUPERPOWER ], + [ RELEARN_MOVE, Moves.BRAVE_BIRD ], // Previous Stage Move [ 1, Moves.WING_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], @@ -11422,6 +11652,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.ROUND ], // Previous Stage Move + [ 1, Moves.FLING ], // Previous Stage Move + [ 1, Moves.SMACK_DOWN ], // Previous Stage Move + [ 1, Moves.BOUNCE ], // Previous Stage Move [ 1, Moves.HAZE ], [ 1, Moves.MAT_BLOCK ], [ 1, Moves.ROLE_PLAY ], @@ -11529,10 +11763,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SPEWPA]: [ [ EVOLVE_MOVE, Moves.PROTECT ], + [ RELEARN_MOVE, Moves.TACKLE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STRING_SHOT ], // Previous Stage Move + [ RELEARN_MOVE, Moves.STUN_SPORE ], // Previous Stage Move + [ RELEARN_MOVE, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.HARDEN ], ], [Species.VIVILLON]: [ [ EVOLVE_MOVE, Moves.GUST ], + [ 1, Moves.PROTECT ], // Previous Stage Move + [ 1, Moves.TACKLE ], // Previous Stage Move + [ 1, Moves.STRING_SHOT ], // Previous Stage Move + [ 1, Moves.HARDEN ], // Previous Stage Move + [ 1, Moves.BUG_BITE ], // Previous Stage Move [ 1, Moves.POISON_POWDER ], [ 1, Moves.STUN_SPORE ], [ 1, Moves.SLEEP_POWDER ], @@ -11615,6 +11858,10 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 58, Moves.SOLAR_BEAM ], ], [Species.FLORGES]: [ + [ 1, Moves.VINE_WHIP ], // Previous Stage Move + [ 1, Moves.TACKLE ], // Previous Stage Move + [ 1, Moves.FAIRY_WIND ], // Previous Stage Move + [ 1, Moves.RAZOR_LEAF ], // Previous Stage Move [ 1, Moves.SOLAR_BEAM ], [ 1, Moves.PETAL_DANCE ], [ 1, Moves.SAFEGUARD ], @@ -12106,6 +12353,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SYLVEON]: [ [ EVOLVE_MOVE, Moves.SPARKLY_SWIRL ], + [ RELEARN_MOVE, Moves.VEEVEE_VOLLEY ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.TAKE_DOWN ], [ 1, Moves.DOUBLE_EDGE ], @@ -12216,6 +12464,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], + [ 1, Moves.ACID_ARMOR ], // Previous Stage Move [ 1, Moves.DRAGON_BREATH ], [ 1, Moves.POISON_TAIL ], [ 1, Moves.FEINT ], @@ -12225,6 +12474,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.FLAIL ], [ 25, Moves.WATER_PULSE ], [ 30, Moves.RAIN_DANCE ], + [ 35, Moves.DRAGON_PULSE ], // Previous Stage Move, NatDex / Hisui Goodra Level [ 43, Moves.CURSE ], [ 49, Moves.BODY_SLAM ], [ 58, Moves.MUDDY_WATER ], @@ -12285,7 +12535,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.PUMPKABOO]: [ [ 1, Moves.ASTONISH ], [ 1, Moves.TRICK_OR_TREAT ], - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom [ 4, Moves.SHADOW_SNEAK ], [ 8, Moves.CONFUSE_RAY ], [ 12, Moves.RAZOR_LEAF ], @@ -12302,6 +12552,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.EXPLOSION ], [ 1, Moves.ASTONISH ], + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.SHADOW_SNEAK ], [ 1, Moves.TRICK_OR_TREAT ], [ 1, Moves.MOONBLAST ], @@ -12813,11 +13064,14 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CRABOMINABLE]: [ [ EVOLVE_MOVE, Moves.ICE_PUNCH ], + [ RELEARN_MOVE, Moves.CRABHAMMER ], // Previous Stage Move + [ 1, Moves.VISE_GRIP ], // Previous Stage Move [ 1, Moves.LEER ], [ 1, Moves.PROTECT ], [ 1, Moves.ROCK_SMASH ], [ 1, Moves.BUBBLE ], [ 1, Moves.PURSUIT ], + [ 1, Moves.PAYBACK ], // Previous Stage Move [ 17, Moves.BUBBLE_BEAM ], [ 22, Moves.BRICK_BREAK ], [ 25, Moves.SLAM ], @@ -13006,6 +13260,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.BUG_BITE ], [ 1, Moves.WIDE_GUARD ], [ 1, Moves.INFESTATION ], + [ 1, Moves.WATER_SPORT ], // Previous Stage Move [ 1, Moves.SPIDER_WEB ], [ 12, Moves.BUBBLE_BEAM ], [ 16, Moves.AQUA_RING ], @@ -13154,7 +13409,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.BOUNSWEET]: [ [ 1, Moves.SPLASH ], - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom [ 4, Moves.PLAY_NICE ], [ 8, Moves.RAPID_SPIN ], [ 12, Moves.RAZOR_LEAF ], @@ -13165,6 +13420,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 32, Moves.AROMATIC_MIST ], ], [Species.STEENEE]: [ + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.SPLASH ], [ 1, Moves.FLAIL ], @@ -13179,6 +13435,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.TSAREENA]: [ [ EVOLVE_MOVE, Moves.TROP_KICK ], + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.RAZOR_LEAF ], [ 1, Moves.SPLASH ], [ 1, Moves.FLAIL ], @@ -13303,7 +13560,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 68, Moves.SANDSTORM ], ], [Species.PYUKUMUKU]: [ - [ 1, Moves.COUNTER ], //Custom, Moved from Level 20 to 1 + [ 1, Moves.COUNTER ], // Custom, Moved from Level 20 to 1 [ 1, Moves.HARDEN ], [ 1, Moves.BATON_PASS ], [ 1, Moves.BIDE ], @@ -13312,7 +13569,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 5, Moves.HELPING_HAND ], [ 10, Moves.TAUNT ], [ 15, Moves.SAFEGUARD ], - [ 20, Moves.MIRROR_COAT ], //Custom + [ 20, Moves.MIRROR_COAT ], // Custom [ 25, Moves.PURIFY ], [ 30, Moves.CURSE ], [ 35, Moves.GASTRO_ACID ], @@ -13629,15 +13886,19 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.COSMOG]: [ [ 1, Moves.TELEPORT ], [ 1, Moves.SPLASH ], - [ 1, Moves.STORED_POWER ], //Custom + [ 1, Moves.STORED_POWER ], // Custom ], [Species.COSMOEM]: [ [ EVOLVE_MOVE, Moves.COSMIC_POWER ], [ 1, Moves.TELEPORT ], + [ 1, Moves.SPLASH ], // Previous Stage Move + [ 1, Moves.STORED_POWER ], // Previous Stage Move, Custom ], [Species.SOLGALEO]: [ [ EVOLVE_MOVE, Moves.SUNSTEEL_STRIKE ], [ 1, Moves.TELEPORT ], + [ 1, Moves.SPLASH ], // Previous Stage Move + [ 1, Moves.STORED_POWER ], // Previous Stage Move, Custom [ 1, Moves.METAL_CLAW ], [ 1, Moves.COSMIC_POWER ], [ 1, Moves.NOBLE_ROAR ], @@ -13660,6 +13921,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CONFUSION ], [ 1, Moves.HYPNOSIS ], [ 1, Moves.TELEPORT ], + [ 1, Moves.SPLASH ], // Previous Stage Move + [ 1, Moves.STORED_POWER ], // Previous Stage Move, Custom [ 1, Moves.COSMIC_POWER ], [ 7, Moves.NIGHT_SHADE ], [ 14, Moves.CONFUSE_RAY ], @@ -13826,7 +14089,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.MAGEARNA]: [ [ 1, Moves.HELPING_HAND ], [ 1, Moves.GYRO_BALL ], - [ 1, Moves.DISARMING_VOICE ], //Custom + [ 1, Moves.DISARMING_VOICE ], // Custom [ 1, Moves.CRAFTY_SHIELD ], [ 1, Moves.GEAR_UP ], [ 6, Moves.DEFENSE_CURL ], @@ -13867,7 +14130,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 99, Moves.CLOSE_COMBAT ], ], [Species.POIPOLE]: [ - [ RELEARN_MOVE, Moves.DRAGON_PULSE ], //Custom, made relearn + [ RELEARN_MOVE, Moves.DRAGON_PULSE ], // Custom, made relearn [ 1, Moves.GROWL ], [ 1, Moves.ACID ], [ 1, Moves.PECK ], @@ -13986,7 +14249,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.GROOKEY]: [ [ 1, Moves.SCRATCH ], [ 1, Moves.GROWL ], - [ 5, Moves.BRANCH_POKE ], //Custom, moved from 6 to 5 + [ 5, Moves.BRANCH_POKE ], // Custom, moved from 6 to 5 [ 8, Moves.TAUNT ], [ 12, Moves.RAZOR_LEAF ], [ 17, Moves.SCREECH ], @@ -14031,7 +14294,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SCORBUNNY]: [ [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], - [ 5, Moves.EMBER ], //Custom, moved from 6 to 5 + [ 5, Moves.EMBER ], // Custom, moved from 6 to 5 [ 8, Moves.QUICK_ATTACK ], [ 12, Moves.DOUBLE_KICK ], [ 17, Moves.FLAME_CHARGE ], @@ -14073,7 +14336,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SOBBLE]: [ [ 1, Moves.POUND ], [ 1, Moves.GROWL ], - [ 5, Moves.WATER_GUN ], //Custom, moved from 6 to 5 + [ 5, Moves.WATER_GUN ], // Custom, moved from 6 to 5 [ 8, Moves.BIND ], [ 12, Moves.WATER_PULSE ], [ 17, Moves.TEARFUL_LOOK ], @@ -14400,10 +14663,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.APPLIN]: [ [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom ], [Species.FLAPPLE]: [ [ EVOLVE_MOVE, Moves.WING_ATTACK ], + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.GROWTH ], [ 1, Moves.WITHDRAW ], [ 1, Moves.TWISTER ], @@ -14423,6 +14687,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.APPLETUN]: [ [ EVOLVE_MOVE, Moves.HEADBUTT ], + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.GROWTH ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], @@ -14443,7 +14708,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SILICOBRA]: [ [ 1, Moves.SAND_ATTACK ], [ 1, Moves.WRAP ], - [ 1, Moves.MUD_SLAP ], //Custom + [ 1, Moves.MUD_SLAP ], // Custom [ 5, Moves.MINIMIZE ], [ 10, Moves.BRUTAL_SWING ], [ 15, Moves.BULLDOZE ], @@ -14458,6 +14723,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SANDACONDA]: [ [ 1, Moves.SAND_ATTACK ], [ 1, Moves.WRAP ], + [ 1, Moves.MUD_SLAP ], // Previous Stage Move, Custom [ 1, Moves.MINIMIZE ], [ 1, Moves.BRUTAL_SWING ], [ 15, Moves.BULLDOZE ], @@ -14605,7 +14871,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.SINISTEA]: [ [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], - [ 1, Moves.ABSORB ], //Custom + [ 1, Moves.ABSORB ], // Custom [ 6, Moves.AROMATIC_MIST ], [ 12, Moves.MEGA_DRAIN ], [ 24, Moves.SUCKER_PUNCH ], @@ -14618,6 +14884,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.POLTEAGEIST]: [ [ EVOLVE_MOVE, Moves.TEATIME ], + [ 1, Moves.ABSORB ], // Previous Stage Move, Custom [ 1, Moves.MEGA_DRAIN ], [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], @@ -14805,6 +15072,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.MR_RIME]: [ [ 1, Moves.POUND ], + [ 1, Moves.BARRIER ], // Previous Stage Move + [ 1, Moves.TICKLE ], // Previous Stage Move [ 1, Moves.MIMIC ], [ 1, Moves.LIGHT_SCREEN ], [ 1, Moves.REFLECT ], @@ -15133,6 +15402,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.DRAGAPULT]: [ [ EVOLVE_MOVE, Moves.DRAGON_DARTS ], + [ RELEARN_MOVE, Moves.DRAGON_PULSE ], // Previous Stage Move [ 1, Moves.BITE ], [ 1, Moves.QUICK_ATTACK ], [ 1, Moves.DRAGON_BREATH ], @@ -15339,6 +15609,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.WYRDEER]: [ [ EVOLVE_MOVE, Moves.PSYSHIELD_BASH ], [ 1, Moves.TACKLE ], + [ 1, Moves.ME_FIRST ], // Previous Stage Move [ 3, Moves.LEER ], [ 7, Moves.ASTONISH ], [ 10, Moves.HYPNOSIS ], @@ -15355,6 +15626,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.KLEAVOR]: [ [ EVOLVE_MOVE, Moves.STONE_AXE ], + [ 1, Moves.WING_ATTACK ], // Previous Stage Move + [ 1, Moves.AIR_SLASH ], // Previous Stage Move [ 1, Moves.LEER ], [ 1, Moves.QUICK_ATTACK ], [ 4, Moves.FURY_CUTTER ], @@ -15364,6 +15637,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 20, Moves.DOUBLE_HIT ], [ 24, Moves.SLASH ], [ 28, Moves.FOCUS_ENERGY ], + [ 30, Moves.STEEL_WING ], // Custom [ 32, Moves.AGILITY ], [ 36, Moves.ROCK_SLIDE ], [ 40, Moves.X_SCISSOR ], @@ -15374,8 +15648,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], [ 1, Moves.LICK ], - [ 1, Moves.FAKE_TEARS ], [ 1, Moves.COVET ], + [ 1, Moves.FLING ], // Previous Stage Move + [ 1, Moves.BABY_DOLL_EYES ], // Previous Stage Move + [ 1, Moves.FAKE_TEARS ], + [ 1, Moves.CHARM ], // Previous Stage Moves [ 8, Moves.FURY_SWIPES ], [ 13, Moves.PAYBACK ], [ 17, Moves.SWEET_SCENT ], @@ -15390,6 +15667,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 64, Moves.HAMMER_ARM ], ], [Species.BASCULEGION]: [ + [ RELEARN_MOVE, Moves.FINAL_GAMBIT ], // Previous Stage Move, White Stripe currently shares moveset with other forms [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], [ 1, Moves.SHADOW_BALL ], @@ -15949,10 +16227,12 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.GARGANACL]: [ [ EVOLVE_MOVE, Moves.HAMMER_ARM ], + [ RELEARN_MOVE, Moves.IRON_DEFENSE ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.HARDEN ], [ 1, Moves.BLOCK ], [ 1, Moves.ROCK_BLAST ], + [ 1, Moves.SMACK_DOWN ], // Previous Stage Move [ 1, Moves.WIDE_GUARD ], [ 5, Moves.ROCK_THROW ], [ 7, Moves.MUD_SHOT ], @@ -16140,6 +16420,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ EVOLVE_MOVE, Moves.DOODLE ], [ 1, Moves.SCRATCH ], [ 1, Moves.LEER ], + [ 1, Moves.BITE ], // Previous Stage Move [ 5, Moves.ACID_SPRAY ], [ 8, Moves.FURY_SWIPES ], [ 11, Moves.SWITCHEROO ], @@ -16294,6 +16575,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.CONFUSION ], [ 1, Moves.DEFENSE_CURL ], + [ 1, Moves.MUD_SHOT ], // Previous Stage Move + [ 1, Moves.DIG ], // Previous Stage Move [ 4, Moves.SAND_ATTACK ], [ 7, Moves.STRUGGLE_BUG ], [ 11, Moves.ROLLOUT ], @@ -16717,6 +17000,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.LEER ], [ 1, Moves.COUNTER ], [ 1, Moves.FOCUS_ENERGY ], + [ 1, Moves.COVET ], // Previous Stage Move [ 1, Moves.FLING ], [ 5, Moves.FURY_SWIPES ], [ 8, Moves.LOW_KICK ], @@ -16734,6 +17018,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.CLODSIRE]: [ [ EVOLVE_MOVE, Moves.AMNESIA ], + [ 1, Moves.TACKLE ], // Previous Stage Move [ 1, Moves.TAIL_WHIP ], [ 1, Moves.POISON_STING ], [ 4, Moves.TOXIC_SPIKES ], @@ -16768,6 +17053,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DUDUNSPARCE]: [ [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.FLAIL ], + [ 1, Moves.TACKLE ], // Previous Stage Move, Custom [ 4, Moves.MUD_SLAP ], [ 8, Moves.ROLLOUT ], [ 12, Moves.GLARE ], @@ -16864,7 +17150,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.CONFUSE_RAY ], [ 1, Moves.SPITE ], [ 1, Moves.ASTONISH ], - [ 1, Moves.PSYBEAM ], //Custom, moved from 7 to 1 + [ 1, Moves.PSYBEAM ], // Custom, moved from 7 to 1 [ 14, Moves.MEAN_LOOK ], [ 21, Moves.MEMENTO ], [ 28, Moves.WISH ], @@ -16939,7 +17225,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.IRON_BUNDLE]: [ [ RELEARN_MOVE, Moves.ELECTRIC_TERRAIN ], [ 1, Moves.PRESENT ], - [ 1, Moves.WATER_GUN ], //Custom + [ 1, Moves.WATER_GUN ], // Custom [ 7, Moves.POWDER_SNOW ], [ 14, Moves.WHIRLPOOL ], [ 21, Moves.TAKE_DOWN ], @@ -17058,6 +17344,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 18, Moves.FOCUS_ENERGY ], [ 24, Moves.BITE ], [ 29, Moves.ICE_FANG ], + [ 32, Moves.DRAGON_CLAW ], // Previous Stage Move, Frigibax Level [ 40, Moves.TAKE_DOWN ], [ 45, Moves.ICE_BEAM ], [ 50, Moves.CRUNCH ], @@ -17305,6 +17592,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [Species.DIPPLIN]: [ [ EVOLVE_MOVE, Moves.DOUBLE_HIT ], [ RELEARN_MOVE, Moves.DRAGON_CHEER ], // Custom + [ 1, Moves.LEAFAGE ], [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], @@ -17324,7 +17612,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STUN_SPORE ], [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], - [ 5, Moves.ABSORB ], //Custom, Moved from Level 6 to 5 + [ 5, Moves.ABSORB ], // Custom, Moved from Level 6 to 5 [ 12, Moves.LIFE_DEW ], [ 18, Moves.FOUL_PLAY ], [ 24, Moves.MEGA_DRAIN ], @@ -17337,6 +17625,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.SINISTCHA]: [ [ EVOLVE_MOVE, Moves.MATCHA_GOTCHA ], + [ RELEARN_MOVE, Moves.GIGA_DRAIN ], // Previous Stage Move [ 1, Moves.STUN_SPORE ], [ 1, Moves.WITHDRAW ], [ 1, Moves.ASTONISH ], @@ -17419,6 +17708,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.ARCHALUDON]: [ [ EVOLVE_MOVE, Moves.ELECTRO_SHOT ], + [ RELEARN_MOVE, Moves.LASER_FOCUS ], // Previous Stage Move [ 1, Moves.LEER ], [ 1, Moves.METAL_CLAW ], [ 6, Moves.ROCK_SMASH ], @@ -17438,6 +17728,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ RELEARN_MOVE, Moves.YAWN ], [ RELEARN_MOVE, Moves.DOUBLE_HIT ], [ RELEARN_MOVE, Moves.INFESTATION ], + [ RELEARN_MOVE, Moves.DRAGON_CHEER ], // Previous Stage Move, Custom + [ 1, Moves.LEAFAGE ], // Previous Stage Move, Custom [ 1, Moves.WITHDRAW ], [ 1, Moves.SWEET_SCENT ], [ 1, Moves.RECYCLE ], @@ -17809,6 +18101,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.DEFENSE_CURL ], [ 1, Moves.CHARGE ], [ 1, Moves.ROCK_POLISH ], + [ 1, Moves.ROLLOUT ], // Previous Stage Move [ 1, Moves.HEAVY_SLAM ], [ 12, Moves.SPARK ], [ 16, Moves.ROCK_THROW ], @@ -18051,6 +18344,8 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.GALAR_MR_MIME]: [ [ 1, Moves.POUND ], + [ 1, Moves.BARRIER ], // Previous Stage Move + [ 1, Moves.TICKLE ], // Previous Stage Move [ 1, Moves.MIMIC ], [ 1, Moves.LIGHT_SCREEN ], [ 1, Moves.REFLECT ], @@ -18411,6 +18706,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], [ 1, Moves.WATER_GUN ], + [ 1, Moves.SOAK ], // Previous Stage Move [ 1, Moves.SLASH ], [ 1, Moves.MEGAHORN ], [ 1, Moves.SUCKER_PUNCH ], @@ -18436,6 +18732,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.STUN_SPORE ], [ 1, Moves.SLEEP_POWDER ], [ 1, Moves.GIGA_DRAIN ], + [ 1, Moves.CHARM ], // Previous Stage Move [ 1, Moves.SYNTHESIS ], [ 1, Moves.SUNNY_DAY ], [ 1, Moves.HELPING_HAND ], @@ -18487,6 +18784,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.HISUI_BRAVIARY]: [ [ EVOLVE_MOVE, Moves.ESPER_WING ], + [ RELEARN_MOVE, Moves.BRAVE_BIRD ], // Previous Stage Move [ 1, Moves.WING_ATTACK ], [ 1, Moves.LEER ], [ 1, Moves.PECK ], @@ -18511,6 +18809,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.ABSORB ], [ 1, Moves.ACID_ARMOR ], [ 1, Moves.DRAGON_BREATH ], + [ 1, Moves.BODY_SLAM ], // Previous Stage Move [ 15, Moves.PROTECT ], [ 20, Moves.FLAIL ], [ 25, Moves.WATER_PULSE ], @@ -18525,6 +18824,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { [ 1, Moves.TACKLE ], [ 1, Moves.WATER_GUN ], [ 1, Moves.ABSORB ], + [ 1, Moves.ACID_ARMOR ], // Previous Stage Move [ 1, Moves.DRAGON_BREATH ], [ 1, Moves.FEINT ], [ 1, Moves.ACID_SPRAY ], @@ -18565,9 +18865,11 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { ], [Species.HISUI_DECIDUEYE]: [ [ EVOLVE_MOVE, Moves.TRIPLE_ARROWS ], + [ RELEARN_MOVE, Moves.NASTY_PLOT ], // Previous Stage Move [ 1, Moves.TACKLE ], [ 1, Moves.GROWL ], [ 1, Moves.U_TURN ], + [ 1, Moves.ASTONISH ], // Previous Stage Move [ 1, Moves.LEAF_STORM ], [ 1, Moves.LEAFAGE ], [ 9, Moves.PECK ], @@ -18633,7 +18935,7 @@ export const pokemonSpeciesLevelMoves: PokemonSpeciesLevelMoves = { }; export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { - [Species.PIKACHU]: { //Custom + [Species.PIKACHU]: { // Custom 1: [ [ 1, Moves.TAIL_WHIP ], [ 1, Moves.GROWL ], @@ -18648,14 +18950,14 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 8, Moves.DOUBLE_TEAM ], [ 12, Moves.ELECTRO_BALL ], [ 16, Moves.FEINT ], - [ 20, Moves.ZIPPY_ZAP ], //Custom + [ 20, Moves.ZIPPY_ZAP ], // Custom [ 24, Moves.AGILITY ], [ 28, Moves.IRON_TAIL ], [ 32, Moves.DISCHARGE ], - [ 34, Moves.FLOATY_FALL ], //Custom + [ 34, Moves.FLOATY_FALL ], // Custom [ 36, Moves.THUNDERBOLT ], [ 40, Moves.LIGHT_SCREEN ], - [ 42, Moves.SPLISHY_SPLASH ], //Custom + [ 42, Moves.SPLISHY_SPLASH ], // Custom [ 44, Moves.THUNDER ], [ 48, Moves.PIKA_PAPOW ], ], @@ -18816,19 +19118,19 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 8, Moves.DOUBLE_TEAM ], [ 12, Moves.ELECTRO_BALL ], [ 16, Moves.FEINT ], - [ 20, Moves.ZIPPY_ZAP ], //Custom + [ 20, Moves.ZIPPY_ZAP ], // Custom [ 24, Moves.AGILITY ], [ 28, Moves.IRON_TAIL ], [ 32, Moves.DISCHARGE ], - [ 34, Moves.FLOATY_FALL ], //Custom + [ 34, Moves.FLOATY_FALL ], // Custom [ 36, Moves.THUNDERBOLT ], [ 40, Moves.LIGHT_SCREEN ], - [ 42, Moves.SPLISHY_SPLASH ], //Custom + [ 42, Moves.SPLISHY_SPLASH ], // Custom [ 44, Moves.THUNDER ], [ 48, Moves.PIKA_PAPOW ], ], }, - [Species.EEVEE]: { //Custom + [Species.EEVEE]: { // Custom 1: [ [ 1, Moves.TACKLE ], [ 1, Moves.TAIL_WHIP ], @@ -18838,21 +19140,21 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 5, Moves.SAND_ATTACK ], [ 10, Moves.QUICK_ATTACK ], [ 15, Moves.BABY_DOLL_EYES ], - [ 18, Moves.BOUNCY_BUBBLE ], //Custom - [ 18, Moves.SIZZLY_SLIDE ], //Custom - [ 18, Moves.BUZZY_BUZZ ], //Custom + [ 18, Moves.BOUNCY_BUBBLE ], // Custom + [ 18, Moves.SIZZLY_SLIDE ], // Custom + [ 18, Moves.BUZZY_BUZZ ], // Custom [ 20, Moves.SWIFT ], [ 25, Moves.BITE ], [ 30, Moves.COPYCAT ], - [ 33, Moves.BADDY_BAD ], //Custom - [ 33, Moves.GLITZY_GLOW ], //Custom + [ 33, Moves.BADDY_BAD ], // Custom + [ 33, Moves.GLITZY_GLOW ], // Custom [ 35, Moves.BATON_PASS ], - [ 40, Moves.VEEVEE_VOLLEY ], //Custom, replaces Take Down - [ 43, Moves.FREEZY_FROST ], //Custom - [ 43, Moves.SAPPY_SEED ], //Custom + [ 40, Moves.VEEVEE_VOLLEY ], // Custom, replaces Take Down + [ 43, Moves.FREEZY_FROST ], // Custom + [ 43, Moves.SAPPY_SEED ], // Custom [ 45, Moves.CHARM ], [ 50, Moves.DOUBLE_EDGE ], - [ 53, Moves.SPARKLY_SWIRL ], //Custom + [ 53, Moves.SPARKLY_SWIRL ], // Custom [ 55, Moves.LAST_RESORT ], ], 2: [ @@ -18864,27 +19166,27 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 5, Moves.SAND_ATTACK ], [ 10, Moves.QUICK_ATTACK ], [ 15, Moves.BABY_DOLL_EYES ], - [ 18, Moves.BOUNCY_BUBBLE ], //Custom - [ 18, Moves.SIZZLY_SLIDE ], //Custom - [ 18, Moves.BUZZY_BUZZ ], //Custom + [ 18, Moves.BOUNCY_BUBBLE ], // Custom + [ 18, Moves.SIZZLY_SLIDE ], // Custom + [ 18, Moves.BUZZY_BUZZ ], // Custom [ 20, Moves.SWIFT ], [ 25, Moves.BITE ], [ 30, Moves.COPYCAT ], - [ 33, Moves.BADDY_BAD ], //Custom - [ 33, Moves.GLITZY_GLOW ], //Custom + [ 33, Moves.BADDY_BAD ], // Custom + [ 33, Moves.GLITZY_GLOW ], // Custom [ 35, Moves.BATON_PASS ], - [ 40, Moves.VEEVEE_VOLLEY ], //Custom, replaces Take Down - [ 43, Moves.FREEZY_FROST ], //Custom - [ 43, Moves.SAPPY_SEED ], //Custom + [ 40, Moves.VEEVEE_VOLLEY ], // Custom, replaces Take Down + [ 43, Moves.FREEZY_FROST ], // Custom + [ 43, Moves.SAPPY_SEED ], // Custom [ 45, Moves.CHARM ], [ 50, Moves.DOUBLE_EDGE ], - [ 53, Moves.SPARKLY_SWIRL ], //Custom + [ 53, Moves.SPARKLY_SWIRL ], // Custom [ 55, Moves.LAST_RESORT ], ], }, [Species.DEOXYS]: { 1: [ - [ 1, Moves.CONFUSION ], //Custom + [ 1, Moves.CONFUSION ], // Custom [ 1, Moves.WRAP ], [ 1, Moves.LEER ], [ 7, Moves.NIGHT_SHADE ], @@ -18901,7 +19203,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 73, Moves.HYPER_BEAM ], ], 2: [ - [ 1, Moves.CONFUSION ], //Custom + [ 1, Moves.CONFUSION ], // Custom [ 1, Moves.WRAP ], [ 1, Moves.LEER ], [ 7, Moves.NIGHT_SHADE ], @@ -18920,7 +19222,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 73, Moves.MIRROR_COAT ], ], 3: [ - [ 1, Moves.CONFUSION ], //Custom + [ 1, Moves.CONFUSION ], // Custom [ 1, Moves.WRAP ], [ 1, Moves.LEER ], [ 7, Moves.NIGHT_SHADE ], @@ -18940,6 +19242,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [Species.WORMADAM]: { 1: [ [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], + [ 1, Moves.STRUGGLE_BUG ], // Previous Stage Move, Custom [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], [ 1, Moves.SUCKER_PUNCH ], @@ -18960,6 +19263,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { ], 2: [ [ EVOLVE_MOVE, Moves.QUIVER_DANCE ], + [ 1, Moves.STRUGGLE_BUG ], // Previous Stage Move, Custom [ 1, Moves.METAL_BURST ], [ 1, Moves.TACKLE ], [ 1, Moves.PROTECT ], @@ -19064,7 +19368,7 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { }, [Species.SHAYMIN]: { 1: [ - [ 1, Moves.LEAFAGE ], //Custom + [ 1, Moves.LEAFAGE ], // Custom [ 1, Moves.GROWTH ], [ 10, Moves.MAGICAL_LEAF ], [ 19, Moves.LEECH_SEED ], @@ -19166,6 +19470,10 @@ export const pokemonFormLevelMoves: PokemonSpeciesFormLevelMoves = { [ 1, Moves.GROWL ], [ 1, Moves.WATER_GUN ], [ 1, Moves.QUICK_ATTACK ], + [ 1, Moves.ROUND ], // Previous Stage Move + [ 1, Moves.FLING ], // Previous Stage Move + [ 1, Moves.SMACK_DOWN ], // Previous Stage Move + [ 1, Moves.BOUNCE ], // Previous Stage Move [ 1, Moves.HAZE ], [ 1, Moves.ROLE_PLAY ], [ 1, Moves.NIGHT_SLASH ], diff --git a/src/data/balance/species-egg-tiers.ts b/src/data/balance/species-egg-tiers.ts index cd266dfcf54..27baa18151a 100644 --- a/src/data/balance/species-egg-tiers.ts +++ b/src/data/balance/species-egg-tiers.ts @@ -497,7 +497,7 @@ export const speciesEggTiers = { [Species.DREEPY]: EggTier.RARE, [Species.ZACIAN]: EggTier.LEGENDARY, [Species.ZAMAZENTA]: EggTier.LEGENDARY, - [Species.ETERNATUS]: EggTier.COMMON, + [Species.ETERNATUS]: EggTier.LEGENDARY, [Species.KUBFU]: EggTier.EPIC, [Species.ZARUDE]: EggTier.EPIC, [Species.REGIELEKI]: EggTier.EPIC, diff --git a/src/data/balance/starters.ts b/src/data/balance/starters.ts index bf3a1f7ad56..d6a1f0c3eaf 100644 --- a/src/data/balance/starters.ts +++ b/src/data/balance/starters.ts @@ -15,25 +15,25 @@ export const FRIENDSHIP_LOSS_FROM_FAINT = 10; */ export function getStarterValueFriendshipCap(starterCost: number): number { switch (starterCost) { - case 1: - return 20; - case 2: - return 40; - case 3: - return 60; - case 4: - return 100; - case 5: - return 140; - case 6: - return 200; - case 7: - return 280; - case 8: - case 9: - return 450; - default: - return 600; + case 1: + return 20; + case 2: + return 40; + case 3: + return 60; + case 4: + return 100; + case 5: + return 140; + case 6: + return 200; + case 7: + return 280; + case 8: + case 9: + return 450; + default: + return 600; } } diff --git a/src/data/balance/tms.ts b/src/data/balance/tms.ts index 1a509637e05..7b65ae65ec4 100644 --- a/src/data/balance/tms.ts +++ b/src/data/balance/tms.ts @@ -12318,6 +12318,7 @@ export const tmSpecies: TmSpecies = { Species.TURTWIG, Species.GROTLE, Species.TORTERRA, + Species.BASTIODON, Species.CHINGLING, Species.BRONZOR, Species.BRONZONG, @@ -12325,6 +12326,7 @@ export const tmSpecies: TmSpecies = { Species.WEAVILE, Species.MAGNEZONE, Species.TANGROWTH, + Species.ELECTIVIRE, Species.TOGEKISS, Species.MAMOSWINE, Species.GALLADE, @@ -12357,6 +12359,8 @@ export const tmSpecies: TmSpecies = { Species.CRYOGONAL, Species.MIENFOO, Species.MIENSHAO, + Species.GOLETT, + Species.GOLURK, Species.HYDREIGON, Species.COBALION, Species.TERRAKION, @@ -40233,6 +40237,1065 @@ export const tmSpecies: TmSpecies = { Species.HISUI_ZORUA, Species.HISUI_ZOROARK, ], + [Moves.SECRET_POWER]: [ + Species.BULBASAUR, + Species.IVYSAUR, + Species.VENUSAUR, + Species.CHARMANDER, + Species.CHARMELEON, + Species.CHARIZARD, + Species.SQUIRTLE, + Species.WARTORTLE, + Species.BLASTOISE, + Species.BUTTERFREE, + Species.BEEDRILL, + Species.PIDGEY, + Species.PIDGEOTTO, + Species.PIDGEOT, + Species.RATTATA, + Species.RATICATE, + Species.SPEAROW, + Species.FEAROW, + Species.EKANS, + Species.ARBOK, + Species.PIKACHU, + Species.RAICHU, + Species.SANDSHREW, + Species.SANDSLASH, + Species.NIDORAN_F, + Species.NIDORINA, + Species.NIDOQUEEN, + Species.NIDORAN_M, + Species.NIDORINO, + Species.NIDOKING, + Species.CLEFAIRY, + Species.CLEFABLE, + Species.VULPIX, + Species.NINETALES, + Species.JIGGLYPUFF, + Species.WIGGLYTUFF, + Species.ZUBAT, + Species.GOLBAT, + Species.ODDISH, + Species.GLOOM, + Species.VILEPLUME, + Species.PARAS, + Species.PARASECT, + Species.VENONAT, + Species.VENOMOTH, + Species.DIGLETT, + Species.DUGTRIO, + Species.MEOWTH, + Species.PERSIAN, + Species.PSYDUCK, + Species.GOLDUCK, + Species.MANKEY, + Species.PRIMEAPE, + Species.GROWLITHE, + Species.ARCANINE, + Species.POLIWAG, + Species.POLIWHIRL, + Species.POLIWRATH, + Species.ABRA, + Species.KADABRA, + Species.ALAKAZAM, + Species.MACHOP, + Species.MACHOKE, + Species.MACHAMP, + Species.BELLSPROUT, + Species.WEEPINBELL, + Species.VICTREEBEL, + Species.TENTACOOL, + Species.TENTACRUEL, + Species.GEODUDE, + Species.GRAVELER, + Species.GOLEM, + Species.PONYTA, + Species.RAPIDASH, + Species.SLOWPOKE, + Species.SLOWBRO, + Species.MAGNEMITE, + Species.MAGNETON, + Species.FARFETCHD, + Species.DODUO, + Species.DODRIO, + Species.SEEL, + Species.DEWGONG, + Species.GRIMER, + Species.MUK, + Species.SHELLDER, + Species.CLOYSTER, + Species.GASTLY, + Species.HAUNTER, + Species.GENGAR, + Species.ONIX, + Species.DROWZEE, + Species.HYPNO, + Species.KRABBY, + Species.KINGLER, + Species.VOLTORB, + Species.ELECTRODE, + Species.EXEGGCUTE, + Species.EXEGGUTOR, + Species.CUBONE, + Species.MAROWAK, + Species.HITMONLEE, + Species.HITMONCHAN, + Species.LICKITUNG, + Species.KOFFING, + Species.WEEZING, + Species.RHYHORN, + Species.RHYDON, + Species.CHANSEY, + Species.TANGELA, + Species.KANGASKHAN, + Species.HORSEA, + Species.SEADRA, + Species.GOLDEEN, + Species.SEAKING, + Species.STARYU, + Species.STARMIE, + Species.MR_MIME, + Species.SCYTHER, + Species.JYNX, + Species.ELECTABUZZ, + Species.MAGMAR, + Species.PINSIR, + Species.TAUROS, + Species.GYARADOS, + Species.LAPRAS, + Species.EEVEE, + Species.VAPOREON, + Species.JOLTEON, + Species.FLAREON, + Species.PORYGON, + Species.OMANYTE, + Species.OMASTAR, + Species.KABUTO, + Species.KABUTOPS, + Species.AERODACTYL, + Species.SNORLAX, + Species.ARTICUNO, + Species.ZAPDOS, + Species.MOLTRES, + Species.DRATINI, + Species.DRAGONAIR, + Species.DRAGONITE, + Species.MEWTWO, + Species.MEW, + Species.CHIKORITA, + Species.BAYLEEF, + Species.MEGANIUM, + Species.CYNDAQUIL, + Species.QUILAVA, + Species.TYPHLOSION, + Species.TOTODILE, + Species.CROCONAW, + Species.FERALIGATR, + Species.SENTRET, + Species.FURRET, + Species.HOOTHOOT, + Species.NOCTOWL, + Species.LEDYBA, + Species.LEDIAN, + Species.SPINARAK, + Species.ARIADOS, + Species.CROBAT, + Species.CHINCHOU, + Species.LANTURN, + Species.PICHU, + Species.CLEFFA, + Species.IGGLYBUFF, + Species.TOGEPI, + Species.TOGETIC, + Species.NATU, + Species.XATU, + Species.MAREEP, + Species.FLAAFFY, + Species.AMPHAROS, + Species.BELLOSSOM, + Species.MARILL, + Species.AZUMARILL, + Species.SUDOWOODO, + Species.POLITOED, + Species.HOPPIP, + Species.SKIPLOOM, + Species.JUMPLUFF, + Species.AIPOM, + Species.SUNKERN, + Species.SUNFLORA, + Species.YANMA, + Species.WOOPER, + Species.QUAGSIRE, + Species.ESPEON, + Species.UMBREON, + Species.MURKROW, + Species.SLOWKING, + Species.MISDREAVUS, + Species.GIRAFARIG, + Species.PINECO, + Species.FORRETRESS, + Species.DUNSPARCE, + Species.GLIGAR, + Species.STEELIX, + Species.SNUBBULL, + Species.GRANBULL, + Species.QWILFISH, + Species.SCIZOR, + Species.SHUCKLE, + Species.HERACROSS, + Species.SNEASEL, + Species.TEDDIURSA, + Species.URSARING, + Species.SLUGMA, + Species.MAGCARGO, + Species.SWINUB, + Species.PILOSWINE, + Species.CORSOLA, + Species.REMORAID, + Species.OCTILLERY, + Species.DELIBIRD, + Species.MANTINE, + Species.SKARMORY, + Species.HOUNDOUR, + Species.HOUNDOOM, + Species.KINGDRA, + Species.PHANPY, + Species.DONPHAN, + Species.PORYGON2, + Species.STANTLER, + Species.TYROGUE, + Species.HITMONTOP, + Species.SMOOCHUM, + Species.ELEKID, + Species.MAGBY, + Species.MILTANK, + Species.BLISSEY, + Species.RAIKOU, + Species.ENTEI, + Species.SUICUNE, + Species.LARVITAR, + Species.PUPITAR, + Species.TYRANITAR, + Species.LUGIA, + Species.HO_OH, + Species.CELEBI, + Species.TREECKO, + Species.GROVYLE, + Species.SCEPTILE, + Species.TORCHIC, + Species.COMBUSKEN, + Species.BLAZIKEN, + Species.MUDKIP, + Species.MARSHTOMP, + Species.SWAMPERT, + Species.POOCHYENA, + Species.MIGHTYENA, + Species.ZIGZAGOON, + Species.LINOONE, + Species.BEAUTIFLY, + Species.DUSTOX, + Species.LOTAD, + Species.LOMBRE, + Species.LUDICOLO, + Species.SEEDOT, + Species.NUZLEAF, + Species.SHIFTRY, + Species.TAILLOW, + Species.SWELLOW, + Species.WINGULL, + Species.PELIPPER, + Species.RALTS, + Species.KIRLIA, + Species.GARDEVOIR, + Species.SURSKIT, + Species.MASQUERAIN, + Species.SHROOMISH, + Species.BRELOOM, + Species.SLAKOTH, + Species.VIGOROTH, + Species.SLAKING, + Species.NINCADA, + Species.NINJASK, + Species.SHEDINJA, + Species.WHISMUR, + Species.LOUDRED, + Species.EXPLOUD, + Species.MAKUHITA, + Species.HARIYAMA, + Species.AZURILL, + Species.NOSEPASS, + Species.SKITTY, + Species.DELCATTY, + Species.SABLEYE, + Species.MAWILE, + Species.ARON, + Species.LAIRON, + Species.AGGRON, + Species.MEDITITE, + Species.MEDICHAM, + Species.ELECTRIKE, + Species.MANECTRIC, + Species.PLUSLE, + Species.MINUN, + Species.VOLBEAT, + Species.ILLUMISE, + Species.ROSELIA, + Species.GULPIN, + Species.SWALOT, + Species.CARVANHA, + Species.SHARPEDO, + Species.WAILMER, + Species.WAILORD, + Species.NUMEL, + Species.CAMERUPT, + Species.TORKOAL, + Species.SPOINK, + Species.GRUMPIG, + Species.SPINDA, + Species.TRAPINCH, + Species.VIBRAVA, + Species.FLYGON, + Species.CACNEA, + Species.CACTURNE, + Species.SWABLU, + Species.ALTARIA, + Species.ZANGOOSE, + Species.SEVIPER, + Species.LUNATONE, + Species.SOLROCK, + Species.BARBOACH, + Species.WHISCASH, + Species.CORPHISH, + Species.CRAWDAUNT, + Species.BALTOY, + Species.CLAYDOL, + Species.LILEEP, + Species.CRADILY, + Species.ANORITH, + Species.ARMALDO, + Species.FEEBAS, + Species.MILOTIC, + Species.CASTFORM, + Species.KECLEON, + Species.SHUPPET, + Species.BANETTE, + Species.DUSKULL, + Species.DUSCLOPS, + Species.TROPIUS, + Species.CHIMECHO, + Species.ABSOL, + Species.SNORUNT, + Species.GLALIE, + Species.SPHEAL, + Species.SEALEO, + Species.WALREIN, + Species.CLAMPERL, + Species.HUNTAIL, + Species.GOREBYSS, + Species.RELICANTH, + Species.LUVDISC, + Species.BAGON, + Species.SHELGON, + Species.SALAMENCE, + Species.METANG, + Species.METAGROSS, + Species.REGIROCK, + Species.REGICE, + Species.REGISTEEL, + Species.LATIAS, + Species.LATIOS, + Species.KYOGRE, + Species.GROUDON, + Species.RAYQUAZA, + Species.JIRACHI, + Species.DEOXYS, + Species.TURTWIG, + Species.GROTLE, + Species.TORTERRA, + Species.CHIMCHAR, + Species.MONFERNO, + Species.INFERNAPE, + Species.PIPLUP, + Species.PRINPLUP, + Species.EMPOLEON, + Species.STARLY, + Species.STARAVIA, + Species.STARAPTOR, + Species.BIDOOF, + Species.BIBAREL, + Species.KRICKETUNE, + Species.SHINX, + Species.LUXIO, + Species.LUXRAY, + Species.BUDEW, + Species.ROSERADE, + Species.CRANIDOS, + Species.RAMPARDOS, + Species.SHIELDON, + Species.BASTIODON, + Species.WORMADAM, + Species.MOTHIM, + Species.VESPIQUEN, + Species.PACHIRISU, + Species.BUIZEL, + Species.FLOATZEL, + Species.CHERUBI, + Species.CHERRIM, + Species.SHELLOS, + Species.GASTRODON, + Species.AMBIPOM, + Species.DRIFLOON, + Species.DRIFBLIM, + Species.BUNEARY, + Species.LOPUNNY, + Species.MISMAGIUS, + Species.HONCHKROW, + Species.GLAMEOW, + Species.PURUGLY, + Species.CHINGLING, + Species.STUNKY, + Species.SKUNTANK, + Species.BRONZOR, + Species.BRONZONG, + Species.BONSLY, + Species.MIME_JR, + Species.HAPPINY, + Species.CHATOT, + Species.SPIRITOMB, + Species.GIBLE, + Species.GABITE, + Species.GARCHOMP, + Species.MUNCHLAX, + Species.RIOLU, + Species.LUCARIO, + Species.HIPPOPOTAS, + Species.HIPPOWDON, + Species.SKORUPI, + Species.DRAPION, + Species.CROAGUNK, + Species.TOXICROAK, + Species.CARNIVINE, + Species.FINNEON, + Species.LUMINEON, + Species.MANTYKE, + Species.SNOVER, + Species.ABOMASNOW, + Species.WEAVILE, + Species.MAGNEZONE, + Species.LICKILICKY, + Species.RHYPERIOR, + Species.TANGROWTH, + Species.ELECTIVIRE, + Species.MAGMORTAR, + Species.TOGEKISS, + Species.YANMEGA, + Species.LEAFEON, + Species.GLACEON, + Species.GLISCOR, + Species.MAMOSWINE, + Species.PORYGON_Z, + Species.GALLADE, + Species.PROBOPASS, + Species.DUSKNOIR, + Species.FROSLASS, + Species.ROTOM, + Species.UXIE, + Species.MESPRIT, + Species.AZELF, + Species.DIALGA, + Species.PALKIA, + Species.HEATRAN, + Species.REGIGIGAS, + Species.GIRATINA, + Species.CRESSELIA, + Species.PHIONE, + Species.MANAPHY, + Species.DARKRAI, + Species.SHAYMIN, + Species.ARCEUS, + Species.VICTINI, + Species.SNIVY, + Species.SERVINE, + Species.SERPERIOR, + Species.TEPIG, + Species.PIGNITE, + Species.EMBOAR, + Species.OSHAWOTT, + Species.DEWOTT, + Species.SAMUROTT, + Species.PATRAT, + Species.WATCHOG, + Species.LILLIPUP, + Species.HERDIER, + Species.STOUTLAND, + Species.PURRLOIN, + Species.LIEPARD, + Species.PANSAGE, + Species.SIMISAGE, + Species.PANSEAR, + Species.SIMISEAR, + Species.PANPOUR, + Species.SIMIPOUR, + Species.MUNNA, + Species.MUSHARNA, + Species.PIDOVE, + Species.TRANQUILL, + Species.UNFEZANT, + Species.BLITZLE, + Species.ZEBSTRIKA, + Species.ROGGENROLA, + Species.BOLDORE, + Species.GIGALITH, + Species.WOOBAT, + Species.SWOOBAT, + Species.DRILBUR, + Species.EXCADRILL, + Species.AUDINO, + Species.TIMBURR, + Species.GURDURR, + Species.CONKELDURR, + Species.TYMPOLE, + Species.PALPITOAD, + Species.SEISMITOAD, + Species.THROH, + Species.SAWK, + Species.SEWADDLE, + Species.SWADLOON, + Species.LEAVANNY, + Species.VENIPEDE, + Species.WHIRLIPEDE, + Species.SCOLIPEDE, + Species.COTTONEE, + Species.WHIMSICOTT, + Species.PETILIL, + Species.LILLIGANT, + Species.BASCULIN, + Species.SANDILE, + Species.KROKOROK, + Species.KROOKODILE, + Species.DARUMAKA, + Species.DARMANITAN, + Species.MARACTUS, + Species.DWEBBLE, + Species.CRUSTLE, + Species.SCRAGGY, + Species.SCRAFTY, + Species.SIGILYPH, + Species.YAMASK, + Species.COFAGRIGUS, + Species.TIRTOUGA, + Species.CARRACOSTA, + Species.ARCHEN, + Species.ARCHEOPS, + Species.TRUBBISH, + Species.GARBODOR, + Species.ZORUA, + Species.ZOROARK, + Species.MINCCINO, + Species.CINCCINO, + Species.GOTHITA, + Species.GOTHORITA, + Species.GOTHITELLE, + Species.SOLOSIS, + Species.DUOSION, + Species.REUNICLUS, + Species.DUCKLETT, + Species.SWANNA, + Species.VANILLITE, + Species.VANILLISH, + Species.VANILLUXE, + Species.DEERLING, + Species.SAWSBUCK, + Species.EMOLGA, + Species.KARRABLAST, + Species.ESCAVALIER, + Species.FOONGUS, + Species.AMOONGUSS, + Species.FRILLISH, + Species.JELLICENT, + Species.ALOMOMOLA, + Species.JOLTIK, + Species.GALVANTULA, + Species.FERROSEED, + Species.FERROTHORN, + Species.KLINK, + Species.KLANG, + Species.KLINKLANG, + Species.EELEKTRIK, + Species.EELEKTROSS, + Species.ELGYEM, + Species.BEHEEYEM, + Species.LITWICK, + Species.LAMPENT, + Species.CHANDELURE, + Species.AXEW, + Species.FRAXURE, + Species.HAXORUS, + Species.CUBCHOO, + Species.BEARTIC, + Species.CRYOGONAL, + Species.SHELMET, + Species.ACCELGOR, + Species.STUNFISK, + Species.MIENFOO, + Species.MIENSHAO, + Species.DRUDDIGON, + Species.GOLETT, + Species.GOLURK, + Species.PAWNIARD, + Species.BISHARP, + Species.BOUFFALANT, + Species.RUFFLET, + Species.BRAVIARY, + Species.VULLABY, + Species.MANDIBUZZ, + Species.HEATMOR, + Species.DURANT, + Species.DEINO, + Species.ZWEILOUS, + Species.HYDREIGON, + Species.LARVESTA, + Species.VOLCARONA, + Species.COBALION, + Species.TERRAKION, + Species.VIRIZION, + Species.TORNADUS, + Species.THUNDURUS, + Species.RESHIRAM, + Species.ZEKROM, + Species.LANDORUS, + Species.KYUREM, + Species.KELDEO, + Species.MELOETTA, + Species.GENESECT, + Species.CHESPIN, + Species.QUILLADIN, + Species.CHESNAUGHT, + Species.FENNEKIN, + Species.BRAIXEN, + Species.DELPHOX, + Species.FROAKIE, + Species.FROGADIER, + Species.GRENINJA, + Species.BUNNELBY, + Species.DIGGERSBY, + Species.FLETCHLING, + Species.FLETCHINDER, + Species.TALONFLAME, + Species.VIVILLON, + Species.LITLEO, + Species.PYROAR, + Species.FLABEBE, + Species.FLOETTE, + Species.FLORGES, + Species.SKIDDO, + Species.GOGOAT, + Species.PANCHAM, + Species.PANGORO, + Species.FURFROU, + Species.ESPURR, + Species.MEOWSTIC, + Species.HONEDGE, + Species.DOUBLADE, + Species.AEGISLASH, + Species.SPRITZEE, + Species.AROMATISSE, + Species.SWIRLIX, + Species.SLURPUFF, + Species.INKAY, + Species.MALAMAR, + Species.BINACLE, + Species.BARBARACLE, + Species.SKRELP, + Species.DRAGALGE, + Species.CLAUNCHER, + Species.CLAWITZER, + Species.HELIOPTILE, + Species.HELIOLISK, + Species.TYRUNT, + Species.TYRANTRUM, + Species.AMAURA, + Species.AURORUS, + Species.SYLVEON, + Species.HAWLUCHA, + Species.DEDENNE, + Species.CARBINK, + Species.GOOMY, + Species.SLIGGOO, + Species.GOODRA, + Species.KLEFKI, + Species.PHANTUMP, + Species.TREVENANT, + Species.PUMPKABOO, + Species.GOURGEIST, + Species.BERGMITE, + Species.AVALUGG, + Species.NOIBAT, + Species.NOIVERN, + Species.XERNEAS, + Species.YVELTAL, + Species.ZYGARDE, + Species.DIANCIE, + Species.HOOPA, + Species.VOLCANION, + Species.ROWLET, + Species.DARTRIX, + Species.DECIDUEYE, + Species.LITTEN, + Species.TORRACAT, + Species.INCINEROAR, + Species.POPPLIO, + Species.BRIONNE, + Species.PRIMARINA, + Species.PIKIPEK, + Species.TRUMBEAK, + Species.TOUCANNON, + Species.YUNGOOS, + Species.GUMSHOOS, + Species.GRUBBIN, + Species.CHARJABUG, + Species.VIKAVOLT, + Species.CRABRAWLER, + Species.CRABOMINABLE, + Species.ORICORIO, + Species.CUTIEFLY, + Species.RIBOMBEE, + Species.ROCKRUFF, + Species.LYCANROC, + Species.WISHIWASHI, + Species.MAREANIE, + Species.TOXAPEX, + Species.MUDBRAY, + Species.MUDSDALE, + Species.DEWPIDER, + Species.ARAQUANID, + Species.FOMANTIS, + Species.LURANTIS, + Species.MORELULL, + Species.SHIINOTIC, + Species.SALANDIT, + Species.SALAZZLE, + Species.STUFFUL, + Species.BEWEAR, + Species.BOUNSWEET, + Species.STEENEE, + Species.TSAREENA, + Species.COMFEY, + Species.ORANGURU, + Species.PASSIMIAN, + Species.WIMPOD, + Species.GOLISOPOD, + Species.SANDYGAST, + Species.PALOSSAND, + Species.TYPE_NULL, + Species.SILVALLY, + Species.MINIOR, + Species.KOMALA, + Species.TURTONATOR, + Species.TOGEDEMARU, + Species.MIMIKYU, + Species.BRUXISH, + Species.DRAMPA, + Species.DHELMISE, + Species.JANGMO_O, + Species.HAKAMO_O, + Species.KOMMO_O, + Species.TAPU_KOKO, + Species.TAPU_LELE, + Species.TAPU_BULU, + Species.TAPU_FINI, + Species.SOLGALEO, + Species.LUNALA, + Species.NIHILEGO, + Species.BUZZWOLE, + Species.PHEROMOSA, + Species.XURKITREE, + Species.CELESTEELA, + Species.KARTANA, + Species.GUZZLORD, + Species.NECROZMA, + Species.MAGEARNA, + Species.MARSHADOW, + Species.POIPOLE, + Species.NAGANADEL, + 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, + Species.ALOLA_SANDSHREW, + Species.ALOLA_SANDSLASH, + Species.ALOLA_VULPIX, + Species.ALOLA_NINETALES, + Species.ALOLA_DIGLETT, + Species.ALOLA_DUGTRIO, + Species.ALOLA_MEOWTH, + Species.ALOLA_PERSIAN, + Species.ALOLA_GEODUDE, + Species.ALOLA_GRAVELER, + Species.ALOLA_GOLEM, + Species.ALOLA_GRIMER, + Species.ALOLA_MUK, + 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.DIVE]: [ Species.SQUIRTLE, Species.WARTORTLE, @@ -59529,26 +60592,6 @@ export const tmSpecies: TmSpecies = { Species.HISUI_SAMUROTT, Species.PALDEA_TAUROS, ], - [Moves.SACRED_SWORD]: [ - Species.GALLADE, - Species.OSHAWOTT, - Species.DEWOTT, - Species.SAMUROTT, - Species.COBALION, - Species.TERRAKION, - Species.VIRIZION, - Species.KELDEO, - Species.HONEDGE, - Species.DOUBLADE, - Species.AEGISLASH, - Species.KARTANA, - Species.ZACIAN, - Species.CHIEN_PAO, - Species.IRON_LEAVES, - Species.IRON_BOULDER, - Species.IRON_CROWN, - Species.HISUI_SAMUROTT, - ], [Moves.RAZOR_SHELL]: [ Species.SLOWBRO, Species.SHELLDER, @@ -67389,6 +68432,7 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ENDEAVOR]: ModifierTier.COMMON, [Moves.SKILL_SWAP]: ModifierTier.COMMON, [Moves.IMPRISON]: ModifierTier.COMMON, + [Moves.SECRET_POWER]: ModifierTier.COMMON, [Moves.DIVE]: ModifierTier.GREAT, [Moves.FEATHER_DANCE]: ModifierTier.COMMON, [Moves.BLAZE_KICK]: ModifierTier.GREAT, @@ -67517,7 +68561,6 @@ export const tmPoolTiers: TmPoolTiers = { [Moves.ELECTROWEB]: ModifierTier.GREAT, [Moves.WILD_CHARGE]: ModifierTier.GREAT, [Moves.DRILL_RUN]: ModifierTier.GREAT, - [Moves.SACRED_SWORD]: ModifierTier.ULTRA, [Moves.RAZOR_SHELL]: ModifierTier.GREAT, [Moves.HEAT_CRASH]: ModifierTier.GREAT, [Moves.TAIL_SLAP]: ModifierTier.GREAT, diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts index 939f834cccc..37900a3ab5a 100644 --- a/src/data/battle-anims.ts +++ b/src/data/battle-anims.ts @@ -1,6 +1,6 @@ //import { battleAnimRawData } from "./battle-anim-raw-data"; import BattleScene from "../battle-scene"; -import { AttackMove, BeakBlastHeaderAttr, ChargeAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; +import { AttackMove, BeakBlastHeaderAttr, DelayedAttackAttr, MoveFlags, SelfStatusMove, allMoves } from "./move"; import Pokemon from "../field/pokemon"; import * as Utils from "../utils"; import { BattlerIndex } from "../battle"; @@ -134,15 +134,15 @@ export class AnimConfig { for (const te of frameTimedEvents[fte]) { let timedEvent: AnimTimedEvent | undefined; switch (te.eventType) { - case "AnimTimedSoundEvent": - timedEvent = new AnimTimedSoundEvent(te.frameIndex, te.resourceName, te); - break; - case "AnimTimedAddBgEvent": - timedEvent = new AnimTimedAddBgEvent(te.frameIndex, te.resourceName, te); - break; - case "AnimTimedUpdateBgEvent": - timedEvent = new AnimTimedUpdateBgEvent(te.frameIndex, te.resourceName, te); - break; + case "AnimTimedSoundEvent": + timedEvent = new AnimTimedSoundEvent(te.frameIndex, te.resourceName, te); + break; + case "AnimTimedAddBgEvent": + timedEvent = new AnimTimedAddBgEvent(te.frameIndex, te.resourceName, te); + break; + case "AnimTimedUpdateBgEvent": + timedEvent = new AnimTimedUpdateBgEvent(te.frameIndex, te.resourceName, te); + break; } timedEvent && timedEvents.push(timedEvent); @@ -243,12 +243,12 @@ class AnimFrame { if (!init) { let target = AnimFrameTarget.GRAPHIC; switch (pattern) { - case -2: - target = AnimFrameTarget.TARGET; - break; - case -1: - target = AnimFrameTarget.USER; - break; + case -2: + target = AnimFrameTarget.TARGET; + break; + case -1: + target = AnimFrameTarget.USER; + break; } this.target = target; this.graphicFrame = pattern >= 0 ? pattern : 0; @@ -476,8 +476,11 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { const loadedCheckTimer = setInterval(() => { if (moveAnims.get(move) !== null) { - const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0] || allMoves[move].getAttrs(DelayedAttackAttr)[0]; - if (chargeAttr && chargeAnims.get(chargeAttr.chargeAnim) === null) { + const chargeAnimSource = (allMoves[move].isChargingMove()) + ? allMoves[move] + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] + ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + if (chargeAnimSource && chargeAnims.get(chargeAnimSource.chargeAnim) === null) { return; } clearInterval(loadedCheckTimer); @@ -507,11 +510,12 @@ export function initMoveAnim(scene: BattleScene, move: Moves): Promise { } else { populateMoveAnim(move, ba); } - const chargeAttr = allMoves[move].getAttrs(ChargeAttr)[0] - || allMoves[move].getAttrs(DelayedAttackAttr)[0] - || allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]; - if (chargeAttr) { - initMoveChargeAnim(scene, chargeAttr.chargeAnim).then(() => resolve()); + const chargeAnimSource = (allMoves[move].isChargingMove()) + ? allMoves[move] + : (allMoves[move].getAttrs(DelayedAttackAttr)[0] + ?? allMoves[move].getAttrs(BeakBlastHeaderAttr)[0]); + if (chargeAnimSource) { + initMoveChargeAnim(scene, chargeAnimSource.chargeAnim).then(() => resolve()); } else { resolve(); } @@ -638,11 +642,12 @@ export function loadMoveAnimAssets(scene: BattleScene, moveIds: Moves[], startLo return new Promise(resolve => { const moveAnimations = moveIds.map(m => moveAnims.get(m) as AnimConfig).flat(); for (const moveId of moveIds) { - const chargeAttr = allMoves[moveId].getAttrs(ChargeAttr)[0] - || allMoves[moveId].getAttrs(DelayedAttackAttr)[0] - || allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]; - if (chargeAttr) { - const moveChargeAnims = chargeAnims.get(chargeAttr.chargeAnim); + const chargeAnimSource = (allMoves[moveId].isChargingMove()) + ? allMoves[moveId] + : (allMoves[moveId].getAttrs(DelayedAttackAttr)[0] + ?? allMoves[moveId].getAttrs(BeakBlastHeaderAttr)[0]); + if (chargeAnimSource) { + const moveChargeAnims = chargeAnims.get(chargeAnimSource.chargeAnim); moveAnimations.push(moveChargeAnims instanceof AnimConfig ? moveChargeAnims : moveChargeAnims![0]); // TODO: is the bang correct? if (Array.isArray(moveChargeAnims)) { moveAnimations.push(moveChargeAnims[1]); @@ -803,23 +808,23 @@ export abstract class BattleAnim { let scaleX = (frame.zoomX / 100) * (!frame.mirror ? 1 : -1); const scaleY = (frame.zoomY / 100); switch (frame.focus) { - case AnimFocus.TARGET: - x += targetInitialX - targetFocusX; - y += (targetInitialY - targetHalfHeight) - targetFocusY; - break; - case AnimFocus.USER: - x += userInitialX - userFocusX; - y += (userInitialY - userHalfHeight) - userFocusY; - break; - case AnimFocus.USER_TARGET: - const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], - this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); - x = point[0]; - y = point[1]; - if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { - scaleX = scaleX * -1; - } - break; + case AnimFocus.TARGET: + x += targetInitialX - targetFocusX; + y += (targetInitialY - targetHalfHeight) - targetFocusY; + break; + case AnimFocus.USER: + x += userInitialX - userFocusX; + y += (userInitialY - userHalfHeight) - userFocusY; + break; + case AnimFocus.USER_TARGET: + const point = transformPoint(this.srcLine[0], this.srcLine[1], this.srcLine[2], this.srcLine[3], + this.dstLine[0], this.dstLine[1] - userHalfHeight, this.dstLine[2], this.dstLine[3] - targetHalfHeight, x, y); + x = point[0]; + y = point[1]; + if (frame.target === AnimFrameTarget.GRAPHIC && isReversed(this.srcLine[0], this.srcLine[2], this.dstLine[0], this.dstLine[2])) { + scaleX = scaleX * -1; + } + break; } const angle = -frame.angle; const key = frame.target === AnimFrameTarget.GRAPHIC ? g++ : frame.target === AnimFrameTarget.USER ? u++ : t++; @@ -993,44 +998,44 @@ export abstract class BattleAnim { spritePriorities[graphicIndex] = frame.priority; const setSpritePriority = (priority: integer) => { switch (priority) { - case 0: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon()!); // This bang assumes that if (the EnemyPokemon is undefined, then the PlayerPokemon function must return an object), correct assumption? - break; - case 1: - scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); - break; - case 2: - switch (frame.focus) { - case AnimFocus.USER: - if (this.bgSprite) { - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); - } else { - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? + case 0: + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, scene.getNonSwitchedEnemyPokemon() || scene.getNonSwitchedPlayerPokemon()!); // This bang assumes that if (the EnemyPokemon is undefined, then the PlayerPokemon function must return an object), correct assumption? + break; + case 1: + scene.field.moveTo(moveSprite, scene.field.getAll().length - 1); + break; + case 2: + switch (frame.focus) { + case AnimFocus.USER: + if (this.bgSprite) { + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.bgSprite); + } else { + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? + } + break; + case AnimFocus.TARGET: + scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? + break; + default: + setSpritePriority(1); + break; } break; - case AnimFocus.TARGET: - scene.field.moveBelow(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? + case 3: + switch (frame.focus) { + case AnimFocus.USER: + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? + break; + case AnimFocus.TARGET: + scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? + break; + default: + setSpritePriority(1); + break; + } break; default: setSpritePriority(1); - break; - } - break; - case 3: - switch (frame.focus) { - case AnimFocus.USER: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.user!); // TODO: is this bang correct? - break; - case AnimFocus.TARGET: - scene.field.moveAbove(moveSprite as Phaser.GameObjects.GameObject, this.target!); // TODO: is this bang correct? - break; - default: - setSpritePriority(1); - break; - } - break; - default: - setSpritePriority(1); } }; setSpritePriority(frame.priority); @@ -1396,108 +1401,108 @@ export async function populateAnims() { const fieldName = field.slice(0, field.indexOf(":")); const fieldData = field.slice(fieldName.length + 1, field.lastIndexOf("\n")).trim(); switch (fieldName) { - case "array": - const framesData = fieldData.split(" - - - ").slice(1); - for (let fd = 0; fd < framesData.length; fd++) { - anim.frames.push([]); - const frameData = framesData[fd]; - const focusFramesData = frameData.split(" - - "); - for (let tf = 0; tf < focusFramesData.length; tf++) { - const values = focusFramesData[tf].replace(/ \- /g, "").split("\n"); - const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), - parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), - parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), - parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); - anim.frames[fd].push(targetFrame); + case "array": + const framesData = fieldData.split(" - - - ").slice(1); + for (let fd = 0; fd < framesData.length; fd++) { + anim.frames.push([]); + const frameData = framesData[fd]; + const focusFramesData = frameData.split(" - - "); + for (let tf = 0; tf < focusFramesData.length; tf++) { + const values = focusFramesData[tf].replace(/ \- /g, "").split("\n"); + const targetFrame = new AnimFrame(parseFloat(values[0]), parseFloat(values[1]), parseFloat(values[2]), parseFloat(values[11]), parseFloat(values[3]), + parseInt(values[4]) === 1, parseInt(values[6]) === 1, parseInt(values[5]), parseInt(values[7]), parseInt(values[8]), parseInt(values[12]), parseInt(values[13]), + parseInt(values[14]), parseInt(values[15]), parseInt(values[16]), parseInt(values[17]), parseInt(values[18]), parseInt(values[19]), + parseInt(values[21]), parseInt(values[22]), parseInt(values[23]), parseInt(values[24]), parseInt(values[20]) === 1, parseInt(values[25]), parseInt(values[26]) as AnimFocus); + anim.frames[fd].push(targetFrame); + } } - } - break; - case "graphic": - const graphic = fieldData !== "''" ? fieldData : ""; - anim.graphic = graphic.indexOf(".") > -1 - ? graphic.slice(0, fieldData.indexOf(".")) - : graphic; - break; - case "timing": - const timingEntries = fieldData.split("- !ruby/object:PBAnimTiming ").slice(1); - for (let t = 0; t < timingEntries.length; t++) { - const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") - .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); - const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? - let resourceName = /name: "(.*?)"/.exec(timingData)![1].replace("''", ""); // TODO: is the bang correct? - const timingType = parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? - let timedEvent: AnimTimedEvent | undefined; - switch (timingType) { - case 0: - if (resourceName && resourceName.indexOf(".") === -1) { - let ext: string | undefined; - [ "wav", "mp3", "m4a" ].every(e => { - if (seNames.indexOf(`${resourceName}.${e}`) > -1) { - ext = e; - return false; + break; + case "graphic": + const graphic = fieldData !== "''" ? fieldData : ""; + anim.graphic = graphic.indexOf(".") > -1 + ? graphic.slice(0, fieldData.indexOf(".")) + : graphic; + break; + case "timing": + const timingEntries = fieldData.split("- !ruby/object:PBAnimTiming ").slice(1); + for (let t = 0; t < timingEntries.length; t++) { + const timingData = timingEntries[t].replace(/\n/g, " ").replace(/[ ]{2,}/g, " ").replace(/[a-z]+: ! '', /ig, "").replace(/name: (.*?),/, "name: \"$1\",") + .replace(/flashColor: !ruby\/object:Color { alpha: ([\d\.]+), blue: ([\d\.]+), green: ([\d\.]+), red: ([\d\.]+)}/, "flashRed: $4, flashGreen: $3, flashBlue: $2, flashAlpha: $1"); + const frameIndex = parseInt(/frame: (\d+)/.exec(timingData)![1]); // TODO: is the bang correct? + let resourceName = /name: "(.*?)"/.exec(timingData)![1].replace("''", ""); // TODO: is the bang correct? + const timingType = parseInt(/timingType: (\d)/.exec(timingData)![1]); // TODO: is the bang correct? + let timedEvent: AnimTimedEvent | undefined; + switch (timingType) { + case 0: + if (resourceName && resourceName.indexOf(".") === -1) { + let ext: string | undefined; + [ "wav", "mp3", "m4a" ].every(e => { + if (seNames.indexOf(`${resourceName}.${e}`) > -1) { + ext = e; + return false; + } + return true; + }); + if (!ext) { + ext = ".wav"; + } + resourceName += `.${ext}`; } - return true; - }); - if (!ext) { - ext = ".wav"; + timedEvent = new AnimTimedSoundEvent(frameIndex, resourceName); + break; + case 1: + timedEvent = new AnimTimedAddBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); + break; + case 2: + timedEvent = new AnimTimedUpdateBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); + break; + } + if (!timedEvent) { + continue; + } + const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; + let propMatch: RegExpExecArray; + while ((propMatch = propPattern.exec(timingData)!)) { // TODO: is this bang correct? + const prop = propMatch[1]; + let value: any = propMatch[2]; + switch (prop) { + case "bgX": + case "bgY": + value = parseFloat(value); + break; + case "volume": + case "pitch": + case "opacity": + case "colorRed": + case "colorGreen": + case "colorBlue": + case "colorAlpha": + case "duration": + case "flashScope": + case "flashRed": + case "flashGreen": + case "flashBlue": + case "flashAlpha": + case "flashDuration": + value = parseInt(value); + break; + } + if (timedEvent.hasOwnProperty(prop)) { + timedEvent[prop] = value; } - resourceName += `.${ext}`; } - timedEvent = new AnimTimedSoundEvent(frameIndex, resourceName); - break; - case 1: - timedEvent = new AnimTimedAddBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); - break; - case 2: - timedEvent = new AnimTimedUpdateBgEvent(frameIndex, resourceName.slice(0, resourceName.indexOf("."))); - break; - } - if (!timedEvent) { - continue; - } - const propPattern = /([a-z]+): (.*?)(?:,|\})/ig; - let propMatch: RegExpExecArray; - while ((propMatch = propPattern.exec(timingData)!)) { // TODO: is this bang correct? - const prop = propMatch[1]; - let value: any = propMatch[2]; - switch (prop) { - case "bgX": - case "bgY": - value = parseFloat(value); - break; - case "volume": - case "pitch": - case "opacity": - case "colorRed": - case "colorGreen": - case "colorBlue": - case "colorAlpha": - case "duration": - case "flashScope": - case "flashRed": - case "flashGreen": - case "flashBlue": - case "flashAlpha": - case "flashDuration": - value = parseInt(value); - break; + if (!anim.frameTimedEvents.has(frameIndex)) { + anim.frameTimedEvents.set(frameIndex, []); } - if (timedEvent.hasOwnProperty(prop)) { - timedEvent[prop] = value; - } - } - if (!anim.frameTimedEvents.has(frameIndex)) { - anim.frameTimedEvents.set(frameIndex, []); - } anim.frameTimedEvents.get(frameIndex)!.push(timedEvent); // TODO: is this bang correct? - } - break; - case "position": - anim.position = parseInt(fieldData); - break; - case "hue": - anim.hue = parseInt(fieldData); - break; + } + break; + case "position": + anim.position = parseInt(fieldData); + break; + case "hue": + anim.hue = parseInt(fieldData); + break; } } } diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 8491307fc76..d671c56ab26 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1,29 +1,43 @@ -import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims"; -import { getPokemonNameWithAffix } from "../messages"; -import Pokemon, { MoveResult, HitResult } from "../field/pokemon"; -import { StatusEffect } from "./status-effect"; -import * as Utils from "../utils"; -import { ChargeAttr, MoveFlags, allMoves, MoveCategory, applyMoveAttrs, StatusCategoryOnAllyAttr, HealOnAllyAttr, ConsecutiveUseDoublePowerAttr } from "./move"; -import { Type } from "./type"; -import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs, ProtectStatAbAttr } from "./ability"; -import { TerrainType } from "./terrain"; -import { WeatherType } from "./weather"; -import { allAbilities } from "./ability"; -import { SpeciesFormChangeManualTrigger } from "./pokemon-forms"; -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"; -import { Stat, type BattleStat, type EffectiveStat, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat"; +import BattleScene from "#app/battle-scene"; +import { + allAbilities, + applyAbAttrs, + BlockNonDirectDamageAbAttr, + FlinchEffectAbAttr, + ProtectStatAbAttr, + ReverseDrainAbAttr +} from "#app/data/ability"; +import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "#app/data/battle-anims"; +import Move, { + allMoves, + applyMoveAttrs, + ConsecutiveUseDoublePowerAttr, + HealOnAllyAttr, + MoveCategory, + MoveFlags, + StatusCategoryOnAllyAttr +} from "#app/data/move"; +import { SpeciesFormChangeManualTrigger } from "#app/data/pokemon-forms"; +import { StatusEffect } from "#app/data/status-effect"; +import { TerrainType } from "#app/data/terrain"; +import { Type } from "#app/data/type"; +import { WeatherType } from "#app/data/weather"; +import Pokemon, { HitResult, MoveResult } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { MovePhase } from "#app/phases/move-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { ShowAbilityPhase } from "#app/phases/show-ability-phase"; -import { StatStageChangePhase, StatStageChangeCallback } from "#app/phases/stat-stage-change-phase"; -import { PokemonAnimType } from "#app/enums/pokemon-anim-type"; -import BattleScene from "#app/battle-scene"; +import { StatStageChangeCallback, StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import i18next from "#app/plugins/i18n"; +import { BooleanHolder, getFrameMs, NumberHolder, toDmgValue } from "#app/utils"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { PokemonAnimType } from "#enums/pokemon-anim-type"; +import { Species } from "#enums/species"; +import { EFFECTIVE_STATS, getStatKey, Stat, type BattleStat, type EffectiveStat } from "#enums/stat"; export enum BattlerTagLapseType { FAINT, @@ -33,6 +47,7 @@ export enum BattlerTagLapseType { MOVE_EFFECT, TURN_END, HIT, + AFTER_HIT, CUSTOM } @@ -405,7 +420,7 @@ export class RechargingTag extends BattlerTag { */ export class BeakBlastChargingTag extends BattlerTag { constructor() { - super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 1, Moves.BEAK_BLAST); + super(BattlerTagType.BEAK_BLAST_CHARGING, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1, Moves.BEAK_BLAST); } onAdd(pokemon: Pokemon): void { @@ -421,16 +436,13 @@ export class BeakBlastChargingTag extends BattlerTag { * to be removed after the source makes a move (or the turn ends, whichever comes first) * @param pokemon {@linkcode Pokemon} the owner of this tag * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle - * @returns `true` if invoked with the CUSTOM lapse type; `false` otherwise + * @returns `true` if invoked with the `AFTER_HIT` lapse type */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - if (lapseType === BattlerTagLapseType.CUSTOM) { - const effectPhase = pokemon.scene.getCurrentPhase(); - if (effectPhase instanceof MoveEffectPhase) { - const attacker = effectPhase.getPokemon(); - if (effectPhase.move.getMove().checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { - attacker.trySetStatus(StatusEffect.BURN, true, pokemon); - } + if (lapseType === BattlerTagLapseType.AFTER_HIT) { + const phaseData = getMoveEffectPhaseData(pokemon); + if (phaseData?.move.hasFlag(MoveFlags.MAKES_CONTACT)) { + phaseData.attacker.trySetStatus(StatusEffect.BURN, true, pokemon); } return true; } @@ -444,11 +456,10 @@ export class BeakBlastChargingTag extends BattlerTag { * @see {@link https://bulbapedia.bulbagarden.net/wiki/Shell_Trap_(move) | Shell Trap} */ export class ShellTrapTag extends BattlerTag { - public activated: boolean; + public activated: boolean = false; constructor() { - super(BattlerTagType.SHELL_TRAP, BattlerTagLapseType.TURN_END, 1); - this.activated = false; + super(BattlerTagType.SHELL_TRAP, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.AFTER_HIT ], 1); } onAdd(pokemon: Pokemon): void { @@ -459,25 +470,33 @@ export class ShellTrapTag extends BattlerTag { * "Activates" the shell trap, causing the tag owner to move next. * @param pokemon {@linkcode Pokemon} the owner of this tag * @param lapseType {@linkcode BattlerTagLapseType} the type of functionality invoked in battle - * @returns `true` if invoked with the `CUSTOM` lapse type; `false` otherwise + * @returns `true` if invoked with the `AFTER_HIT` lapse type */ lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { - if (lapseType === BattlerTagLapseType.CUSTOM) { - const shellTrapPhaseIndex = pokemon.scene.phaseQueue.findIndex( - phase => phase instanceof MovePhase && phase.pokemon === pokemon - ); - const firstMovePhaseIndex = pokemon.scene.phaseQueue.findIndex( - phase => phase instanceof MovePhase - ); + if (lapseType === BattlerTagLapseType.AFTER_HIT) { + const phaseData = getMoveEffectPhaseData(pokemon); - if (shellTrapPhaseIndex !== -1 && shellTrapPhaseIndex !== firstMovePhaseIndex) { - const shellTrapMovePhase = pokemon.scene.phaseQueue.splice(shellTrapPhaseIndex, 1)[0]; - pokemon.scene.prependToPhase(shellTrapMovePhase, MovePhase); + // Trap should only be triggered by opponent's Physical moves + if (phaseData?.move.category === MoveCategory.PHYSICAL && pokemon.isOpponent(phaseData.attacker)) { + const shellTrapPhaseIndex = pokemon.scene.phaseQueue.findIndex( + phase => phase instanceof MovePhase && phase.pokemon === pokemon + ); + const firstMovePhaseIndex = pokemon.scene.phaseQueue.findIndex( + phase => phase instanceof MovePhase + ); + + // Only shift MovePhase timing if it's not already next up + if (shellTrapPhaseIndex !== -1 && shellTrapPhaseIndex !== firstMovePhaseIndex) { + const shellTrapMovePhase = pokemon.scene.phaseQueue.splice(shellTrapPhaseIndex, 1)[0]; + pokemon.scene.prependToPhase(shellTrapMovePhase, MovePhase); + } + + this.activated = true; } - this.activated = true; return true; } + return super.lapse(pokemon, lapseType); } } @@ -641,7 +660,7 @@ export class ConfusedTag extends BattlerTag { if (pokemon.randSeedInt(3) === 0) { const atk = pokemon.getEffectiveStat(Stat.ATK); const def = pokemon.getEffectiveStat(Stat.DEF); - const damage = Utils.toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); + const damage = toDmgValue(((((2 * pokemon.level / 5 + 2) * 40 * atk / def) / 50) + 2) * (pokemon.randSeedIntRange(85, 100) / 100)); pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself")); pokemon.damageAndUpdate(damage); pokemon.battleData.hitCount++; @@ -812,13 +831,13 @@ export class SeedTag extends BattlerTag { if (ret) { const source = pokemon.getOpponents().find(o => o.getBattlerIndex() === this.sourceIndex); if (source) { - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, source.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.LEECH_SEED)); - const damage = pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8)); + const damage = pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); const reverseDrain = pokemon.hasAbilityWithAttr(ReverseDrainAbAttr, false); pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, source.getBattlerIndex(), !reverseDrain ? damage : damage * -1, @@ -838,7 +857,7 @@ export class SeedTag extends BattlerTag { export class NightmareTag extends BattlerTag { constructor() { - super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.AFTER_MOVE, 1, Moves.NIGHTMARE); + super(BattlerTagType.NIGHTMARE, BattlerTagLapseType.TURN_END, 1, Moves.NIGHTMARE); } onAdd(pokemon: Pokemon): void { @@ -860,11 +879,11 @@ export class NightmareTag extends BattlerTag { pokemon.scene.queueMessage(i18next.t("battlerTags:nightmareLapse", { 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); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); } } @@ -919,18 +938,14 @@ export class EncoreTag extends BattlerTag { } switch (repeatableMove.move) { - case Moves.MIMIC: - case Moves.MIRROR_MOVE: - case Moves.TRANSFORM: - case Moves.STRUGGLE: - case Moves.SKETCH: - case Moves.SLEEP_TALK: - case Moves.ENCORE: - return false; - } - - if (allMoves[repeatableMove.move].hasAttr(ChargeAttr) && repeatableMove.result === MoveResult.OTHER) { - return false; + case Moves.MIMIC: + case Moves.MIRROR_MOVE: + case Moves.TRANSFORM: + case Moves.STRUGGLE: + case Moves.SKETCH: + case Moves.SLEEP_TALK: + case Moves.ENCORE: + return false; } this.moveId = repeatableMove.move; @@ -1004,7 +1019,7 @@ export class IngrainTag extends TrappedTag { new PokemonHealPhase( pokemon.scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 16), + toDmgValue(pokemon.getMaxHp() / 16), i18next.t("battlerTags:ingrainLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), true ) @@ -1067,7 +1082,7 @@ export class AquaRingTag extends BattlerTag { new PokemonHealPhase( pokemon.scene, pokemon.getBattlerIndex(), - Utils.toDmgValue(pokemon.getMaxHp() / 16), + toDmgValue(pokemon.getMaxHp() / 16), i18next.t("battlerTags:aquaRingLapse", { moveName: this.getMoveName(), pokemonName: getPokemonNameWithAffix(pokemon) @@ -1161,11 +1176,11 @@ export abstract class DamagingTrapTag extends TrappedTag { ); pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), undefined, this.commonAnim)); - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 8)); } } @@ -1356,7 +1371,7 @@ export class ContactDamageProtectedTag extends ProtectedTag { if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) { const attacker = effectPhase.getPokemon(); if (!attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { - attacker.damageAndUpdate(Utils.toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); + attacker.damageAndUpdate(toDmgValue(attacker.getMaxHp() * (1 / this.damageRatio)), HitResult.OTHER); } } } @@ -1641,12 +1656,12 @@ export class HighestStatBoostTag extends AbilityBattlerTag { this.stat = highestStat; switch (this.stat) { - case Stat.SPD: - this.multiplier = 1.5; - break; - default: - this.multiplier = 1.3; - break; + case Stat.SPD: + this.multiplier = 1.5; + break; + default: + this.multiplier = 1.3; + break; } pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true); @@ -1709,7 +1724,7 @@ export class SemiInvulnerableTag extends BattlerTag { onRemove(pokemon: Pokemon): void { // Wait 2 frames before setting visible for battle animations that don't immediately show the sprite invisible pokemon.scene.tweens.addCounter({ - duration: Utils.getFrameMs(2), + duration: getFrameMs(2), onComplete: () => pokemon.setVisible(true) }); } @@ -1860,12 +1875,12 @@ export class SaltCuredTag extends BattlerTag { if (ret) { pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { const pokemonSteelOrWater = pokemon.isOfType(Type.STEEL) || pokemon.isOfType(Type.WATER); - pokemon.damageAndUpdate(Utils.toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); + pokemon.damageAndUpdate(toDmgValue(pokemonSteelOrWater ? pokemon.getMaxHp() / 4 : pokemon.getMaxHp() / 8)); pokemon.scene.queueMessage( i18next.t("battlerTags:saltCuredLapse", { @@ -1907,11 +1922,11 @@ export class CursedTag extends BattlerTag { if (ret) { pokemon.scene.unshiftPhase(new CommonAnimPhase(pokemon.scene, pokemon.getBattlerIndex(), pokemon.getBattlerIndex(), CommonAnim.SALT_CURE)); - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, pokemon, cancelled); if (!cancelled.value) { - pokemon.damageAndUpdate(Utils.toDmgValue(pokemon.getMaxHp() / 4)); + pokemon.damageAndUpdate(toDmgValue(pokemon.getMaxHp() / 4)); pokemon.scene.queueMessage(i18next.t("battlerTags:cursedLapse", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); } } @@ -2173,7 +2188,7 @@ export class GulpMissileTag extends BattlerTag { return true; } - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(BlockNonDirectDamageAbAttr, attacker, cancelled); if (!cancelled.value) { @@ -2289,7 +2304,7 @@ export class HealBlockTag extends MoveRestrictionBattlerTag { * @returns `true` if the move cannot be used because the target is an ally */ override isMoveTargetRestricted(move: Moves, user: Pokemon, target: Pokemon) { - const moveCategory = new Utils.IntegerHolder(allMoves[move].category); + const moveCategory = new NumberHolder(allMoves[move].category); applyMoveAttrs(StatusCategoryOnAllyAttr, user, target, allMoves[move], moveCategory); if (allMoves[move].hasAttr(HealOnAllyAttr) && moveCategory.value === MoveCategory.STATUS ) { return true; @@ -2436,15 +2451,15 @@ export class SubstituteTag extends BattlerTag { lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean { switch (lapseType) { - case BattlerTagLapseType.PRE_MOVE: - this.onPreMove(pokemon); - break; - case BattlerTagLapseType.AFTER_MOVE: - this.onAfterMove(pokemon); - break; - case BattlerTagLapseType.HIT: - this.onHit(pokemon); - break; + case BattlerTagLapseType.PRE_MOVE: + this.onPreMove(pokemon); + break; + case BattlerTagLapseType.AFTER_MOVE: + this.onAfterMove(pokemon); + break; + case BattlerTagLapseType.HIT: + this.onHit(pokemon); + break; } return lapseType !== BattlerTagLapseType.CUSTOM; // only remove this tag on custom lapse } @@ -2506,7 +2521,7 @@ export class MysteryEncounterPostSummonTag extends BattlerTag { const ret = super.lapse(pokemon, lapseType); if (lapseType === BattlerTagLapseType.CUSTOM) { - const cancelled = new Utils.BooleanHolder(false); + const cancelled = new BooleanHolder(false); applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled); if (!cancelled.value) { if (pokemon.mysteryEncounterBattleEffects) { @@ -2571,7 +2586,7 @@ export class TormentTag extends MoveRestrictionBattlerTag { // This checks for locking / momentum moves like Rollout and Hydro Cannon + if the user is under the influence of BattlerTagType.FRENZY // Because Uproar's unique behavior is not implemented, it does not check for Uproar. Torment has been marked as partial in moves.ts const moveObj = allMoves[lastMove.move]; - const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || user.getTag(BattlerTagType.FRENZY) || moveObj.hasAttr(ChargeAttr); + const isUnaffected = moveObj.hasAttr(ConsecutiveUseDoublePowerAttr) || user.getTag(BattlerTagType.FRENZY); const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS); if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isUnaffected) { return true; @@ -2769,179 +2784,179 @@ export class PowerTrickTag extends BattlerTag { */ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { - case BattlerTagType.RECHARGING: - return new RechargingTag(sourceMove); - case BattlerTagType.BEAK_BLAST_CHARGING: - return new BeakBlastChargingTag(); - case BattlerTagType.SHELL_TRAP: - return new ShellTrapTag(); - case BattlerTagType.FLINCHED: - return new FlinchedTag(sourceMove); - case BattlerTagType.INTERRUPTED: - return new InterruptedTag(sourceMove); - case BattlerTagType.CONFUSED: - return new ConfusedTag(turnCount, sourceMove); - case BattlerTagType.INFATUATED: - return new InfatuatedTag(sourceMove, sourceId); - case BattlerTagType.SEEDED: - return new SeedTag(sourceId); - case BattlerTagType.NIGHTMARE: - return new NightmareTag(); - case BattlerTagType.FRENZY: - return new FrenzyTag(turnCount, sourceMove, sourceId); - case BattlerTagType.CHARGING: - return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); - case BattlerTagType.ENCORE: - return new EncoreTag(sourceId); - case BattlerTagType.HELPING_HAND: - return new HelpingHandTag(sourceId); - case BattlerTagType.INGRAIN: - return new IngrainTag(sourceId); - case BattlerTagType.AQUA_RING: - return new AquaRingTag(); - case BattlerTagType.DROWSY: - return new DrowsyTag(); - case BattlerTagType.TRAPPED: - return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); - case BattlerTagType.NO_RETREAT: - return new NoRetreatTag(sourceId); - case BattlerTagType.BIND: - return new BindTag(turnCount, sourceId); - case BattlerTagType.WRAP: - return new WrapTag(turnCount, sourceId); - case BattlerTagType.FIRE_SPIN: - return new FireSpinTag(turnCount, sourceId); - case BattlerTagType.WHIRLPOOL: - return new WhirlpoolTag(turnCount, sourceId); - case BattlerTagType.CLAMP: - return new ClampTag(turnCount, sourceId); - case BattlerTagType.SAND_TOMB: - return new SandTombTag(turnCount, sourceId); - case BattlerTagType.MAGMA_STORM: - return new MagmaStormTag(turnCount, sourceId); - case BattlerTagType.SNAP_TRAP: - return new SnapTrapTag(turnCount, sourceId); - case BattlerTagType.THUNDER_CAGE: - return new ThunderCageTag(turnCount, sourceId); - case BattlerTagType.INFESTATION: - return new InfestationTag(turnCount, sourceId); - case BattlerTagType.PROTECTED: - return new ProtectedTag(sourceMove); - case BattlerTagType.SPIKY_SHIELD: - return new ContactDamageProtectedTag(sourceMove, 8); - case BattlerTagType.KINGS_SHIELD: - return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.ATK, -1); - case BattlerTagType.OBSTRUCT: - return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.DEF, -2); - case BattlerTagType.SILK_TRAP: - return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.SPD, -1); - case BattlerTagType.BANEFUL_BUNKER: - return new ContactPoisonProtectedTag(sourceMove); - case BattlerTagType.BURNING_BULWARK: - return new ContactBurnProtectedTag(sourceMove); - case BattlerTagType.ENDURING: - return new EnduringTag(sourceMove); - case BattlerTagType.STURDY: - return new SturdyTag(sourceMove); - case BattlerTagType.PERISH_SONG: - return new PerishSongTag(turnCount); - case BattlerTagType.CENTER_OF_ATTENTION: - return new CenterOfAttentionTag(sourceMove); - case BattlerTagType.TRUANT: - return new TruantTag(); - case BattlerTagType.SLOW_START: - return new SlowStartTag(); - case BattlerTagType.PROTOSYNTHESIS: - return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); - case BattlerTagType.QUARK_DRIVE: - return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); - case BattlerTagType.FLYING: - case BattlerTagType.UNDERGROUND: - case BattlerTagType.UNDERWATER: - case BattlerTagType.HIDDEN: - return new SemiInvulnerableTag(tagType, turnCount, sourceMove); - case BattlerTagType.FIRE_BOOST: - return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); - case BattlerTagType.CRIT_BOOST: - return new CritBoostTag(tagType, sourceMove); - case BattlerTagType.DRAGON_CHEER: - return new DragonCheerTag(); - case BattlerTagType.ALWAYS_CRIT: - case BattlerTagType.IGNORE_ACCURACY: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); - case BattlerTagType.ALWAYS_GET_HIT: - case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: - return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); - case BattlerTagType.BYPASS_SLEEP: - return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); - case BattlerTagType.IGNORE_FLYING: - return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); - case BattlerTagType.ROOSTED: - return new RoostedTag(); - case BattlerTagType.BURNED_UP: - return new RemovedTypeTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); - case BattlerTagType.DOUBLE_SHOCKED: - return new RemovedTypeTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); - case BattlerTagType.SALT_CURED: - return new SaltCuredTag(sourceId); - case BattlerTagType.CURSED: - return new CursedTag(sourceId); - case BattlerTagType.CHARGED: - return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); - case BattlerTagType.FLOATING: - return new FloatingTag(tagType, sourceMove); - case BattlerTagType.MINIMIZED: - return new MinimizeTag(); - case BattlerTagType.DESTINY_BOND: - return new DestinyBondTag(sourceMove, sourceId); - case BattlerTagType.ICE_FACE: - return new IceFaceBlockDamageTag(tagType); - case BattlerTagType.DISGUISE: - return new FormBlockDamageTag(tagType); - case BattlerTagType.STOCKPILING: - return new StockpilingTag(sourceMove); - case BattlerTagType.OCTOLOCK: - return new OctolockTag(sourceId); - case BattlerTagType.DISABLED: - return new DisabledTag(sourceId); - case BattlerTagType.IGNORE_GHOST: - return new ExposedTag(tagType, sourceMove, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]); - case BattlerTagType.IGNORE_DARK: - return new ExposedTag(tagType, sourceMove, Type.DARK, [ Type.PSYCHIC ]); - case BattlerTagType.GULP_MISSILE_ARROKUDA: - case BattlerTagType.GULP_MISSILE_PIKACHU: - return new GulpMissileTag(tagType, sourceMove); - case BattlerTagType.TAR_SHOT: - return new TarShotTag(); - case BattlerTagType.ELECTRIFIED: - return new ElectrifiedTag(); - case BattlerTagType.THROAT_CHOPPED: - return new ThroatChoppedTag(); - case BattlerTagType.GORILLA_TACTICS: - return new GorillaTacticsTag(); - case BattlerTagType.SUBSTITUTE: - return new SubstituteTag(sourceMove, sourceId); - case BattlerTagType.AUTOTOMIZED: - return new AutotomizedTag(); - case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON: - return new MysteryEncounterPostSummonTag(); - case BattlerTagType.HEAL_BLOCK: - return new HealBlockTag(turnCount, sourceMove); - case BattlerTagType.TORMENT: - return new TormentTag(sourceId); - case BattlerTagType.TAUNT: - return new TauntTag(); - case BattlerTagType.IMPRISON: - return new ImprisonTag(sourceId); - case BattlerTagType.SYRUP_BOMB: - return new SyrupBombTag(sourceId); - case BattlerTagType.TELEKINESIS: - return new TelekinesisTag(sourceMove); - case BattlerTagType.POWER_TRICK: - return new PowerTrickTag(sourceMove, sourceId); - case BattlerTagType.NONE: - default: - return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); + case BattlerTagType.RECHARGING: + return new RechargingTag(sourceMove); + case BattlerTagType.BEAK_BLAST_CHARGING: + return new BeakBlastChargingTag(); + case BattlerTagType.SHELL_TRAP: + return new ShellTrapTag(); + case BattlerTagType.FLINCHED: + return new FlinchedTag(sourceMove); + case BattlerTagType.INTERRUPTED: + return new InterruptedTag(sourceMove); + case BattlerTagType.CONFUSED: + return new ConfusedTag(turnCount, sourceMove); + case BattlerTagType.INFATUATED: + return new InfatuatedTag(sourceMove, sourceId); + case BattlerTagType.SEEDED: + return new SeedTag(sourceId); + case BattlerTagType.NIGHTMARE: + return new NightmareTag(); + case BattlerTagType.FRENZY: + return new FrenzyTag(turnCount, sourceMove, sourceId); + case BattlerTagType.CHARGING: + return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, 1, sourceMove, sourceId); + case BattlerTagType.ENCORE: + return new EncoreTag(sourceId); + case BattlerTagType.HELPING_HAND: + return new HelpingHandTag(sourceId); + case BattlerTagType.INGRAIN: + return new IngrainTag(sourceId); + case BattlerTagType.AQUA_RING: + return new AquaRingTag(); + case BattlerTagType.DROWSY: + return new DrowsyTag(); + case BattlerTagType.TRAPPED: + return new TrappedTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); + case BattlerTagType.NO_RETREAT: + return new NoRetreatTag(sourceId); + case BattlerTagType.BIND: + return new BindTag(turnCount, sourceId); + case BattlerTagType.WRAP: + return new WrapTag(turnCount, sourceId); + case BattlerTagType.FIRE_SPIN: + return new FireSpinTag(turnCount, sourceId); + case BattlerTagType.WHIRLPOOL: + return new WhirlpoolTag(turnCount, sourceId); + case BattlerTagType.CLAMP: + return new ClampTag(turnCount, sourceId); + case BattlerTagType.SAND_TOMB: + return new SandTombTag(turnCount, sourceId); + case BattlerTagType.MAGMA_STORM: + return new MagmaStormTag(turnCount, sourceId); + case BattlerTagType.SNAP_TRAP: + return new SnapTrapTag(turnCount, sourceId); + case BattlerTagType.THUNDER_CAGE: + return new ThunderCageTag(turnCount, sourceId); + case BattlerTagType.INFESTATION: + return new InfestationTag(turnCount, sourceId); + case BattlerTagType.PROTECTED: + return new ProtectedTag(sourceMove); + case BattlerTagType.SPIKY_SHIELD: + return new ContactDamageProtectedTag(sourceMove, 8); + case BattlerTagType.KINGS_SHIELD: + return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.ATK, -1); + case BattlerTagType.OBSTRUCT: + return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.DEF, -2); + case BattlerTagType.SILK_TRAP: + return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.SPD, -1); + case BattlerTagType.BANEFUL_BUNKER: + return new ContactPoisonProtectedTag(sourceMove); + case BattlerTagType.BURNING_BULWARK: + return new ContactBurnProtectedTag(sourceMove); + case BattlerTagType.ENDURING: + return new EnduringTag(sourceMove); + case BattlerTagType.STURDY: + return new SturdyTag(sourceMove); + case BattlerTagType.PERISH_SONG: + return new PerishSongTag(turnCount); + case BattlerTagType.CENTER_OF_ATTENTION: + return new CenterOfAttentionTag(sourceMove); + case BattlerTagType.TRUANT: + return new TruantTag(); + case BattlerTagType.SLOW_START: + return new SlowStartTag(); + case BattlerTagType.PROTOSYNTHESIS: + return new WeatherHighestStatBoostTag(tagType, Abilities.PROTOSYNTHESIS, WeatherType.SUNNY, WeatherType.HARSH_SUN); + case BattlerTagType.QUARK_DRIVE: + return new TerrainHighestStatBoostTag(tagType, Abilities.QUARK_DRIVE, TerrainType.ELECTRIC); + case BattlerTagType.FLYING: + case BattlerTagType.UNDERGROUND: + case BattlerTagType.UNDERWATER: + case BattlerTagType.HIDDEN: + return new SemiInvulnerableTag(tagType, turnCount, sourceMove); + case BattlerTagType.FIRE_BOOST: + return new TypeBoostTag(tagType, sourceMove, Type.FIRE, 1.5, false); + case BattlerTagType.CRIT_BOOST: + return new CritBoostTag(tagType, sourceMove); + case BattlerTagType.DRAGON_CHEER: + return new DragonCheerTag(); + case BattlerTagType.ALWAYS_CRIT: + case BattlerTagType.IGNORE_ACCURACY: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, 2, sourceMove); + case BattlerTagType.ALWAYS_GET_HIT: + case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: + return new BattlerTag(tagType, BattlerTagLapseType.PRE_MOVE, 1, sourceMove); + case BattlerTagType.BYPASS_SLEEP: + return new BattlerTag(tagType, BattlerTagLapseType.TURN_END, turnCount, sourceMove); + case BattlerTagType.IGNORE_FLYING: + return new GroundedTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.ROOSTED: + return new RoostedTag(); + case BattlerTagType.BURNED_UP: + return new RemovedTypeTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.DOUBLE_SHOCKED: + return new RemovedTypeTag(tagType, BattlerTagLapseType.CUSTOM, sourceMove); + case BattlerTagType.SALT_CURED: + return new SaltCuredTag(sourceId); + case BattlerTagType.CURSED: + return new CursedTag(sourceId); + case BattlerTagType.CHARGED: + return new TypeBoostTag(tagType, sourceMove, Type.ELECTRIC, 2, true); + case BattlerTagType.FLOATING: + return new FloatingTag(tagType, sourceMove); + case BattlerTagType.MINIMIZED: + return new MinimizeTag(); + case BattlerTagType.DESTINY_BOND: + return new DestinyBondTag(sourceMove, sourceId); + case BattlerTagType.ICE_FACE: + return new IceFaceBlockDamageTag(tagType); + case BattlerTagType.DISGUISE: + return new FormBlockDamageTag(tagType); + case BattlerTagType.STOCKPILING: + return new StockpilingTag(sourceMove); + case BattlerTagType.OCTOLOCK: + return new OctolockTag(sourceId); + case BattlerTagType.DISABLED: + return new DisabledTag(sourceId); + case BattlerTagType.IGNORE_GHOST: + return new ExposedTag(tagType, sourceMove, Type.GHOST, [ Type.NORMAL, Type.FIGHTING ]); + case BattlerTagType.IGNORE_DARK: + return new ExposedTag(tagType, sourceMove, Type.DARK, [ Type.PSYCHIC ]); + case BattlerTagType.GULP_MISSILE_ARROKUDA: + case BattlerTagType.GULP_MISSILE_PIKACHU: + return new GulpMissileTag(tagType, sourceMove); + case BattlerTagType.TAR_SHOT: + return new TarShotTag(); + case BattlerTagType.ELECTRIFIED: + return new ElectrifiedTag(); + case BattlerTagType.THROAT_CHOPPED: + return new ThroatChoppedTag(); + case BattlerTagType.GORILLA_TACTICS: + return new GorillaTacticsTag(); + case BattlerTagType.SUBSTITUTE: + return new SubstituteTag(sourceMove, sourceId); + case BattlerTagType.AUTOTOMIZED: + return new AutotomizedTag(); + case BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON: + return new MysteryEncounterPostSummonTag(); + case BattlerTagType.HEAL_BLOCK: + return new HealBlockTag(turnCount, sourceMove); + case BattlerTagType.TORMENT: + return new TormentTag(sourceId); + case BattlerTagType.TAUNT: + return new TauntTag(); + case BattlerTagType.IMPRISON: + return new ImprisonTag(sourceId); + case BattlerTagType.SYRUP_BOMB: + return new SyrupBombTag(sourceId); + case BattlerTagType.TELEKINESIS: + return new TelekinesisTag(sourceMove); + case BattlerTagType.POWER_TRICK: + return new PowerTrickTag(sourceMove, sourceId); + case BattlerTagType.NONE: + default: + return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); } } @@ -2955,3 +2970,22 @@ export function loadBattlerTag(source: BattlerTag | any): BattlerTag { tag.loadTag(source); return tag; } + +/** + * Helper function to verify that the current phase is a MoveEffectPhase and provide quick access to commonly used fields + * + * @param pokemon {@linkcode Pokemon} The Pokémon used to access the current phase + * @returns null if current phase is not MoveEffectPhase, otherwise Object containing the {@linkcode MoveEffectPhase}, and its + * corresponding {@linkcode Move} and user {@linkcode Pokemon} + */ +function getMoveEffectPhaseData(pokemon: Pokemon): {phase: MoveEffectPhase, attacker: Pokemon, move: Move} | null { + const phase = pokemon.scene.getCurrentPhase(); + if (phase instanceof MoveEffectPhase) { + return { + phase : phase, + attacker : phase.getPokemon(), + move : phase.move.getMove() + }; + } + return null; +} diff --git a/src/data/berry.ts b/src/data/berry.ts index 01325ee39dd..7243c4c1b2e 100644 --- a/src/data/berry.ts +++ b/src/data/berry.ts @@ -22,42 +22,42 @@ export type BerryPredicate = (pokemon: Pokemon) => boolean; export function getBerryPredicate(berryType: BerryType): BerryPredicate { switch (berryType) { - case BerryType.SITRUS: - return (pokemon: Pokemon) => pokemon.getHpRatio() < 0.5; - case BerryType.LUM: - return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); - case BerryType.ENIGMA: - return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; - case BerryType.LIECHI: - case BerryType.GANLON: - case BerryType.PETAYA: - case BerryType.APICOT: - case BerryType.SALAC: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth - const stat: BattleStat = berryType - BerryType.ENIGMA; - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); - return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6; - }; - case BerryType.LANSAT: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); - return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST); - }; - case BerryType.STARF: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); - return pokemon.getHpRatio() < 0.25; - }; - case BerryType.LEPPA: - return (pokemon: Pokemon) => { - const threshold = new Utils.NumberHolder(0.25); - applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); - return !!pokemon.getMoveset().find(m => !m?.getPpRatio()); - }; + case BerryType.SITRUS: + return (pokemon: Pokemon) => pokemon.getHpRatio() < 0.5; + case BerryType.LUM: + return (pokemon: Pokemon) => !!pokemon.status || !!pokemon.getTag(BattlerTagType.CONFUSED); + case BerryType.ENIGMA: + return (pokemon: Pokemon) => !!pokemon.turnData.attacksReceived.filter(a => a.result === HitResult.SUPER_EFFECTIVE).length; + case BerryType.LIECHI: + case BerryType.GANLON: + case BerryType.PETAYA: + case BerryType.APICOT: + case BerryType.SALAC: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth + const stat: BattleStat = berryType - BerryType.ENIGMA; + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6; + }; + case BerryType.LANSAT: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return pokemon.getHpRatio() < 0.25 && !pokemon.getTag(BattlerTagType.CRIT_BOOST); + }; + case BerryType.STARF: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return pokemon.getHpRatio() < 0.25; + }; + case BerryType.LEPPA: + return (pokemon: Pokemon) => { + const threshold = new Utils.NumberHolder(0.25); + applyAbAttrs(ReduceBerryUseThresholdAbAttr, pokemon, null, false, threshold); + return !!pokemon.getMoveset().find(m => !m?.getPpRatio()); + }; } } @@ -65,70 +65,70 @@ export type BerryEffectFunc = (pokemon: Pokemon) => void; export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc { switch (berryType) { - case BerryType.SITRUS: - case BerryType.ENIGMA: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4)); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed); - pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), - hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); - }; - case BerryType.LUM: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - if (pokemon.status) { - pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); - } - pokemon.resetStatus(true, true); - pokemon.updateInfo(); - }; - case BerryType.LIECHI: - case BerryType.GANLON: - case BerryType.PETAYA: - case BerryType.APICOT: - case BerryType.SALAC: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth - const stat: BattleStat = berryType - BerryType.ENIGMA; - const statStages = new Utils.NumberHolder(1); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], statStages.value)); - }; - case BerryType.LANSAT: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - pokemon.addTag(BattlerTagType.CRIT_BOOST); - }; - case BerryType.STARF: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); - const stages = new Utils.NumberHolder(2); - applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); - pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); - }; - case BerryType.LEPPA: - return (pokemon: Pokemon) => { - if (pokemon.battleData) { - pokemon.battleData.berriesEaten.push(berryType); - } - const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) ? pokemon.getMoveset().find(m => !m?.getPpRatio()) : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? - if (ppRestoreMove !== undefined) { + case BerryType.SITRUS: + case BerryType.ENIGMA: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const hpHealed = new Utils.NumberHolder(Utils.toDmgValue(pokemon.getMaxHp() / 4)); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, hpHealed); + pokemon.scene.unshiftPhase(new PokemonHealPhase(pokemon.scene, pokemon.getBattlerIndex(), + hpHealed.value, i18next.t("battle:hpHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), berryName: getBerryName(berryType) }), true)); + }; + case BerryType.LUM: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + if (pokemon.status) { + pokemon.scene.queueMessage(getStatusEffectHealText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); + } + pokemon.resetStatus(true, true); + pokemon.updateInfo(); + }; + case BerryType.LIECHI: + case BerryType.GANLON: + case BerryType.PETAYA: + case BerryType.APICOT: + case BerryType.SALAC: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + // Offset BerryType such that LIECHI -> Stat.ATK = 1, GANLON -> Stat.DEF = 2, so on and so forth + const stat: BattleStat = berryType - BerryType.ENIGMA; + const statStages = new Utils.NumberHolder(1); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statStages); + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], statStages.value)); + }; + case BerryType.LANSAT: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + pokemon.addTag(BattlerTagType.CRIT_BOOST); + }; + case BerryType.STARF: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const randStat = Utils.randSeedInt(Stat.SPD, Stat.ATK); + const stages = new Utils.NumberHolder(2); + applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, stages); + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ randStat ], stages.value)); + }; + case BerryType.LEPPA: + return (pokemon: Pokemon) => { + if (pokemon.battleData) { + pokemon.battleData.berriesEaten.push(berryType); + } + const ppRestoreMove = pokemon.getMoveset().find(m => !m?.getPpRatio()) ? pokemon.getMoveset().find(m => !m?.getPpRatio()) : pokemon.getMoveset().find(m => m!.getPpRatio() < 1); // TODO: is this bang correct? + if (ppRestoreMove !== undefined) { ppRestoreMove!.ppUsed = Math.max(ppRestoreMove!.ppUsed - 10, 0); pokemon.scene.queueMessage(i18next.t("battle:ppHealBerry", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: ppRestoreMove!.getName(), berryName: getBerryName(berryType) })); - } - }; + } + }; } } diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 7ecdfbf36e1..a64a90e5d14 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -448,21 +448,21 @@ export class SingleGenerationChallenge extends Challenge { applyFixedBattle(waveIndex: Number, battleConfig: FixedBattleConfig): boolean { let trainerTypes: TrainerType[] = []; switch (waveIndex) { - case 182: - trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]), TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; - break; - case 184: - trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; - break; - case 186: - trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ]), TrainerType.LARRY_ELITE ]; - break; - case 188: - trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; - break; - case 190: - trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; - break; + case 182: + trainerTypes = [ TrainerType.LORELEI, TrainerType.WILL, TrainerType.SIDNEY, TrainerType.AARON, TrainerType.SHAUNTAL, TrainerType.MALVA, Utils.randSeedItem([ TrainerType.HALA, TrainerType.MOLAYNE ]), TrainerType.MARNIE_ELITE, TrainerType.RIKA ]; + break; + case 184: + trainerTypes = [ TrainerType.BRUNO, TrainerType.KOGA, TrainerType.PHOEBE, TrainerType.BERTHA, TrainerType.MARSHAL, TrainerType.SIEBOLD, TrainerType.OLIVIA, TrainerType.NESSA_ELITE, TrainerType.POPPY ]; + break; + case 186: + trainerTypes = [ TrainerType.AGATHA, TrainerType.BRUNO, TrainerType.GLACIA, TrainerType.FLINT, TrainerType.GRIMSLEY, TrainerType.WIKSTROM, TrainerType.ACEROLA, Utils.randSeedItem([ TrainerType.BEA_ELITE, TrainerType.ALLISTER_ELITE ]), TrainerType.LARRY_ELITE ]; + break; + case 188: + trainerTypes = [ TrainerType.LANCE, TrainerType.KAREN, TrainerType.DRAKE, TrainerType.LUCIAN, TrainerType.CAITLIN, TrainerType.DRASNA, TrainerType.KAHILI, TrainerType.RAIHAN_ELITE, TrainerType.HASSEL ]; + break; + case 190: + trainerTypes = [ TrainerType.BLUE, Utils.randSeedItem([ TrainerType.RED, TrainerType.LANCE_CHAMPION ]), Utils.randSeedItem([ TrainerType.STEVEN, TrainerType.WALLACE ]), TrainerType.CYNTHIA, Utils.randSeedItem([ TrainerType.ALDER, TrainerType.IRIS ]), TrainerType.DIANTHA, TrainerType.HAU, TrainerType.LEON, Utils.randSeedItem([ TrainerType.GEETA, TrainerType.NEMONA ]) ]; + break; } if (trainerTypes.length === 0) { return false; @@ -891,45 +891,45 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType gameMode.challenges.forEach(c => { if (c.value !== 0) { switch (challengeType) { - case ChallengeType.STARTER_CHOICE: - ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.STARTER_POINTS: - ret ||= c.applyStarterPoints(args[0]); - break; - case ChallengeType.STARTER_COST: - ret ||= c.applyStarterCost(args[0], args[1]); - break; - case ChallengeType.STARTER_MODIFY: - ret ||= c.applyStarterModify(args[0]); - break; - case ChallengeType.POKEMON_IN_BATTLE: - ret ||= c.applyPokemonInBattle(args[0], args[1]); - break; - case ChallengeType.FIXED_BATTLES: - ret ||= c.applyFixedBattle(args[0], args[1]); - break; - case ChallengeType.TYPE_EFFECTIVENESS: - ret ||= c.applyTypeEffectiveness(args[0]); - break; - case ChallengeType.AI_LEVEL: - ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.AI_MOVE_SLOTS: - ret ||= c.applyMoveSlot(args[0], args[1]); - break; - case ChallengeType.PASSIVE_ACCESS: - ret ||= c.applyPassiveAccess(args[0], args[1]); - break; - case ChallengeType.GAME_MODE_MODIFY: - ret ||= c.applyGameModeModify(gameMode); - break; - case ChallengeType.MOVE_ACCESS: - ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); - break; - case ChallengeType.MOVE_WEIGHT: - ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); - break; + case ChallengeType.STARTER_CHOICE: + ret ||= c.applyStarterChoice(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.STARTER_POINTS: + ret ||= c.applyStarterPoints(args[0]); + break; + case ChallengeType.STARTER_COST: + ret ||= c.applyStarterCost(args[0], args[1]); + break; + case ChallengeType.STARTER_MODIFY: + ret ||= c.applyStarterModify(args[0]); + break; + case ChallengeType.POKEMON_IN_BATTLE: + ret ||= c.applyPokemonInBattle(args[0], args[1]); + break; + case ChallengeType.FIXED_BATTLES: + ret ||= c.applyFixedBattle(args[0], args[1]); + break; + case ChallengeType.TYPE_EFFECTIVENESS: + ret ||= c.applyTypeEffectiveness(args[0]); + break; + case ChallengeType.AI_LEVEL: + ret ||= c.applyLevelChange(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.AI_MOVE_SLOTS: + ret ||= c.applyMoveSlot(args[0], args[1]); + break; + case ChallengeType.PASSIVE_ACCESS: + ret ||= c.applyPassiveAccess(args[0], args[1]); + break; + case ChallengeType.GAME_MODE_MODIFY: + ret ||= c.applyGameModeModify(gameMode); + break; + case ChallengeType.MOVE_ACCESS: + ret ||= c.applyMoveAccessLevel(args[0], args[1], args[2], args[3]); + break; + case ChallengeType.MOVE_WEIGHT: + ret ||= c.applyMoveWeight(args[0], args[1], args[2], args[3]); + break; } } }); @@ -943,18 +943,18 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType */ export function copyChallenge(source: Challenge | any): Challenge { switch (source.id) { - case Challenges.SINGLE_GENERATION: - return SingleGenerationChallenge.loadChallenge(source); - case Challenges.SINGLE_TYPE: - return SingleTypeChallenge.loadChallenge(source); - case Challenges.LOWER_MAX_STARTER_COST: - return LowerStarterMaxCostChallenge.loadChallenge(source); - case Challenges.LOWER_STARTER_POINTS: - return LowerStarterPointsChallenge.loadChallenge(source); - case Challenges.FRESH_START: - return FreshStartChallenge.loadChallenge(source); - case Challenges.INVERSE_BATTLE: - return InverseBattleChallenge.loadChallenge(source); + case Challenges.SINGLE_GENERATION: + return SingleGenerationChallenge.loadChallenge(source); + case Challenges.SINGLE_TYPE: + return SingleTypeChallenge.loadChallenge(source); + case Challenges.LOWER_MAX_STARTER_COST: + return LowerStarterMaxCostChallenge.loadChallenge(source); + case Challenges.LOWER_STARTER_POINTS: + return LowerStarterPointsChallenge.loadChallenge(source); + case Challenges.FRESH_START: + return FreshStartChallenge.loadChallenge(source); + case Challenges.INVERSE_BATTLE: + return InverseBattleChallenge.loadChallenge(source); } throw new Error("Unknown challenge copied"); } diff --git a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts b/src/data/custom-pokemon-data.ts similarity index 68% rename from src/data/mystery-encounters/mystery-encounter-pokemon-data.ts rename to src/data/custom-pokemon-data.ts index fc6ce313d41..2e94123fc84 100644 --- a/src/data/mystery-encounters/mystery-encounter-pokemon-data.ts +++ b/src/data/custom-pokemon-data.ts @@ -1,18 +1,20 @@ import { Abilities } from "#enums/abilities"; import { Type } from "#app/data/type"; import { isNullOrUndefined } from "#app/utils"; +import { Nature } from "#enums/nature"; /** * Data that can customize a Pokemon in non-standard ways from its Species - * Currently only used by Mystery Encounters, may need to be renamed if it becomes more widely used + * Currently only used by Mystery Encounters and Mints. */ -export class MysteryEncounterPokemonData { +export class CustomPokemonData { public spriteScale: number; public ability: Abilities | -1; public passive: Abilities | -1; + public nature: Nature | -1; public types: Type[]; - constructor(data?: MysteryEncounterPokemonData | Partial) { + constructor(data?: CustomPokemonData | Partial) { if (!isNullOrUndefined(data)) { Object.assign(this, data); } @@ -20,6 +22,7 @@ export class MysteryEncounterPokemonData { this.spriteScale = this.spriteScale ?? -1; this.ability = this.ability ?? -1; this.passive = this.passive ?? -1; + this.nature = this.nature ?? -1; this.types = this.types ?? []; } } diff --git a/src/data/egg.ts b/src/data/egg.ts index c475fc729e6..f7d109dfa62 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -262,14 +262,14 @@ export class Egg { return "Manaphy"; } switch (this.tier) { - case EggTier.RARE: - return i18next.t("egg:greatTier"); - case EggTier.EPIC: - return i18next.t("egg:ultraTier"); - case EggTier.LEGENDARY: - return i18next.t("egg:masterTier"); - default: - return i18next.t("egg:defaultTier"); + case EggTier.RARE: + return i18next.t("egg:greatTier"); + case EggTier.EPIC: + return i18next.t("egg:ultraTier"); + case EggTier.LEGENDARY: + return i18next.t("egg:masterTier"); + default: + return i18next.t("egg:defaultTier"); } } @@ -288,19 +288,19 @@ export class Egg { public getEggTypeDescriptor(scene: BattleScene): string { switch (this.sourceType) { - case EggSourceType.SAME_SPECIES_EGG: - return this._eggDescriptor ?? i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName() }); - case EggSourceType.GACHA_LEGENDARY: - return this._eggDescriptor ?? `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; - case EggSourceType.GACHA_SHINY: - return this._eggDescriptor ?? i18next.t("egg:gachaTypeShiny"); - case EggSourceType.GACHA_MOVE: - return this._eggDescriptor ?? i18next.t("egg:gachaTypeMove"); - case EggSourceType.EVENT: - return this._eggDescriptor ?? i18next.t("egg:eventType"); - default: - console.warn("getEggTypeDescriptor case not defined. Returning default empty string"); - return ""; + case EggSourceType.SAME_SPECIES_EGG: + return this._eggDescriptor ?? i18next.t("egg:sameSpeciesEgg", { species: getPokemonSpecies(this._species).getName() }); + case EggSourceType.GACHA_LEGENDARY: + return this._eggDescriptor ?? `${i18next.t("egg:gachaTypeLegendary")} (${getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(scene, this.timestamp)).getName()})`; + case EggSourceType.GACHA_SHINY: + return this._eggDescriptor ?? i18next.t("egg:gachaTypeShiny"); + case EggSourceType.GACHA_MOVE: + return this._eggDescriptor ?? i18next.t("egg:gachaTypeMove"); + case EggSourceType.EVENT: + return this._eggDescriptor ?? i18next.t("egg:eventType"); + default: + console.warn("getEggTypeDescriptor case not defined. Returning default empty string"); + return ""; } } @@ -315,14 +315,14 @@ export class Egg { private rollEggMoveIndex() { let baseChance = GACHA_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; + 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; } const tierMultiplier = this.isManaphyEgg() ? 2 : Math.pow(2, 3 - this.tier); @@ -335,12 +335,12 @@ export class Egg { } switch (eggTier ?? this._tier) { - case EggTier.COMMON: - return HATCH_WAVES_COMMON_EGG; - case EggTier.RARE: - return HATCH_WAVES_RARE_EGG; - case EggTier.EPIC: - return HATCH_WAVES_EPIC_EGG; + case EggTier.COMMON: + return HATCH_WAVES_COMMON_EGG; + case EggTier.RARE: + return HATCH_WAVES_RARE_EGG; + case EggTier.EPIC: + return HATCH_WAVES_EPIC_EGG; } return HATCH_WAVES_LEGENDARY_EGG; } @@ -379,22 +379,22 @@ export class Egg { let maxStarterValue: integer; switch (this.tier) { - case EggTier.RARE: - minStarterValue = 4; - maxStarterValue = 5; - break; - case EggTier.EPIC: - minStarterValue = 6; - maxStarterValue = 7; - break; - case EggTier.LEGENDARY: - minStarterValue = 8; - maxStarterValue = 9; - break; - default: - minStarterValue = 1; - maxStarterValue = 3; - break; + case EggTier.RARE: + minStarterValue = 4; + maxStarterValue = 5; + break; + case EggTier.EPIC: + minStarterValue = 6; + maxStarterValue = 7; + break; + case EggTier.LEGENDARY: + minStarterValue = 8; + maxStarterValue = 9; + break; + default: + minStarterValue = 1; + maxStarterValue = 3; + break; } const ignoredSpecies = [ Species.PHIONE, Species.MANAPHY, Species.ETERNATUS ]; @@ -469,14 +469,14 @@ export class Egg { private rollShiny(): boolean { let shinyChance = GACHA_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; + 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); @@ -523,15 +523,15 @@ export class Egg { return; } switch (this.tier) { - case EggTier.RARE: - scene.gameData.gameStats.rareEggsPulled++; - break; - case EggTier.EPIC: - scene.gameData.gameStats.epicEggsPulled++; - break; - case EggTier.LEGENDARY: - scene.gameData.gameStats.legendaryEggsPulled++; - break; + case EggTier.RARE: + scene.gameData.gameStats.rareEggsPulled++; + break; + case EggTier.EPIC: + scene.gameData.gameStats.epicEggsPulled++; + break; + case EggTier.LEGENDARY: + scene.gameData.gameStats.legendaryEggsPulled++; + break; } } @@ -544,11 +544,15 @@ export class Egg { //// } -export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { - const legendarySpecies = Object.entries(speciesEggTiers) +export function getValidLegendaryGachaSpecies() : Species[] { + return Object.entries(speciesEggTiers) .filter(s => s[1] === EggTier.LEGENDARY) .map(s => parseInt(s[0])) - .filter(s => getPokemonSpecies(s).isObtainable()); + .filter(s => getPokemonSpecies(s).isObtainable() && s !== Species.ETERNATUS); +} + +export function getLegendaryGachaSpeciesForTimestamp(scene: BattleScene, timestamp: number): Species { + const legendarySpecies = getValidLegendaryGachaSpecies(); let ret: Species; diff --git a/src/data/exp.ts b/src/data/exp.ts index 3b332eb7cf2..c03abddadfc 100644 --- a/src/data/exp.ts +++ b/src/data/exp.ts @@ -28,24 +28,24 @@ export function getLevelTotalExp(level: integer, growthRate: GrowthRate): intege let ret: integer; switch (growthRate) { - case GrowthRate.ERRATIC: - ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; - break; - case GrowthRate.FAST: - ret = Math.pow(level, 3) * 4 / 5; - break; - case GrowthRate.MEDIUM_FAST: - ret = Math.pow(level, 3); - break; - case GrowthRate.MEDIUM_SLOW: - ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; - break; - case GrowthRate.SLOW: - ret = Math.pow(level, 3) * 5 / 4; - break; - case GrowthRate.FLUCTUATING: - ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); - break; + case GrowthRate.ERRATIC: + ret = (Math.pow(level, 4) + (Math.pow(level, 3) * 2000)) / 3500; + break; + case GrowthRate.FAST: + ret = Math.pow(level, 3) * 4 / 5; + break; + case GrowthRate.MEDIUM_FAST: + ret = Math.pow(level, 3); + break; + case GrowthRate.MEDIUM_SLOW: + ret = (Math.pow(level, 3) * 6 / 5) - (15 * Math.pow(level, 2)) + (100 * level) - 140; + break; + case GrowthRate.SLOW: + ret = Math.pow(level, 3) * 5 / 4; + break; + case GrowthRate.FLUCTUATING: + ret = (Math.pow(level, 3) * ((level / 2) + 8)) * 4 / (100 + level); + break; } if (growthRate !== GrowthRate.MEDIUM_FAST) { @@ -61,17 +61,17 @@ export function getLevelRelExp(level: integer, growthRate: GrowthRate): number { export function getGrowthRateColor(growthRate: GrowthRate, shadow?: boolean) { switch (growthRate) { - case GrowthRate.ERRATIC: - return !shadow ? "#f85888" : "#906060"; - case GrowthRate.FAST: - return !shadow ? "#f8d030" : "#b8a038"; - case GrowthRate.MEDIUM_FAST: - return !shadow ? "#78c850" : "#588040"; - case GrowthRate.MEDIUM_SLOW: - return !shadow ? "#6890f0" : "#807870"; - case GrowthRate.SLOW: - return !shadow ? "#f08030" : "#c03028"; - case GrowthRate.FLUCTUATING: - return !shadow ? "#a040a0" : "#483850"; + case GrowthRate.ERRATIC: + return !shadow ? "#f85888" : "#906060"; + case GrowthRate.FAST: + return !shadow ? "#f8d030" : "#b8a038"; + case GrowthRate.MEDIUM_FAST: + return !shadow ? "#78c850" : "#588040"; + case GrowthRate.MEDIUM_SLOW: + return !shadow ? "#6890f0" : "#807870"; + case GrowthRate.SLOW: + return !shadow ? "#f08030" : "#c03028"; + case GrowthRate.FLUCTUATING: + return !shadow ? "#a040a0" : "#483850"; } } diff --git a/src/data/gender.ts b/src/data/gender.ts index 0d4b76d8bd1..dae7723dd85 100644 --- a/src/data/gender.ts +++ b/src/data/gender.ts @@ -6,20 +6,20 @@ export enum Gender { export function getGenderSymbol(gender: Gender) { switch (gender) { - case Gender.MALE: - return "♂"; - case Gender.FEMALE: - return "♀"; + case Gender.MALE: + return "♂"; + case Gender.FEMALE: + return "♀"; } return ""; } export function getGenderColor(gender: Gender, shadow?: boolean) { switch (gender) { - case Gender.MALE: - return shadow ? "#006090" : "#40c8f8"; - case Gender.FEMALE: - return shadow ? "#984038" : "#f89890"; + case Gender.MALE: + return shadow ? "#006090" : "#40c8f8"; + case Gender.FEMALE: + return shadow ? "#984038" : "#f89890"; } return "#ffffff"; } diff --git a/src/data/move.ts b/src/data/move.ts index 57307b49061..cd206755238 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8,7 +8,7 @@ import { Constructor, NumberHolder } from "#app/utils"; import * as Utils from "../utils"; import { WeatherType } from "./weather"; import { ArenaTagSide, ArenaTrapTag, WeakenMoveTypeTag } from "./arena-tag"; -import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, applyAbAttrs, applyPostAttackAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BlockItemTheftAbAttr, BlockNonDirectDamageAbAttr, BlockOneHitKOAbAttr, BlockRecoilDamageAttr, ConfusionOnStatusEffectAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, HealFromBerryUseAbAttr, IgnoreContactAbAttr, IgnoreMoveEffectsAbAttr, IgnoreProtectOnContactAbAttr, MaxMultiHitAbAttr, MoveAbilityBypassAbAttr, MoveEffectChanceMultiplierAbAttr, MoveTypeChangeAbAttr, ReverseDrainAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, UnswappableAbilityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "./ability"; +import { allAbilities, AllyMoveCategoryPowerBoostAbAttr, applyAbAttrs, applyPostAttackAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, BlockItemTheftAbAttr, BlockNonDirectDamageAbAttr, BlockOneHitKOAbAttr, BlockRecoilDamageAttr, ConfusionOnStatusEffectAbAttr, FieldMoveTypePowerBoostAbAttr, FieldPreventExplosiveMovesAbAttr, ForceSwitchOutImmunityAbAttr, HealFromBerryUseAbAttr, IgnoreContactAbAttr, IgnoreMoveEffectsAbAttr, IgnoreProtectOnContactAbAttr, InfiltratorAbAttr, MaxMultiHitAbAttr, MoveAbilityBypassAbAttr, MoveEffectChanceMultiplierAbAttr, MoveTypeChangeAbAttr, PostDamageForceSwitchAbAttr, ReverseDrainAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilityAbAttr, UnswappableAbilityAbAttr, UserFieldMoveTypePowerBoostAbAttr, VariableMovePowerAbAttr, WonderSkinAbAttr } from "./ability"; import { AttackTypeBoosterModifier, BerryModifier, PokemonHeldItemModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PreserveBerryModifier } from "../modifier/modifier"; import { BattlerIndex, BattleType } from "../battle"; import { TerrainType } from "./terrain"; @@ -274,38 +274,41 @@ export default class Move implements Localizable { */ isMultiTarget(): boolean { switch (this.moveTarget) { - case MoveTarget.ALL_OTHERS: - case MoveTarget.ALL_NEAR_OTHERS: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_ENEMIES: - case MoveTarget.USER_AND_ALLIES: - case MoveTarget.ALL: - case MoveTarget.USER_SIDE: - case MoveTarget.ENEMY_SIDE: - case MoveTarget.BOTH_SIDES: - return true; + case MoveTarget.ALL_OTHERS: + case MoveTarget.ALL_NEAR_OTHERS: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_ENEMIES: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.ALL: + case MoveTarget.USER_SIDE: + case MoveTarget.ENEMY_SIDE: + case MoveTarget.BOTH_SIDES: + return true; } return false; } /** - * Getter function that returns if the move targets itself or an ally + * Getter function that returns if the move targets the user or its ally * @returns boolean */ - isAllyTarget(): boolean { switch (this.moveTarget) { - case MoveTarget.USER: - case MoveTarget.NEAR_ALLY: - case MoveTarget.ALLY: - case MoveTarget.USER_OR_NEAR_ALLY: - case MoveTarget.USER_AND_ALLIES: - case MoveTarget.USER_SIDE: - return true; + case MoveTarget.USER: + case MoveTarget.NEAR_ALLY: + case MoveTarget.ALLY: + case MoveTarget.USER_OR_NEAR_ALLY: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.USER_SIDE: + return true; } return false; } + isChargingMove(): this is ChargingMove { + return false; + } + /** * 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. @@ -320,16 +323,16 @@ export default class Move implements Localizable { } 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; + 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; } @@ -346,7 +349,11 @@ export default class Move implements Localizable { return false; } - return !user.hasAbility(Abilities.INFILTRATOR) + const bypassed = new Utils.BooleanHolder(false); + // TODO: Allow this to be simulated + applyAbAttrs(InfiltratorAbAttr, user, null, false, bypassed); + + return !bypassed.value && !this.hasFlag(MoveFlags.SOUND_BASED) && !this.hasFlag(MoveFlags.IGNORE_SUBSTITUTE); } @@ -616,26 +623,26 @@ export default class Move implements Localizable { checkFlag(flag: MoveFlags, user: Pokemon, target: Pokemon | null): boolean { // special cases below, eg: if the move flag is MAKES_CONTACT, and the user pokemon has an ability that ignores contact (like "Long Reach"), then overrides and move does not make contact switch (flag) { - case MoveFlags.MAKES_CONTACT: - if (user.hasAbilityWithAttr(IgnoreContactAbAttr) || this.hitsSubstitute(user, target)) { - return false; - } - break; - case MoveFlags.IGNORE_ABILITIES: - if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { - const abilityEffectsIgnored = new Utils.BooleanHolder(false); - applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, false, this); - if (abilityEffectsIgnored.value) { + case MoveFlags.MAKES_CONTACT: + if (user.hasAbilityWithAttr(IgnoreContactAbAttr) || this.hitsSubstitute(user, target)) { + return false; + } + break; + case MoveFlags.IGNORE_ABILITIES: + if (user.hasAbilityWithAttr(MoveAbilityBypassAbAttr)) { + const abilityEffectsIgnored = new Utils.BooleanHolder(false); + applyAbAttrs(MoveAbilityBypassAbAttr, user, abilityEffectsIgnored, false, this); + if (abilityEffectsIgnored.value) { + return true; + } + } + break; + case MoveFlags.IGNORE_PROTECT: + if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) + && this.checkFlag(MoveFlags.MAKES_CONTACT, user, null)) { return true; } - } - break; - case MoveFlags.IGNORE_PROTECT: - if (user.hasAbilityWithAttr(IgnoreProtectOnContactAbAttr) - && this.checkFlag(MoveFlags.MAKES_CONTACT, user, null)) { - return true; - } - break; + break; } return !!(this.flags & flag); @@ -889,6 +896,85 @@ export class SelfStatusMove extends Move { } } +type SubMove = new (...args: any[]) => Move; + +function ChargeMove(Base: TBase) { + return class extends Base { + /** The animation to play during the move's charging phase */ + public readonly chargeAnim: ChargeAnim = ChargeAnim[`${Moves[this.id]}_CHARGING`]; + /** The message to show during the move's charging phase */ + private _chargeText: string; + + /** Move attributes that apply during the move's charging phase */ + public chargeAttrs: MoveAttr[] = []; + + override isChargingMove(): this is ChargingMove { + return true; + } + + /** + * Sets the text to be displayed during this move's charging phase. + * References to the user Pokemon should be written as "{USER}", and + * references to the target Pokemon should be written as "{TARGET}". + * @param chargeText the text to set + * @returns this {@linkcode Move} (for chaining API purposes) + */ + chargeText(chargeText: string): this { + this._chargeText = chargeText; + return this; + } + + /** + * Queues the charge text to display to the player + * @param user the {@linkcode Pokemon} using this move + * @param target the {@linkcode Pokemon} targeted by this move (optional) + */ + showChargeText(user: Pokemon, target?: Pokemon): void { + user.scene.queueMessage(this._chargeText + .replace("{USER}", getPokemonNameWithAffix(user)) + .replace("{TARGET}", getPokemonNameWithAffix(target)) + ); + } + + /** + * Gets all charge attributes of the given attribute type. + * @param attrType any attribute that extends {@linkcode MoveAttr} + * @returns Array of attributes that match `attrType`, or an empty array if + * no matches are found. + */ + getChargeAttrs(attrType: Constructor): T[] { + return this.chargeAttrs.filter((attr): attr is T => attr instanceof attrType); + } + + /** + * Checks if this move has an attribute of the given type. + * @param attrType any attribute that extends {@linkcode MoveAttr} + * @returns `true` if a matching attribute is found; `false` otherwise + */ + hasChargeAttr(attrType: Constructor): boolean { + return this.chargeAttrs.some((attr) => attr instanceof attrType); + } + + /** + * Adds an attribute to this move to be applied during the move's charging phase + * @param ChargeAttrType the type of {@linkcode MoveAttr} being added + * @param args the parameters to construct the given {@linkcode MoveAttr} with + * @returns this {@linkcode Move} (for chaining API purposes) + */ + chargeAttr>(ChargeAttrType: T, ...args: ConstructorParameters): this { + const chargeAttr = new ChargeAttrType(...args); + this.chargeAttrs.push(chargeAttr); + + return this; + } + }; +} + +export class ChargingAttackMove extends ChargeMove(AttackMove) {} +export class ChargingSelfStatusMove extends ChargeMove(SelfStatusMove) {} + +export type ChargingMove = ChargingAttackMove | ChargingSelfStatusMove; + /** * Base class defining all {@linkcode Move} Attributes * @abstract @@ -963,31 +1049,80 @@ export enum MoveEffectTrigger { POST_TARGET, } +interface MoveEffectAttrOptions { + /** + * Defines when this effect should trigger in the move's effect order + * @see {@linkcode MoveEffectPhase} + */ + trigger?: MoveEffectTrigger; + /** Should this effect only apply on the first hit? */ + firstHitOnly?: boolean; + /** Should this effect only apply on the last hit? */ + lastHitOnly?: boolean; + /** Should this effect only apply on the first target hit? */ + firstTargetOnly?: boolean; + /** Overrides the secondary effect chance for this attr if set. */ + effectChanceOverride?: number; +} + /** Base class defining all Move Effect Attributes * @extends MoveAttr * @see {@linkcode apply} */ export class MoveEffectAttr extends MoveAttr { - /** Defines when this effect should trigger in the move's effect order - * @see {@linkcode phases.MoveEffectPhase.start} + /** + * A container for this attribute's optional parameters + * @see {@linkcode MoveEffectAttrOptions} for supported params. */ - 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; - /** Overrides the secondary effect chance for this attr if set. */ - public effectChanceOverride?: number; + protected options?: MoveEffectAttrOptions; - constructor(selfTarget?: boolean, trigger?: MoveEffectTrigger, firstHitOnly: boolean = false, lastHitOnly: boolean = false, firstTargetOnly: boolean = false, effectChanceOverride?: number) { + constructor(selfTarget?: boolean, options?: MoveEffectAttrOptions) { super(selfTarget); - this.trigger = trigger ?? MoveEffectTrigger.POST_APPLY; - this.firstHitOnly = firstHitOnly; - this.lastHitOnly = lastHitOnly; - this.firstTargetOnly = firstTargetOnly; - this.effectChanceOverride = effectChanceOverride; + this.options = options; + } + + /** + * Defines when this effect should trigger in the move's effect order. + * @default MoveEffectTrigger.POST_APPLY + * @see {@linkcode MoveEffectTrigger} + */ + public get trigger () { + return this.options?.trigger ?? MoveEffectTrigger.POST_APPLY; + } + + /** + * `true` if this effect should only trigger on the first hit of + * multi-hit moves. + * @default false + */ + public get firstHitOnly () { + return this.options?.firstHitOnly ?? false; + } + + /** + * `true` if this effect should only trigger on the last hit of + * multi-hit moves. + * @default false + */ + public get lastHitOnly () { + return this.options?.lastHitOnly ?? false; + } + + /** + * `true` if this effect should apply only upon hitting a target + * for the first time when targeting multiple {@linkcode Pokemon}. + * @default false + */ + public get firstTargetOnly () { + return this.options?.firstTargetOnly ?? false; + } + + /** + * If defined, overrides the move's base chance for this + * secondary effect to trigger. + */ + public get effectChanceOverride () { + return this.options?.effectChanceOverride; } /** @@ -1312,7 +1447,7 @@ export class RecoilAttr extends MoveEffectAttr { private unblockable: boolean; constructor(useHp: boolean = false, damageRatio: number = 0.25, unblockable: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY, false, true); + super(true, { lastHitOnly: true }); this.useHp = useHp; this.damageRatio = damageRatio; @@ -1334,8 +1469,13 @@ export class RecoilAttr extends MoveEffectAttr { return false; } - const damageValue = (!this.useHp ? user.turnData.damageDealt : user.getMaxHp()) * this.damageRatio; - const minValue = user.turnData.damageDealt ? 1 : 0; + // Chloroblast and Struggle should not deal recoil damage if the move was not successful + if (this.useHp && [ MoveResult.FAIL, MoveResult.MISS ].includes(user.getLastXMoves(1)[0]?.result)) { + return false; + } + + const damageValue = (!this.useHp ? user.turnData.totalDamageDealt : user.getMaxHp()) * this.damageRatio; + const minValue = user.turnData.totalDamageDealt ? 1 : 0; const recoilDamage = Utils.toDmgValue(damageValue, minValue); if (!recoilDamage) { return false; @@ -1365,7 +1505,7 @@ export class RecoilAttr extends MoveEffectAttr { **/ export class SacrificialAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); } /** @@ -1398,7 +1538,7 @@ export class SacrificialAttr extends MoveEffectAttr { **/ export class SacrificialAttrOnHit extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); } /** @@ -1437,7 +1577,7 @@ export class SacrificialAttrOnHit extends MoveEffectAttr { */ export class HalfSacrificialAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); } /** @@ -1745,17 +1885,17 @@ export abstract class WeatherHealAttr extends HealAttr { export class PlantHealAttr extends WeatherHealAttr { getWeatherHealRatio(weatherType: WeatherType): number { switch (weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - return 2 / 3; - case WeatherType.RAIN: - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - case WeatherType.SNOW: - case WeatherType.HEAVY_RAIN: - return 0.25; - default: - return 0.5; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + return 2 / 3; + case WeatherType.RAIN: + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + case WeatherType.SNOW: + case WeatherType.HEAVY_RAIN: + return 0.25; + default: + return 0.5; } } } @@ -1763,10 +1903,10 @@ export class PlantHealAttr extends WeatherHealAttr { export class SandHealAttr extends WeatherHealAttr { getWeatherHealRatio(weatherType: WeatherType): number { switch (weatherType) { - case WeatherType.SANDSTORM: - return 2 / 3; - default: - return 0.5; + case WeatherType.SANDSTORM: + return 2 / 3; + default: + return 0.5; } } } @@ -1841,7 +1981,7 @@ export class HitHealAttr extends MoveEffectAttr { private healStat: EffectiveStat | null; constructor(healRatio?: number | null, healStat?: EffectiveStat) { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); this.healRatio = healRatio ?? 0.5; this.healStat = healStat ?? null; @@ -1866,7 +2006,7 @@ export class HitHealAttr extends MoveEffectAttr { message = i18next.t("battle:drainMessage", { pokemonName: getPokemonNameWithAffix(target) }); } else { // Default healing formula used by draining moves like Absorb, Draining Kiss, Bitter Blade, etc. - healAmount = Utils.toDmgValue(user.turnData.currDamageDealt * this.healRatio); + healAmount = Utils.toDmgValue(user.turnData.singleHitDamageDealt * this.healRatio); message = i18next.t("battle:regainHealth", { pokemonName: getPokemonNameWithAffix(user) }); } if (reverseDrain) { @@ -1996,33 +2136,33 @@ export class MultiHitAttr extends MoveAttr { */ getHitCount(user: Pokemon, target: Pokemon): integer { switch (this.multiHitType) { - case MultiHitType._2_TO_5: - { - const rand = user.randSeedInt(16); - const hitValue = new Utils.IntegerHolder(rand); - applyAbAttrs(MaxMultiHitAbAttr, user, null, false, hitValue); - if (hitValue.value >= 10) { - return 2; - } else if (hitValue.value >= 4) { - return 3; - } else if (hitValue.value >= 2) { - return 4; - } else { - return 5; + case MultiHitType._2_TO_5: + { + const rand = user.randSeedInt(16); + const hitValue = new Utils.IntegerHolder(rand); + applyAbAttrs(MaxMultiHitAbAttr, user, null, false, hitValue); + if (hitValue.value >= 10) { + return 2; + } else if (hitValue.value >= 4) { + return 3; + } else if (hitValue.value >= 2) { + return 4; + } else { + return 5; + } } - } - case MultiHitType._2: - return 2; - case MultiHitType._3: - return 3; - case MultiHitType._10: - return 10; - case MultiHitType.BEAT_UP: - const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); - // No status means the ally pokemon can contribute to Beat Up - return party.reduce((total, pokemon) => { - return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1); - }, 0); + case MultiHitType._2: + return 2; + case MultiHitType._3: + return 3; + case MultiHitType._10: + return 10; + case MultiHitType.BEAT_UP: + const party = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + // No status means the ally pokemon can contribute to Beat Up + return party.reduce((total, pokemon) => { + return total + (pokemon.id === user.id ? 1 : pokemon?.status && pokemon.status.effect !== StatusEffect.NONE ? 0 : 1); + }, 0); } } } @@ -2046,15 +2186,15 @@ export class WaterShurikenMultiHitTypeAttr extends ChangeMultiHitTypeAttr { export class StatusEffectAttr extends MoveEffectAttr { public effect: StatusEffect; - public cureTurn: integer | null; - public overrideStatus: boolean; + public turnsRemaining?: number; + public overrideStatus: boolean = false; - constructor(effect: StatusEffect, selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) { - super(selfTarget, MoveEffectTrigger.HIT); + constructor(effect: StatusEffect, selfTarget?: boolean, turnsRemaining?: number, overrideStatus: boolean = false) { + super(selfTarget, { trigger: MoveEffectTrigger.HIT }); this.effect = effect; - this.cureTurn = cureTurn!; // TODO: is this bang correct? - this.overrideStatus = !!overrideStatus; + this.turnsRemaining = turnsRemaining; + this.overrideStatus = overrideStatus; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2074,14 +2214,14 @@ export class StatusEffectAttr extends MoveEffectAttr { } } - if (user !== target && target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)) { + if (user !== target && target.isSafeguarded(user)) { if (move.category === MoveCategory.STATUS) { user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); } return false; } if ((!pokemon.status || (pokemon.status.effect === this.effect && moveChance < 0)) - && pokemon.trySetStatus(this.effect, true, user, this.cureTurn)) { + && pokemon.trySetStatus(this.effect, true, user, this.turnsRemaining)) { applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect); return true; } @@ -2091,15 +2231,18 @@ export class StatusEffectAttr extends MoveEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; + const score = (moveChance < 0) ? -10 : Math.floor(moveChance * -0.1); + const pokemon = this.selfTarget ? user : target; + + return !pokemon.status && pokemon.canSetStatus(this.effect, true, false, user) ? score : 0; } } export class MultiStatusEffectAttr extends StatusEffectAttr { public effects: StatusEffect[]; - constructor(effects: StatusEffect[], selfTarget?: boolean, cureTurn?: integer, overrideStatus?: boolean) { - super(effects[0], selfTarget, cureTurn, overrideStatus); + constructor(effects: StatusEffect[], selfTarget?: boolean, turnsRemaining?: number, overrideStatus?: boolean) { + super(effects[0], selfTarget, turnsRemaining, overrideStatus); this.effects = effects; } @@ -2111,13 +2254,16 @@ export class MultiStatusEffectAttr extends StatusEffectAttr { getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { const moveChance = this.getMoveChance(user, target, move, this.selfTarget, false); - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(this.effect, true, false, user) ? Math.floor(moveChance * -0.1) : 0; + const score = (moveChance < 0) ? -10 : Math.floor(moveChance * -0.1); + const pokemon = this.selfTarget ? user : target; + + return !pokemon.status && pokemon.canSetStatus(this.effect, true, false, user) ? score : 0; } } export class PsychoShiftEffectAttr extends MoveEffectAttr { constructor() { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -2142,7 +2288,7 @@ export class PsychoShiftEffectAttr extends MoveEffectAttr { } getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): number { - return !(this.selfTarget ? user : target).status && (this.selfTarget ? user : target).canSetStatus(user.status?.effect, true, false, user) ? Math.floor(move.chance * -0.1) : 0; + return !target.status && target.canSetStatus(user.status?.effect, true, false, user) ? -10 : 0; } } /** @@ -2154,7 +2300,7 @@ export class StealHeldItemChanceAttr extends MoveEffectAttr { private chance: number; constructor(chance: number) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.chance = chance; } @@ -2215,7 +2361,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { private berriesOnly: boolean; constructor(berriesOnly: boolean) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.berriesOnly = berriesOnly; } @@ -2289,7 +2435,7 @@ export class RemoveHeldItemAttr extends MoveEffectAttr { export class EatBerryAttr extends MoveEffectAttr { protected chosenBerry: BerryModifier | undefined; constructor() { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); } /** * Causes the target to eat a berry. @@ -2392,7 +2538,7 @@ export class HealStatusEffectAttr extends MoveEffectAttr { * @param ...effects - List of status effects to cure */ constructor(selfTarget: boolean, ...effects: StatusEffect[]) { - super(selfTarget, MoveEffectTrigger.POST_APPLY, false, true); + super(selfTarget, { lastHitOnly: true }); this.effects = effects; } @@ -2570,6 +2716,63 @@ export class OneHitKOAttr extends MoveAttr { } } +/** + * Attribute that allows charge moves to resolve in 1 turn under a given condition. + * Should only be used for {@linkcode ChargingMove | ChargingMoves} as a `chargeAttr`. + * @extends MoveAttr + */ +export class InstantChargeAttr extends MoveAttr { + /** The condition in which the move with this attribute instantly charges */ + protected readonly condition: UserMoveConditionFunc; + + constructor(condition: UserMoveConditionFunc) { + super(true); + this.condition = condition; + } + + /** + * Flags the move with this attribute as instantly charged if this attribute's condition is met. + * @param user the {@linkcode Pokemon} using the move + * @param target n/a + * @param move the {@linkcode Move} associated with this attribute + * @param args + * - `[0]` a {@linkcode Utils.BooleanHolder | BooleanHolder} for the "instant charge" flag + * @returns `true` if the instant charge condition is met; `false` otherwise. + */ + override apply(user: Pokemon, target: Pokemon | null, move: Move, args: any[]): boolean { + const instantCharge = args[0]; + if (!(instantCharge instanceof Utils.BooleanHolder)) { + return false; + } + + if (this.condition(user, move)) { + instantCharge.value = true; + return true; + } + return false; + } +} + +/** + * Attribute that allows charge moves to resolve in 1 turn while specific {@linkcode WeatherType | Weather} + * is active. Should only be used for {@linkcode ChargingMove | ChargingMoves} as a `chargeAttr`. + * @extends InstantChargeAttr + */ +export class WeatherInstantChargeAttr extends InstantChargeAttr { + constructor(weatherTypes: WeatherType[]) { + super((user, move) => { + const currentWeather = user.scene.arena.weather; + + if (Utils.isNullOrUndefined(currentWeather?.weatherType)) { + return false; + } else { + return !currentWeather?.isEffectSuppressed(user.scene) + && weatherTypes.includes(currentWeather?.weatherType); + } + }); + } +} + export class OverrideMoveEffectAttr extends MoveAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise { //const overridden = args[0] as Utils.BooleanHolder; @@ -2578,111 +2781,6 @@ export class OverrideMoveEffectAttr extends MoveAttr { } } -export class ChargeAttr extends OverrideMoveEffectAttr { - public chargeAnim: ChargeAnim; - private chargeText: string; - private tagType: BattlerTagType | null; - private chargeEffect: boolean; - public followUpPriority: integer | null; - - constructor(chargeAnim: ChargeAnim, chargeText: string, tagType?: BattlerTagType | null, chargeEffect: boolean = false) { - super(); - - this.chargeAnim = chargeAnim; - this.chargeText = chargeText; - this.tagType = tagType!; // TODO: is this bang correct? - this.chargeEffect = chargeEffect; - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const lastMove = user.getLastXMoves().find(() => true); - if (!lastMove || lastMove.move !== move.id || (lastMove.result !== MoveResult.OTHER && lastMove.turn !== user.scene.currentBattle.turn)) { - (args[0] as Utils.BooleanHolder).value = true; - new MoveChargeAnim(this.chargeAnim, move.id, user).play(user.scene, false, () => { - user.scene.queueMessage(this.chargeText.replace("{TARGET}", getPokemonNameWithAffix(target)).replace("{USER}", getPokemonNameWithAffix(user))); - if (this.tagType) { - user.addTag(this.tagType, 1, move.id, user.id); - } - if (this.chargeEffect) { - applyMoveAttrs(MoveEffectAttr, user, target, move); - } - user.pushMoveHistory({ move: move.id, targets: [ target.getBattlerIndex() ], result: MoveResult.OTHER }); - user.getMoveQueue().push({ move: move.id, targets: [ target.getBattlerIndex() ], ignorePP: true }); - user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); - resolve(true); - }); - } else { - user.lapseTag(BattlerTagType.CHARGING); - resolve(false); - } - }); - } - - usedChargeEffect(user: Pokemon, target: Pokemon | null, move: Move): boolean { - if (!this.chargeEffect) { - return false; - } - // Account for move history being populated when this function is called - const lastMoves = user.getLastXMoves(2); - return lastMoves.length === 2 && lastMoves[1].move === move.id && lastMoves[1].result === MoveResult.OTHER; - } -} - -export class SunlightChargeAttr extends ChargeAttr { - constructor(chargeAnim: ChargeAnim, chargeText: string) { - super(chargeAnim, chargeText); - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const weatherType = user.scene.arena.weather?.weatherType; - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene) && (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN)) { - resolve(false); - } else { - super.apply(user, target, move, args).then(result => resolve(result)); - } - }); - } -} - -export class ElectroShotChargeAttr extends ChargeAttr { - private statIncreaseApplied: boolean; - constructor() { - super(ChargeAnim.ELECTRO_SHOT_CHARGING, i18next.t("moveTriggers:absorbedElectricity", { pokemonName: "{USER}" }), null, true); - // Add a flag because ChargeAttr skills use themselves twice instead of once over one-to-two turns - this.statIncreaseApplied = false; - } - - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - const weatherType = user.scene.arena.weather?.weatherType; - if (!user.scene.arena.weather?.isEffectSuppressed(user.scene) && (weatherType === WeatherType.RAIN || weatherType === WeatherType.HEAVY_RAIN)) { - // Apply the SPATK increase every call when used in the rain - const statChangeAttr = new StatStageChangeAttr([ Stat.SPATK ], 1, true); - statChangeAttr.apply(user, target, move, args); - // After the SPATK is raised, execute the move resolution e.g. deal damage - resolve(false); - } else { - if (!this.statIncreaseApplied) { - // Apply the SPATK increase only if it hasn't been applied before e.g. on the first turn charge up animation - const statChangeAttr = new StatStageChangeAttr([ Stat.SPATK ], 1, true); - statChangeAttr.apply(user, target, move, args); - // Set the flag to true so that on the following turn it doesn't raise SPATK a second time - this.statIncreaseApplied = true; - } - super.apply(user, target, move, args).then(result => { - if (!result) { - // On the second turn, reset the statIncreaseApplied flag without applying the SPATK increase - this.statIncreaseApplied = false; - } - resolve(result); - }); - } - }); - } -} - export class DelayedAttackAttr extends OverrideMoveEffectAttr { public tagType: ArenaTagType; public chargeAnim: ChargeAnim; @@ -2770,35 +2868,67 @@ export class AwaitCombinedPledgeAttr extends OverrideMoveEffectAttr { } } +/** + * Set of optional parameters that may be applied to stat stage changing effects + * @extends MoveEffectAttrOptions + * @see {@linkcode StatStageChangeAttr} + */ +interface StatStageChangeAttrOptions extends MoveEffectAttrOptions { + /** If defined, needs to be met in order for the stat change to apply */ + condition?: MoveConditionFunc, + /** `true` to display a message */ + showMessage?: boolean +} + /** * Attribute used for moves that change stat stages * * @param stats {@linkcode BattleStat} Array of stat(s) to change * @param stages How many stages to change the stat(s) by, [-6, 6] * @param selfTarget `true` if the move is self-targetting - * @param condition {@linkcode MoveConditionFunc} Optional condition to be checked in order to apply the changes - * @param showMessage `true` to display a message; default `true` - * @param firstHitOnly `true` if only the first hit of a multi hit move should cause a stat stage change; default `false` - * @param moveEffectTrigger {@linkcode MoveEffectTrigger} When the stat change should trigger; default {@linkcode MoveEffectTrigger.HIT} - * @param firstTargetOnly `true` if a move that hits multiple pokemon should only trigger the stat change if it hits at least one pokemon, rather than once per hit pokemon; default `false` - * @param lastHitOnly `true` if the effect should only apply after the last hit of a multi hit move; default `false` - * @param effectChanceOverride Will override the move's normal secondary effect chance if specified + * @param options {@linkcode StatStageChangeAttrOptions} Container for any optional parameters for this attribute. * * @extends MoveEffectAttr * @see {@linkcode apply} */ export class StatStageChangeAttr extends MoveEffectAttr { public stats: BattleStat[]; - public stages: integer; - private condition?: MoveConditionFunc | null; - private showMessage: boolean; + public stages: number; + /** + * Container for optional parameters to this attribute. + * @see {@linkcode StatStageChangeAttrOptions} for available optional params + */ + protected override options?: StatStageChangeAttrOptions; - constructor(stats: BattleStat[], stages: integer, selfTarget?: boolean, condition?: MoveConditionFunc | null, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false, lastHitOnly: boolean = false, effectChanceOverride?: number) { - super(selfTarget, moveEffectTrigger, firstHitOnly, lastHitOnly, firstTargetOnly, effectChanceOverride); + constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, options?: StatStageChangeAttrOptions) { + super(selfTarget, options); this.stats = stats; this.stages = stages; - this.condition = condition; - this.showMessage = showMessage; + this.options = options; + } + + /** + * The condition required for the stat stage change to apply. + * Defaults to `null` (i.e. no condition required). + */ + private get condition () { + return this.options?.condition ?? null; + } + + /** + * `true` to display a message for the stat change. + * @default true + */ + private get showMessage () { + return this.options?.showMessage ?? true; + } + + /** + * Indicates when the stat change should trigger + * @default MoveEffectTrigger.HIT + */ + public override get trigger () { + return this.options?.trigger ?? MoveEffectTrigger.HIT; } /** @@ -2845,26 +2975,26 @@ export class StatStageChangeAttr extends MoveEffectAttr { } let noEffect = false; switch (stat) { - case Stat.ATK: - if (this.selfTarget) { - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); - } - break; - case Stat.DEF: - if (!this.selfTarget) { - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); - } - break; - case Stat.SPATK: - if (this.selfTarget) { - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); - } - break; - case Stat.SPDEF: - if (!this.selfTarget) { - noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); - } - break; + case Stat.ATK: + if (this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); + } + break; + case Stat.DEF: + if (!this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL); + } + break; + case Stat.SPATK: + if (this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); + } + break; + case Stat.SPDEF: + if (!this.selfTarget) { + noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL); + } + break; } if (noEffect) { continue; @@ -2883,20 +3013,6 @@ export class SecretPowerAttr extends MoveEffectAttr { super(false); } - /** - * Used to determine if the move should apply a secondary effect based on Secret Power's 30% chance - * @returns `true` if the move's secondary effect should apply - */ - override canApply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { - this.effectChanceOverride = move.chance; - const moveChance = this.getMoveChance(user, target, move, this.selfTarget); - if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) { - return true; - } else { - return false; - } - } - /** * Used to apply the secondary effect to the target Pokemon * @returns `true` if a secondary effect is successfully applied @@ -2913,8 +3029,6 @@ export class SecretPowerAttr extends MoveEffectAttr { const biome = user.scene.arena.biomeType; secondaryEffect = this.determineBiomeEffect(biome); } - // effectChanceOverride used in the application of the actual secondary effect - secondaryEffect.effectChanceOverride = 100; return secondaryEffect.apply(user, target, move, []); } @@ -2933,19 +3047,19 @@ export class SecretPowerAttr extends MoveEffectAttr { private determineTerrainEffect(terrain: TerrainType): MoveEffectAttr { let secondaryEffect: MoveEffectAttr; switch (terrain) { - case TerrainType.ELECTRIC: - default: - secondaryEffect = new StatusEffectAttr(StatusEffect.PARALYSIS, false); - break; - case TerrainType.MISTY: - secondaryEffect = new StatStageChangeAttr([ Stat.SPATK ], -1, false); - break; - case TerrainType.GRASSY: - secondaryEffect = new StatusEffectAttr(StatusEffect.SLEEP, false); - break; - case TerrainType.PSYCHIC: - secondaryEffect = new StatStageChangeAttr([ Stat.SPD ], -1, false); - break; + case TerrainType.ELECTRIC: + default: + secondaryEffect = new StatusEffectAttr(StatusEffect.PARALYSIS, false); + break; + case TerrainType.MISTY: + secondaryEffect = new StatStageChangeAttr([ Stat.SPATK ], -1, false); + break; + case TerrainType.GRASSY: + secondaryEffect = new StatusEffectAttr(StatusEffect.SLEEP, false); + break; + case TerrainType.PSYCHIC: + secondaryEffect = new StatStageChangeAttr([ Stat.SPD ], -1, false); + break; } return secondaryEffect; } @@ -2970,62 +3084,62 @@ export class SecretPowerAttr extends MoveEffectAttr { private determineBiomeEffect(biome: Biome): MoveEffectAttr { let secondaryEffect: MoveEffectAttr; switch (biome) { - case Biome.PLAINS: - case Biome.GRASS: - case Biome.TALL_GRASS: - case Biome.FOREST: - case Biome.JUNGLE: - case Biome.MEADOW: - secondaryEffect = new StatusEffectAttr(StatusEffect.SLEEP, false); - break; - case Biome.SWAMP: - case Biome.MOUNTAIN: - case Biome.TEMPLE: - case Biome.RUINS: - secondaryEffect = new StatStageChangeAttr([ Stat.SPD ], -1, false); - break; - case Biome.ICE_CAVE: - case Biome.SNOWY_FOREST: - secondaryEffect = new StatusEffectAttr(StatusEffect.FREEZE, false); - break; - case Biome.VOLCANO: - secondaryEffect = new StatusEffectAttr(StatusEffect.BURN, false); - break; - case Biome.FAIRY_CAVE: - secondaryEffect = new StatStageChangeAttr([ Stat.SPATK ], -1, false); - break; - case Biome.DESERT: - case Biome.CONSTRUCTION_SITE: - case Biome.BEACH: - case Biome.ISLAND: - case Biome.BADLANDS: - secondaryEffect = new StatStageChangeAttr([ Stat.ACC ], -1, false); - break; - case Biome.SEA: - case Biome.LAKE: - case Biome.SEABED: - secondaryEffect = new StatStageChangeAttr([ Stat.ATK ], -1, false); - break; - case Biome.CAVE: - case Biome.WASTELAND: - case Biome.GRAVEYARD: - case Biome.ABYSS: - case Biome.SPACE: - secondaryEffect = new AddBattlerTagAttr(BattlerTagType.FLINCHED, false, true); - break; - case Biome.END: - secondaryEffect = new StatStageChangeAttr([ Stat.DEF ], -1, false); - break; - case Biome.TOWN: - case Biome.METROPOLIS: - case Biome.SLUM: - case Biome.DOJO: - case Biome.FACTORY: - case Biome.LABORATORY: - case Biome.POWER_PLANT: - default: - secondaryEffect = new StatusEffectAttr(StatusEffect.PARALYSIS, false); - break; + case Biome.PLAINS: + case Biome.GRASS: + case Biome.TALL_GRASS: + case Biome.FOREST: + case Biome.JUNGLE: + case Biome.MEADOW: + secondaryEffect = new StatusEffectAttr(StatusEffect.SLEEP, false); + break; + case Biome.SWAMP: + case Biome.MOUNTAIN: + case Biome.TEMPLE: + case Biome.RUINS: + secondaryEffect = new StatStageChangeAttr([ Stat.SPD ], -1, false); + break; + case Biome.ICE_CAVE: + case Biome.SNOWY_FOREST: + secondaryEffect = new StatusEffectAttr(StatusEffect.FREEZE, false); + break; + case Biome.VOLCANO: + secondaryEffect = new StatusEffectAttr(StatusEffect.BURN, false); + break; + case Biome.FAIRY_CAVE: + secondaryEffect = new StatStageChangeAttr([ Stat.SPATK ], -1, false); + break; + case Biome.DESERT: + case Biome.CONSTRUCTION_SITE: + case Biome.BEACH: + case Biome.ISLAND: + case Biome.BADLANDS: + secondaryEffect = new StatStageChangeAttr([ Stat.ACC ], -1, false); + break; + case Biome.SEA: + case Biome.LAKE: + case Biome.SEABED: + secondaryEffect = new StatStageChangeAttr([ Stat.ATK ], -1, false); + break; + case Biome.CAVE: + case Biome.WASTELAND: + case Biome.GRAVEYARD: + case Biome.ABYSS: + case Biome.SPACE: + secondaryEffect = new AddBattlerTagAttr(BattlerTagType.FLINCHED, false, true); + break; + case Biome.END: + secondaryEffect = new StatStageChangeAttr([ Stat.DEF ], -1, false); + break; + case Biome.TOWN: + case Biome.METROPOLIS: + case Biome.SLUM: + case Biome.DOJO: + case Biome.FACTORY: + case Biome.LABORATORY: + case Biome.POWER_PLANT: + default: + secondaryEffect = new StatusEffectAttr(StatusEffect.PARALYSIS, false); + break; } return secondaryEffect; } @@ -3090,7 +3204,7 @@ export class CutHpStatStageBoostAttr extends StatStageChangeAttr { private messageCallback: ((user: Pokemon) => void) | undefined; constructor(stat: BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) { - super(stat, levels, true, null, true); + super(stat, levels, true); this.cutRatio = cutRatio; this.messageCallback = messageCallback; @@ -3309,21 +3423,21 @@ export class LessPPMorePowerAttr extends VariablePowerAttr { const power = args[0] as Utils.NumberHolder; switch (ppRemains) { - case 0: - power.value = 200; - break; - case 1: - power.value = 80; - break; - case 2: - power.value = 60; - break; - case 3: - power.value = 50; - break; - default: - power.value = 40; - break; + case 0: + power.value = 200; + break; + case 1: + power.value = 80; + break; + case 2: + power.value = 60; + break; + case 3: + power.value = 50; + break; + default: + power.value = 40; + break; } return true; } @@ -3543,24 +3657,24 @@ export class LowHpPowerAttr extends VariablePowerAttr { const hpRatio = user.getHpRatio(); switch (true) { - case (hpRatio < 0.0417): - power.value = 200; - break; - case (hpRatio < 0.1042): - power.value = 150; - break; - case (hpRatio < 0.2083): - power.value = 100; - break; - case (hpRatio < 0.3542): - power.value = 80; - break; - case (hpRatio < 0.6875): - power.value = 40; - break; - default: - power.value = 20; - break; + case (hpRatio < 0.0417): + power.value = 200; + break; + case (hpRatio < 0.1042): + power.value = 150; + break; + case (hpRatio < 0.2083): + power.value = 100; + break; + case (hpRatio < 0.3542): + power.value = 80; + break; + case (hpRatio < 0.6875): + power.value = 40; + break; + default: + power.value = 20; + break; } return true; @@ -3580,21 +3694,21 @@ export class CompareWeightPowerAttr extends VariablePowerAttr { const relativeWeight = (targetWeight / userWeight) * 100; switch (true) { - case (relativeWeight < 20.01): - power.value = 120; - break; - case (relativeWeight < 25.01): - power.value = 100; - break; - case (relativeWeight < 33.35): - power.value = 80; - break; - case (relativeWeight < 50.01): - power.value = 60; - break; - default: - power.value = 40; - break; + case (relativeWeight < 20.01): + power.value = 120; + break; + case (relativeWeight < 25.01): + power.value = 100; + break; + case (relativeWeight < 33.35): + power.value = 80; + break; + case (relativeWeight < 50.01): + power.value = 60; + break; + default: + power.value = 40; + break; } return true; @@ -3710,13 +3824,13 @@ export class AntiSunlightPowerDecreaseAttr extends VariablePowerAttr { const power = args[0] as Utils.NumberHolder; const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { - case WeatherType.RAIN: - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - case WeatherType.SNOW: - case WeatherType.HEAVY_RAIN: - power.value *= 0.5; - return true; + case WeatherType.RAIN: + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + case WeatherType.SNOW: + case WeatherType.HEAVY_RAIN: + power.value *= 0.5; + return true; } } @@ -4113,14 +4227,14 @@ export class ThunderAccuracyAttr extends VariableAccuracyAttr { const accuracy = args[0] as Utils.NumberHolder; const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - accuracy.value = 50; - return true; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - accuracy.value = -1; - return true; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + accuracy.value = 50; + return true; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + accuracy.value = -1; + return true; } } @@ -4139,10 +4253,10 @@ export class StormAccuracyAttr extends VariableAccuracyAttr { const accuracy = args[0] as Utils.NumberHolder; const weatherType = user.scene.arena.weather?.weatherType || WeatherType.NONE; switch (weatherType) { - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - accuracy.value = -1; - return true; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + accuracy.value = -1; + return true; } } @@ -4351,7 +4465,7 @@ export class FormChangeItemTypeAttr extends VariableMoveTypeAttr { } if ([ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.ARCEUS) || [ user.species.speciesId, user.fusionSpecies?.speciesId ].includes(Species.SILVALLY)) { - const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; // TODO: is this bang correct? + const form = user.species.speciesId === Species.ARCEUS || user.species.speciesId === Species.SILVALLY ? user.formIndex : user.fusionSpecies?.formIndex!; moveType.value = Type[Type[form]]; return true; @@ -4372,21 +4486,21 @@ export class TechnoBlastTypeAttr extends VariableMoveTypeAttr { const form = user.species.speciesId === Species.GENESECT ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { - case 1: // Shock Drive - moveType.value = Type.ELECTRIC; - break; - case 2: // Burn Drive - moveType.value = Type.FIRE; - break; - case 3: // Chill Drive - moveType.value = Type.ICE; - break; - case 4: // Douse Drive - moveType.value = Type.WATER; - break; - default: - moveType.value = Type.NORMAL; - break; + case 1: // Shock Drive + moveType.value = Type.ELECTRIC; + break; + case 2: // Burn Drive + moveType.value = Type.FIRE; + break; + case 3: // Chill Drive + moveType.value = Type.ICE; + break; + case 4: // Douse Drive + moveType.value = Type.WATER; + break; + default: + moveType.value = Type.NORMAL; + break; } return true; } @@ -4406,12 +4520,12 @@ export class AuraWheelTypeAttr extends VariableMoveTypeAttr { const form = user.species.speciesId === Species.MORPEKO ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { - case 1: // Hangry Mode - moveType.value = Type.DARK; - break; - default: // Full Belly Mode - moveType.value = Type.ELECTRIC; - break; + case 1: // Hangry Mode + moveType.value = Type.DARK; + break; + default: // Full Belly Mode + moveType.value = Type.ELECTRIC; + break; } return true; } @@ -4431,15 +4545,15 @@ export class RagingBullTypeAttr extends VariableMoveTypeAttr { const form = user.species.speciesId === Species.PALDEA_TAUROS ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { - case 1: // Blaze breed - moveType.value = Type.FIRE; - break; - case 2: // Aqua breed - moveType.value = Type.WATER; - break; - default: - moveType.value = Type.FIGHTING; - break; + case 1: // Blaze breed + moveType.value = Type.FIRE; + break; + case 2: // Aqua breed + moveType.value = Type.WATER; + break; + default: + moveType.value = Type.FIGHTING; + break; } return true; } @@ -4459,22 +4573,22 @@ export class IvyCudgelTypeAttr extends VariableMoveTypeAttr { const form = user.species.speciesId === Species.OGERPON ? user.formIndex : user.fusionSpecies?.formIndex; switch (form) { - case 1: // Wellspring Mask - case 5: // Wellspring Mask Tera - moveType.value = Type.WATER; - break; - case 2: // Hearthflame Mask - case 6: // Hearthflame Mask Tera - moveType.value = Type.FIRE; - break; - case 3: // Cornerstone Mask - case 7: // Cornerstone Mask Tera - moveType.value = Type.ROCK; - break; - case 4: // Teal Mask Tera - default: - moveType.value = Type.GRASS; - break; + case 1: // Wellspring Mask + case 5: // Wellspring Mask Tera + moveType.value = Type.WATER; + break; + case 2: // Hearthflame Mask + case 6: // Hearthflame Mask Tera + moveType.value = Type.FIRE; + break; + case 3: // Cornerstone Mask + case 7: // Cornerstone Mask Tera + moveType.value = Type.ROCK; + break; + case 4: // Teal Mask Tera + default: + moveType.value = Type.GRASS; + break; } return true; } @@ -4492,23 +4606,23 @@ export class WeatherBallTypeAttr extends VariableMoveTypeAttr { if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) { switch (user.scene.arena.weather?.weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - moveType.value = Type.FIRE; - break; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - moveType.value = Type.WATER; - break; - case WeatherType.SANDSTORM: - moveType.value = Type.ROCK; - break; - case WeatherType.HAIL: - case WeatherType.SNOW: - moveType.value = Type.ICE; - break; - default: - return false; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + moveType.value = Type.FIRE; + break; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + moveType.value = Type.WATER; + break; + case WeatherType.SANDSTORM: + moveType.value = Type.ROCK; + break; + case WeatherType.HAIL: + case WeatherType.SNOW: + moveType.value = Type.ICE; + break; + default: + return false; } return true; } @@ -4543,20 +4657,20 @@ export class TerrainPulseTypeAttr extends VariableMoveTypeAttr { const currentTerrain = user.scene.arena.getTerrainType(); switch (currentTerrain) { - case TerrainType.MISTY: - moveType.value = Type.FAIRY; - break; - case TerrainType.ELECTRIC: - moveType.value = Type.ELECTRIC; - break; - case TerrainType.GRASSY: - moveType.value = Type.GRASS; - break; - case TerrainType.PSYCHIC: - moveType.value = Type.PSYCHIC; - break; - default: - return false; + case TerrainType.MISTY: + moveType.value = Type.FAIRY; + break; + case TerrainType.ELECTRIC: + moveType.value = Type.ELECTRIC; + break; + case TerrainType.GRASSY: + moveType.value = Type.GRASS; + break; + case TerrainType.PSYCHIC: + moveType.value = Type.PSYCHIC; + break; + default: + return false; } return true; } @@ -4656,26 +4770,26 @@ export class CombinedPledgeTypeAttr extends VariableMoveTypeAttr { } switch (move.id) { - case Moves.FIRE_PLEDGE: - if (combinedPledgeMove === Moves.WATER_PLEDGE) { - moveType.value = Type.WATER; - return true; - } - return false; - case Moves.WATER_PLEDGE: - if (combinedPledgeMove === Moves.GRASS_PLEDGE) { - moveType.value = Type.GRASS; - return true; - } - return false; - case Moves.GRASS_PLEDGE: - if (combinedPledgeMove === Moves.FIRE_PLEDGE) { - moveType.value = Type.FIRE; - return true; - } - return false; - default: - return false; + case Moves.FIRE_PLEDGE: + if (combinedPledgeMove === Moves.WATER_PLEDGE) { + moveType.value = Type.WATER; + return true; + } + return false; + case Moves.WATER_PLEDGE: + if (combinedPledgeMove === Moves.GRASS_PLEDGE) { + moveType.value = Type.GRASS; + return true; + } + return false; + case Moves.GRASS_PLEDGE: + if (combinedPledgeMove === Moves.FIRE_PLEDGE) { + moveType.value = Type.FIRE; + return true; + } + return false; + default: + return false; } } } @@ -4840,7 +4954,7 @@ export class BypassRedirectAttr extends MoveAttr { export class FrenzyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT, false, true); + super(true, { trigger: MoveEffectTrigger.HIT, lastHitOnly: true }); } canApply(user: Pokemon, target: Pokemon, move: Move, args: any[]) { @@ -4874,6 +4988,37 @@ export const frenzyMissFunc: UserMoveConditionFunc = (user: Pokemon, move: Move) return true; }; +/** + * Attribute that grants {@link https://bulbapedia.bulbagarden.net/wiki/Semi-invulnerable_turn | semi-invulnerability} to the user during + * the associated move's charging phase. Should only be used for {@linkcode ChargingMove | ChargingMoves} as a `chargeAttr`. + * @extends MoveEffectAttr + */ +export class SemiInvulnerableAttr extends MoveEffectAttr { + /** The type of {@linkcode SemiInvulnerableTag} to grant to the user */ + public tagType: BattlerTagType; + + constructor(tagType: BattlerTagType) { + super(true); + this.tagType = tagType; + } + + /** + * Grants a {@linkcode SemiInvulnerableTag} to the associated move's user. + * @param user the {@linkcode Pokemon} using the move + * @param target n/a + * @param move the {@linkcode Move} being used + * @param args n/a + * @returns `true` if semi-invulnerability was successfully granted; `false` otherwise. + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args?: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + return user.addTag(this.tagType, 1, move.id, user.id); + } +} + export class AddBattlerTagAttr extends MoveEffectAttr { public tagType: BattlerTagType; public turnCountMin: integer; @@ -4882,7 +5027,7 @@ export class AddBattlerTagAttr extends MoveEffectAttr { private failOnOverlap: boolean; constructor(tagType: BattlerTagType, selfTarget: boolean = false, failOnOverlap: boolean = false, turnCountMin: integer = 0, turnCountMax?: integer, lastHitOnly: boolean = false, cancelOnFail: boolean = false) { - super(selfTarget, MoveEffectTrigger.POST_APPLY, false, lastHitOnly); + super(selfTarget, { lastHitOnly: lastHitOnly }); this.tagType = tagType; this.turnCountMin = turnCountMin; @@ -4920,48 +5065,48 @@ export class AddBattlerTagAttr extends MoveEffectAttr { getTagTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer | void { switch (this.tagType) { - case BattlerTagType.RECHARGING: - case BattlerTagType.PERISH_SONG: - return -16; - case BattlerTagType.FLINCHED: - case BattlerTagType.CONFUSED: - case BattlerTagType.INFATUATED: - case BattlerTagType.NIGHTMARE: - case BattlerTagType.DROWSY: - case BattlerTagType.DISABLED: - case BattlerTagType.HEAL_BLOCK: - case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: - return -5; - case BattlerTagType.SEEDED: - case BattlerTagType.SALT_CURED: - case BattlerTagType.CURSED: - case BattlerTagType.FRENZY: - case BattlerTagType.TRAPPED: - case BattlerTagType.BIND: - case BattlerTagType.WRAP: - case BattlerTagType.FIRE_SPIN: - case BattlerTagType.WHIRLPOOL: - case BattlerTagType.CLAMP: - case BattlerTagType.SAND_TOMB: - case BattlerTagType.MAGMA_STORM: - case BattlerTagType.SNAP_TRAP: - case BattlerTagType.THUNDER_CAGE: - case BattlerTagType.INFESTATION: - return -3; - case BattlerTagType.ENCORE: - return -2; - case BattlerTagType.MINIMIZED: - case BattlerTagType.ALWAYS_GET_HIT: - return 0; - case BattlerTagType.INGRAIN: - case BattlerTagType.IGNORE_ACCURACY: - case BattlerTagType.AQUA_RING: - return 3; - case BattlerTagType.PROTECTED: - case BattlerTagType.FLYING: - case BattlerTagType.CRIT_BOOST: - case BattlerTagType.ALWAYS_CRIT: - return 5; + case BattlerTagType.RECHARGING: + case BattlerTagType.PERISH_SONG: + return -16; + case BattlerTagType.FLINCHED: + case BattlerTagType.CONFUSED: + case BattlerTagType.INFATUATED: + case BattlerTagType.NIGHTMARE: + case BattlerTagType.DROWSY: + case BattlerTagType.DISABLED: + case BattlerTagType.HEAL_BLOCK: + case BattlerTagType.RECEIVE_DOUBLE_DAMAGE: + return -5; + case BattlerTagType.SEEDED: + case BattlerTagType.SALT_CURED: + case BattlerTagType.CURSED: + case BattlerTagType.FRENZY: + case BattlerTagType.TRAPPED: + case BattlerTagType.BIND: + case BattlerTagType.WRAP: + case BattlerTagType.FIRE_SPIN: + case BattlerTagType.WHIRLPOOL: + case BattlerTagType.CLAMP: + case BattlerTagType.SAND_TOMB: + case BattlerTagType.MAGMA_STORM: + case BattlerTagType.SNAP_TRAP: + case BattlerTagType.THUNDER_CAGE: + case BattlerTagType.INFESTATION: + return -3; + case BattlerTagType.ENCORE: + return -2; + case BattlerTagType.MINIMIZED: + case BattlerTagType.ALWAYS_GET_HIT: + return 0; + case BattlerTagType.INGRAIN: + case BattlerTagType.IGNORE_ACCURACY: + case BattlerTagType.AQUA_RING: + return 3; + case BattlerTagType.PROTECTED: + case BattlerTagType.FLYING: + case BattlerTagType.CRIT_BOOST: + case BattlerTagType.ALWAYS_CRIT: + return 5; } } @@ -5161,7 +5306,7 @@ export class ConfuseAttr extends AddBattlerTagAttr { } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - if (!this.selfTarget && target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)) { + if (!this.selfTarget && target.isSafeguarded(user)) { if (move.category === MoveCategory.STATUS) { user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target) })); } @@ -5317,7 +5462,7 @@ export class AddArenaTagAttr extends MoveEffectAttr { public selfSideTarget: boolean; constructor(tagType: ArenaTagType, turnCount?: integer | null, failOnOverlap: boolean = false, selfSideTarget: boolean = false) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true); this.tagType = tagType; this.turnCount = turnCount!; // TODO: is the bang correct? @@ -5355,7 +5500,7 @@ export class RemoveArenaTagsAttr extends MoveEffectAttr { public selfSideTarget: boolean; constructor(tagTypes: ArenaTagType[], selfSideTarget: boolean) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true); this.tagTypes = tagTypes; this.selfSideTarget = selfSideTarget; @@ -5421,7 +5566,7 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr { private targetBothSides: boolean; constructor(targetBothSides: boolean = false) { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); this.targetBothSides = targetBothSides; } @@ -5457,7 +5602,7 @@ export class RemoveScreensAttr extends MoveEffectAttr { private targetBothSides: boolean; constructor(targetBothSides: boolean = false) { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); this.targetBothSides = targetBothSides; } @@ -5495,7 +5640,7 @@ export class SwapArenaTagsAttr extends MoveEffectAttr { constructor(SwapTags: ArenaTagType[]) { - super(true, MoveEffectTrigger.POST_APPLY); + super(true); this.SwapTags = SwapTags; } @@ -5616,12 +5761,13 @@ export class RevivalBlessingAttr extends MoveEffectAttr { } } + export class ForceSwitchOutAttr extends MoveEffectAttr { constructor( private selfSwitch: boolean = false, private switchType: SwitchType = SwitchType.SWITCH ) { - super(false, MoveEffectTrigger.POST_APPLY, false, true); + super(false, { lastHitOnly: true }); } isBatonPass() { @@ -5634,12 +5780,19 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { return false; } - /** - * Move the switch out logic inside the conditional block - * This ensures that the switch out only happens when the conditions are met - */ const switchOutTarget = this.selfSwitch ? user : target; if (switchOutTarget instanceof PlayerPokemon) { + /** + * Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch + * If it did, the user of U-turn or Volt Switch will not be switched out. + */ + if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) && + (move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH || move.id === Moves.FLIP_TURN) + ) { + if (this.hpDroppedBelowHalf(target)) { + return false; + } + } // Switch out logic for the player's Pokemon if (switchOutTarget.scene.getParty().filter((p) => p.isAllowedInBattle() && !p.isOnField()).length < 1) { return false; @@ -5665,11 +5818,27 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { false, false), MoveEndPhase); } } else { + /** + * Check if Wimp Out/Emergency Exit activates due to being hit by U-turn or Volt Switch + * If it did, the user of U-turn or Volt Switch will not be switched out. + */ + if (target.getAbility().hasAttr(PostDamageForceSwitchAbAttr) && + (move.id === Moves.U_TURN || move.id === Moves.VOLT_SWITCH) || move.id === Moves.FLIP_TURN) { + if (this.hpDroppedBelowHalf(target)) { + return false; + } + } + // Switch out logic for everything else (eg: WILD battles) if (user.scene.currentBattle.waveIndex % 10 === 0) { return false; } + // Don't allow wild mons to flee with U-turn et al + if (this.selfSwitch && !user.isPlayer() && move.category !== MoveCategory.STATUS) { + return false; + } + if (switchOutTarget.hp > 0) { switchOutTarget.leaveField(false); user.scene.queueMessage(i18next.t("moveTriggers:fled", { pokemonName: getPokemonNameWithAffix(switchOutTarget) }), null, true, 500); @@ -5752,8 +5921,22 @@ export class ForceSwitchOutAttr extends MoveEffectAttr { } return ret; } -} + /** + * Helper function to check if the Pokémon's health is below half after taking damage. + * Used for an edge case interaction with Wimp Out/Emergency Exit. + * If the Ability activates due to being hit by U-turn or Volt Switch, the user of that move will not be switched out. + */ + hpDroppedBelowHalf(target: Pokemon): boolean { + const pokemonHealth = target.hp; + const maxPokemonHealth = target.getMaxHp(); + const damageTaken = target.turnData.damageTaken; + const initialHealth = pokemonHealth + damageTaken; + + // Check if the Pokémon's health has dropped below half after the damage + return initialHealth >= maxPokemonHealth / 2 && pokemonHealth < maxPokemonHealth / 2; + } +} export class ChillyReceptionAttr extends ForceSwitchOutAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -5772,7 +5955,7 @@ export class RemoveTypeAttr extends MoveEffectAttr { private messageCallback: ((user: Pokemon) => void) | undefined; constructor(removedType: Type, messageCallback?: (user: Pokemon) => void) { - super(true, MoveEffectTrigger.POST_TARGET); + super(true, { trigger: MoveEffectTrigger.POST_TARGET }); this.removedType = removedType; this.messageCallback = messageCallback; @@ -5789,6 +5972,9 @@ export class RemoveTypeAttr extends MoveEffectAttr { const userTypes = user.getTypes(true); const modifiedTypes = userTypes.filter(type => type !== this.removedType); + if (modifiedTypes.length === 0) { + modifiedTypes.push(Type.UNKNOWN); + } user.summonData.types = modifiedTypes; user.updateInfo(); @@ -5811,7 +5997,11 @@ export class CopyTypeAttr extends MoveEffectAttr { return false; } - user.summonData.types = target.getTypes(true); + const targetTypes = target.getTypes(true); + if (targetTypes.includes(Type.UNKNOWN) && targetTypes.indexOf(Type.UNKNOWN) > -1) { + targetTypes[targetTypes.indexOf(Type.UNKNOWN)] = Type.NORMAL; + } + user.summonData.types = targetTypes; user.updateInfo(); user.scene.queueMessage(i18next.t("moveTriggers:copyType", { pokemonName: getPokemonNameWithAffix(user), targetPokemonName: getPokemonNameWithAffix(target) })); @@ -5820,7 +6010,7 @@ export class CopyTypeAttr extends MoveEffectAttr { } getCondition(): MoveConditionFunc { - return (user, target, move) => target.getTypes()[0] !== Type.UNKNOWN; + return (user, target, move) => target.getTypes()[0] !== Type.UNKNOWN || target.summonData.addedType !== null; } } @@ -5834,22 +6024,114 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr { return false; } - const biomeType = user.scene.arena.getTypeForBiome(); + const terrainType = user.scene.arena.getTerrainType(); + let typeChange: Type; + if (terrainType !== TerrainType.NONE) { + typeChange = this.getTypeForTerrain(user.scene.arena.getTerrainType()); + } else { + typeChange = this.getTypeForBiome(user.scene.arena.biomeType); + } - user.summonData.types = [ biomeType ]; + user.summonData.types = [ typeChange ]; user.updateInfo(); - user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[biomeType]}`) })); + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[typeChange]}`) })); return true; } + + /** + * Retrieves a type from the current terrain + * @param terrainType {@linkcode TerrainType} + * @returns {@linkcode Type} + */ + private getTypeForTerrain(terrainType: TerrainType): Type { + switch (terrainType) { + case TerrainType.ELECTRIC: + return Type.ELECTRIC; + case TerrainType.MISTY: + return Type.FAIRY; + case TerrainType.GRASSY: + return Type.GRASS; + case TerrainType.PSYCHIC: + return Type.PSYCHIC; + case TerrainType.NONE: + default: + return Type.UNKNOWN; + } + } + + /** + * Retrieves a type from the current biome + * @param biomeType {@linkcode Biome} + * @returns {@linkcode Type} + */ + private getTypeForBiome(biomeType: Biome): Type { + switch (biomeType) { + case Biome.TOWN: + case Biome.PLAINS: + case Biome.METROPOLIS: + return Type.NORMAL; + case Biome.GRASS: + case Biome.TALL_GRASS: + return Type.GRASS; + case Biome.FOREST: + case Biome.JUNGLE: + return Type.BUG; + case Biome.SLUM: + case Biome.SWAMP: + return Type.POISON; + case Biome.SEA: + case Biome.BEACH: + case Biome.LAKE: + case Biome.SEABED: + return Type.WATER; + case Biome.MOUNTAIN: + return Type.FLYING; + case Biome.BADLANDS: + return Type.GROUND; + case Biome.CAVE: + case Biome.DESERT: + return Type.ROCK; + case Biome.ICE_CAVE: + case Biome.SNOWY_FOREST: + return Type.ICE; + case Biome.MEADOW: + case Biome.FAIRY_CAVE: + case Biome.ISLAND: + return Type.FAIRY; + case Biome.POWER_PLANT: + return Type.ELECTRIC; + case Biome.VOLCANO: + return Type.FIRE; + case Biome.GRAVEYARD: + case Biome.TEMPLE: + return Type.GHOST; + case Biome.DOJO: + case Biome.CONSTRUCTION_SITE: + return Type.FIGHTING; + case Biome.FACTORY: + case Biome.LABORATORY: + return Type.STEEL; + case Biome.RUINS: + case Biome.SPACE: + return Type.PSYCHIC; + case Biome.WASTELAND: + case Biome.END: + return Type.DRAGON; + case Biome.ABYSS: + return Type.DARK; + default: + return Type.UNKNOWN; + } + } } export class ChangeTypeAttr extends MoveEffectAttr { private type: Type; constructor(type: Type) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; } @@ -5872,17 +6154,13 @@ export class AddTypeAttr extends MoveEffectAttr { private type: Type; constructor(type: Type) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.type = type; } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { - const types = target.getTypes().slice(0, 2).filter(t => t !== Type.UNKNOWN); // TODO: Figure out some way to actually check if another version of this effect is already applied - if (this.type !== Type.UNKNOWN) { - types.push(this.type); - } - target.summonData.types = types; + target.summonData.addedType = this.type; target.updateInfo(); user.scene.queueMessage(i18next.t("moveTriggers:addType", { typeName: i18next.t(`pokemonInfo:Type.${Type[this.type]}`), pokemonName: getPokemonNameWithAffix(target) })); @@ -5934,19 +6212,19 @@ export class RandomMovesetMoveAttr extends OverrideMoveEffectAttr { } let selectTargets: BattlerIndex[]; switch (true) { - case (moveTargets.multiple || moveTargets.targets.length === 1): { - selectTargets = moveTargets.targets; - break; - } - case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { - selectTargets = [ target.getBattlerIndex() ]; - break; - } - default: { - moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); - selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; - break; - } + case (moveTargets.multiple || moveTargets.targets.length === 1): { + selectTargets = moveTargets.targets; + break; + } + case (moveTargets.targets.indexOf(target.getBattlerIndex()) > -1): { + selectTargets = [ target.getBattlerIndex() ]; + break; + } + default: { + moveTargets.targets.splice(moveTargets.targets.indexOf(user.getAlly().getBattlerIndex())); + selectTargets = [ moveTargets.targets[user.randSeedInt(moveTargets.targets.length)] ]; + break; + } } const targets = selectTargets; user.getMoveQueue().push({ move: move?.moveId!, targets: targets, ignorePP: true }); // TODO: is this bang correct? @@ -5990,131 +6268,131 @@ export class NaturePowerAttr extends OverrideMoveEffectAttr { let moveId; switch (user.scene.arena.getTerrainType()) { // this allows terrains to 'override' the biome move - case TerrainType.NONE: - switch (user.scene.arena.biomeType) { - case Biome.TOWN: - moveId = Moves.ROUND; + case TerrainType.NONE: + switch (user.scene.arena.biomeType) { + case Biome.TOWN: + moveId = Moves.ROUND; + break; + case Biome.METROPOLIS: + moveId = Moves.TRI_ATTACK; + break; + case Biome.SLUM: + moveId = Moves.SLUDGE_BOMB; + break; + case Biome.PLAINS: + moveId = Moves.SILVER_WIND; + break; + case Biome.GRASS: + moveId = Moves.GRASS_KNOT; + break; + case Biome.TALL_GRASS: + moveId = Moves.POLLEN_PUFF; + break; + case Biome.MEADOW: + moveId = Moves.GIGA_DRAIN; + break; + case Biome.FOREST: + moveId = Moves.BUG_BUZZ; + break; + case Biome.JUNGLE: + moveId = Moves.LEAF_STORM; + break; + case Biome.SEA: + moveId = Moves.HYDRO_PUMP; + break; + case Biome.SWAMP: + moveId = Moves.MUD_BOMB; + break; + case Biome.BEACH: + moveId = Moves.SCALD; + break; + case Biome.LAKE: + moveId = Moves.BUBBLE_BEAM; + break; + case Biome.SEABED: + moveId = Moves.BRINE; + break; + case Biome.ISLAND: + moveId = Moves.LEAF_TORNADO; + break; + case Biome.MOUNTAIN: + moveId = Moves.AIR_SLASH; + break; + case Biome.BADLANDS: + moveId = Moves.EARTH_POWER; + break; + case Biome.DESERT: + moveId = Moves.SCORCHING_SANDS; + break; + case Biome.WASTELAND: + moveId = Moves.DRAGON_PULSE; + break; + case Biome.CONSTRUCTION_SITE: + moveId = Moves.STEEL_BEAM; + break; + case Biome.CAVE: + moveId = Moves.POWER_GEM; + break; + case Biome.ICE_CAVE: + moveId = Moves.ICE_BEAM; + break; + case Biome.SNOWY_FOREST: + moveId = Moves.FROST_BREATH; + break; + case Biome.VOLCANO: + moveId = Moves.LAVA_PLUME; + break; + case Biome.GRAVEYARD: + moveId = Moves.SHADOW_BALL; + break; + case Biome.RUINS: + moveId = Moves.ANCIENT_POWER; + break; + case Biome.TEMPLE: + moveId = Moves.EXTRASENSORY; + break; + case Biome.DOJO: + moveId = Moves.FOCUS_BLAST; + break; + case Biome.FAIRY_CAVE: + moveId = Moves.ALLURING_VOICE; + break; + case Biome.ABYSS: + moveId = Moves.OMINOUS_WIND; + break; + case Biome.SPACE: + moveId = Moves.DRACO_METEOR; + break; + case Biome.FACTORY: + moveId = Moves.FLASH_CANNON; + break; + case Biome.LABORATORY: + moveId = Moves.ZAP_CANNON; + break; + case Biome.POWER_PLANT: + moveId = Moves.CHARGE_BEAM; + break; + case Biome.END: + moveId = Moves.ETERNABEAM; + break; + } break; - case Biome.METROPOLIS: + case TerrainType.MISTY: + moveId = Moves.MOONBLAST; + break; + case TerrainType.ELECTRIC: + moveId = Moves.THUNDERBOLT; + break; + case TerrainType.GRASSY: + moveId = Moves.ENERGY_BALL; + break; + case TerrainType.PSYCHIC: + moveId = Moves.PSYCHIC; + break; + default: + // Just in case there's no match moveId = Moves.TRI_ATTACK; break; - case Biome.SLUM: - moveId = Moves.SLUDGE_BOMB; - break; - case Biome.PLAINS: - moveId = Moves.SILVER_WIND; - break; - case Biome.GRASS: - moveId = Moves.GRASS_KNOT; - break; - case Biome.TALL_GRASS: - moveId = Moves.POLLEN_PUFF; - break; - case Biome.MEADOW: - moveId = Moves.GIGA_DRAIN; - break; - case Biome.FOREST: - moveId = Moves.BUG_BUZZ; - break; - case Biome.JUNGLE: - moveId = Moves.LEAF_STORM; - break; - case Biome.SEA: - moveId = Moves.HYDRO_PUMP; - break; - case Biome.SWAMP: - moveId = Moves.MUD_BOMB; - break; - case Biome.BEACH: - moveId = Moves.SCALD; - break; - case Biome.LAKE: - moveId = Moves.BUBBLE_BEAM; - break; - case Biome.SEABED: - moveId = Moves.BRINE; - break; - case Biome.ISLAND: - moveId = Moves.LEAF_TORNADO; - break; - case Biome.MOUNTAIN: - moveId = Moves.AIR_SLASH; - break; - case Biome.BADLANDS: - moveId = Moves.EARTH_POWER; - break; - case Biome.DESERT: - moveId = Moves.SCORCHING_SANDS; - break; - case Biome.WASTELAND: - moveId = Moves.DRAGON_PULSE; - break; - case Biome.CONSTRUCTION_SITE: - moveId = Moves.STEEL_BEAM; - break; - case Biome.CAVE: - moveId = Moves.POWER_GEM; - break; - case Biome.ICE_CAVE: - moveId = Moves.ICE_BEAM; - break; - case Biome.SNOWY_FOREST: - moveId = Moves.FROST_BREATH; - break; - case Biome.VOLCANO: - moveId = Moves.LAVA_PLUME; - break; - case Biome.GRAVEYARD: - moveId = Moves.SHADOW_BALL; - break; - case Biome.RUINS: - moveId = Moves.ANCIENT_POWER; - break; - case Biome.TEMPLE: - moveId = Moves.EXTRASENSORY; - break; - case Biome.DOJO: - moveId = Moves.FOCUS_BLAST; - break; - case Biome.FAIRY_CAVE: - moveId = Moves.ALLURING_VOICE; - break; - case Biome.ABYSS: - moveId = Moves.OMINOUS_WIND; - break; - case Biome.SPACE: - moveId = Moves.DRACO_METEOR; - break; - case Biome.FACTORY: - moveId = Moves.FLASH_CANNON; - break; - case Biome.LABORATORY: - moveId = Moves.ZAP_CANNON; - break; - case Biome.POWER_PLANT: - moveId = Moves.CHARGE_BEAM; - break; - case Biome.END: - moveId = Moves.ETERNABEAM; - break; - } - break; - case TerrainType.MISTY: - moveId = Moves.MOONBLAST; - break; - case TerrainType.ELECTRIC: - moveId = Moves.THUNDERBOLT; - break; - case TerrainType.GRASSY: - moveId = Moves.ENERGY_BALL; - break; - case TerrainType.PSYCHIC: - moveId = Moves.PSYCHIC; - break; - default: - // Just in case there's no match - moveId = Moves.TRI_ATTACK; - break; } user.getMoveQueue().push({ move: moveId, targets: [ target.getBattlerIndex() ], ignorePP: true }); @@ -6134,7 +6412,7 @@ const lastMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { return false; } - if (allMoves[copiableMove].hasAttr(ChargeAttr)) { + if (allMoves[copiableMove].isChargingMove()) { return false; } @@ -6282,7 +6560,7 @@ const targetMoveCopiableCondition: MoveConditionFunc = (user, target, move) => { return false; } - if (allMoves[copiableMove.move].hasAttr(ChargeAttr) && copiableMove.result === MoveResult.OTHER) { + if (allMoves[copiableMove.move].isChargingMove() && copiableMove.result === MoveResult.OTHER) { return false; } @@ -6403,7 +6681,7 @@ export class AbilityChangeAttr extends MoveEffectAttr { public ability: Abilities; constructor(ability: Abilities, selfTarget?: boolean) { - super(selfTarget, MoveEffectTrigger.HIT); + super(selfTarget, { trigger: MoveEffectTrigger.HIT }); this.ability = ability; } @@ -6432,7 +6710,7 @@ export class AbilityCopyAttr extends MoveEffectAttr { public copyToPartner: boolean; constructor(copyToPartner: boolean = false) { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); this.copyToPartner = copyToPartner; } @@ -6471,7 +6749,7 @@ export class AbilityGiveAttr extends MoveEffectAttr { public copyToPartner: boolean; constructor() { - super(false, MoveEffectTrigger.HIT); + super(false, { trigger: MoveEffectTrigger.HIT }); } apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { @@ -6574,42 +6852,52 @@ export class SuppressAbilitiesIfActedAttr extends MoveEffectAttr { } export class TransformAttr extends MoveEffectAttr { - apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { - return new Promise(resolve => { - if (!super.apply(user, target, move, args)) { - return resolve(false); + async apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): Promise { + if (!super.apply(user, target, move, args)) { + return false; + } + + const promises: Promise[] = []; + user.summonData.speciesForm = target.getSpeciesForm(); + user.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); + user.summonData.ability = target.getAbility().id; + user.summonData.gender = target.getGender(); + user.summonData.fusionGender = target.getFusionGender(); + + // Power Trick's effect will not preserved after using Transform + user.removeTag(BattlerTagType.POWER_TRICK); + + // Copy all stats (except HP) + for (const s of EFFECTIVE_STATS) { + user.setStat(s, target.getStat(s, false), false); + } + + // Copy all stat stages + for (const s of BATTLE_STATS) { + user.setStatStage(s, target.getStatStage(s)); + } + + user.summonData.moveset = target.getMoveset().map((m) => { + if (m) { + // If PP value is less than 5, do nothing. If greater, we need to reduce the value to 5. + return new PokemonMove(m.moveId, 0, 0, false, Math.min(m.getMove().pp, 5)); + } else { + console.warn(`Transform: somehow iterating over a ${m} value when copying moveset!`); + return new PokemonMove(Moves.NONE); } - - user.summonData.speciesForm = target.getSpeciesForm(); - user.summonData.fusionSpeciesForm = target.getFusionSpeciesForm(); - user.summonData.ability = target.getAbility().id; - user.summonData.gender = target.getGender(); - user.summonData.fusionGender = target.getFusionGender(); - - // Power Trick's effect will not preserved after using Transform - user.removeTag(BattlerTagType.POWER_TRICK); - - // Copy all stats (except HP) - for (const s of EFFECTIVE_STATS) { - user.setStat(s, target.getStat(s, false), false); - } - - // Copy all stat stages - for (const s of BATTLE_STATS) { - user.setStatStage(s, target.getStatStage(s)); - } - - user.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m?.moveId!, m?.ppUsed, m?.ppUp)); // TODO: is this bang correct? - user.summonData.types = target.getTypes(); - - user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); - - user.loadAssets(false).then(() => { - user.playAnim(); - user.updateInfo(); - resolve(true); - }); }); + user.summonData.types = target.getTypes(); + promises.push(user.updateInfo()); + + user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoTarget", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target) })); + + promises.push(user.loadAssets(false).then(() => { + user.playAnim(); + user.updateInfo(); + })); + + await Promise.all(promises); + return true; } } @@ -6773,7 +7061,7 @@ export class DiscourageFrequentUseAttr extends MoveAttr { export class MoneyAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.HIT, true); + super(true, { trigger: MoveEffectTrigger.HIT, firstHitOnly: true }); } apply(user: Pokemon, target: Pokemon, move: Move): boolean { @@ -6790,7 +7078,7 @@ export class MoneyAttr extends MoveEffectAttr { */ export class DestinyBondAttr extends MoveEffectAttr { constructor() { - super(true, MoveEffectTrigger.PRE_APPLY); + super(true, { trigger: MoveEffectTrigger.PRE_APPLY }); } /** @@ -6840,7 +7128,7 @@ export class StatusIfBoostedAttr extends MoveEffectAttr { public effect: StatusEffect; constructor(effect: StatusEffect) { - super(true, MoveEffectTrigger.HIT); + super(true, { trigger: MoveEffectTrigger.HIT }); this.effect = effect; } @@ -6965,6 +7253,11 @@ const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target const failIfLastCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => user.scene.phaseQueue.find(phase => phase instanceof MovePhase) !== undefined; +const failIfLastInPartyCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => { + const party: Pokemon[] = user.isPlayer() ? user.scene.getParty() : user.scene.getEnemyParty(); + return party.some(pokemon => pokemon.isActive() && !pokemon.isOnField()); +}; + export type MoveAttrFilter = (attr: MoveAttr) => boolean; function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: Move, args: any[]): Promise { @@ -6981,6 +7274,20 @@ function applyMoveAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null }); } +function applyMoveChargeAttrsInternal(attrFilter: MoveAttrFilter, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, args: any[]): Promise { + return new Promise(resolve => { + const chargeAttrPromises: Promise[] = []; + const chargeMoveAttrs = move.chargeAttrs.filter(a => attrFilter(a)); + for (const attr of chargeMoveAttrs) { + const result = attr.apply(user, target, move, args); + if (result instanceof Promise) { + chargeAttrPromises.push(result); + } + } + Promise.allSettled(chargeAttrPromises).then(() => resolve()); + }); +} + export function applyMoveAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: Move, ...args: any[]): Promise { return applyMoveAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); } @@ -6989,6 +7296,10 @@ export function applyFilteredMoveAttrs(attrFilter: MoveAttrFilter, user: Pokemon return applyMoveAttrsInternal(attrFilter, user, target, move, args); } +export function applyMoveChargeAttrs(attrType: Constructor, user: Pokemon | null, target: Pokemon | null, move: ChargingMove, ...args: any[]): Promise { + return applyMoveChargeAttrsInternal((attr: MoveAttr) => attr instanceof attrType, user, target, move, args); +} + export class MoveCondition { protected func: MoveConditionFunc; @@ -7152,47 +7463,47 @@ export function getMoveTargets(user: Pokemon, move: Moves): MoveTargetSet { let multiple = false; switch (moveTarget) { - case MoveTarget.USER: - case MoveTarget.PARTY: - set = [ user ]; - break; - case MoveTarget.NEAR_OTHER: - case MoveTarget.OTHER: - case MoveTarget.ALL_NEAR_OTHERS: - case MoveTarget.ALL_OTHERS: - set = (opponents.concat([ user.getAlly() ])); - multiple = moveTarget === MoveTarget.ALL_NEAR_OTHERS || moveTarget === MoveTarget.ALL_OTHERS; - break; - case MoveTarget.NEAR_ENEMY: - case MoveTarget.ALL_NEAR_ENEMIES: - case MoveTarget.ALL_ENEMIES: - case MoveTarget.ENEMY_SIDE: - set = opponents; - multiple = moveTarget !== MoveTarget.NEAR_ENEMY; - break; - case MoveTarget.RANDOM_NEAR_ENEMY: - set = [ opponents[user.randSeedInt(opponents.length)] ]; - break; - case MoveTarget.ATTACKER: - return { targets: [ -1 as BattlerIndex ], multiple: false }; - case MoveTarget.NEAR_ALLY: - case MoveTarget.ALLY: - set = [ user.getAlly() ]; - break; - case MoveTarget.USER_OR_NEAR_ALLY: - case MoveTarget.USER_AND_ALLIES: - case MoveTarget.USER_SIDE: - set = [ user, user.getAlly() ]; - multiple = moveTarget !== MoveTarget.USER_OR_NEAR_ALLY; - break; - case MoveTarget.ALL: - case MoveTarget.BOTH_SIDES: - set = [ user, user.getAlly() ].concat(opponents); - multiple = true; - break; - case MoveTarget.CURSE: - set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; - break; + case MoveTarget.USER: + case MoveTarget.PARTY: + set = [ user ]; + break; + case MoveTarget.NEAR_OTHER: + case MoveTarget.OTHER: + case MoveTarget.ALL_NEAR_OTHERS: + case MoveTarget.ALL_OTHERS: + set = (opponents.concat([ user.getAlly() ])); + multiple = moveTarget === MoveTarget.ALL_NEAR_OTHERS || moveTarget === MoveTarget.ALL_OTHERS; + break; + case MoveTarget.NEAR_ENEMY: + case MoveTarget.ALL_NEAR_ENEMIES: + case MoveTarget.ALL_ENEMIES: + case MoveTarget.ENEMY_SIDE: + set = opponents; + multiple = moveTarget !== MoveTarget.NEAR_ENEMY; + break; + case MoveTarget.RANDOM_NEAR_ENEMY: + set = [ opponents[user.randSeedInt(opponents.length)] ]; + break; + case MoveTarget.ATTACKER: + return { targets: [ -1 as BattlerIndex ], multiple: false }; + case MoveTarget.NEAR_ALLY: + case MoveTarget.ALLY: + set = [ user.getAlly() ]; + break; + case MoveTarget.USER_OR_NEAR_ALLY: + case MoveTarget.USER_AND_ALLIES: + case MoveTarget.USER_SIDE: + set = [ user, user.getAlly() ]; + multiple = moveTarget !== MoveTarget.USER_OR_NEAR_ALLY; + break; + case MoveTarget.ALL: + case MoveTarget.BOTH_SIDES: + set = [ user, user.getAlly() ].concat(opponents); + multiple = true; + break; + case MoveTarget.CURSE: + set = user.getTypes(true).includes(Type.GHOST) ? (opponents.concat([ user.getAlly() ])) : [ user ]; + break; } return { targets: set.filter(p => p?.isActive(true)).map(p => p.getBattlerIndex()).filter(t => t !== undefined), multiple }; @@ -7233,8 +7544,8 @@ export function initMoves() { new AttackMove(Moves.GUILLOTINE, Type.NORMAL, MoveCategory.PHYSICAL, 200, 30, 5, -1, 0, 1) .attr(OneHitKOAttr) .attr(OneHitKOAccuracyAttr), - new AttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.RAZOR_WIND_CHARGING, i18next.t("moveTriggers:whippedUpAWhirlwind", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.RAZOR_WIND, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 1) + .chargeText(i18next.t("moveTriggers:whippedUpAWhirlwind", { pokemonName: "{USER}" })) .attr(HighCritAttr) .windMove() .ignoresVirtual() @@ -7254,8 +7565,9 @@ export function initMoves() { .hidesTarget() .windMove() .partial(), // Should force random switches - new AttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.FLY_CHARGING, i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" }), BattlerTagType.FLYING) + new ChargingAttackMove(Moves.FLY, Type.FLYING, MoveCategory.PHYSICAL, 90, 95, 15, -1, 0, 1) + .chargeText(i18next.t("moveTriggers:flewUpHigh", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .condition(failOnGravityCondition) .ignoresVirtual(), new AttackMove(Moves.BIND, Type.NORMAL, MoveCategory.PHYSICAL, 15, 85, 20, -1, 0, 1) @@ -7404,8 +7716,9 @@ export function initMoves() { .makesContact(false) .slicingMove() .target(MoveTarget.ALL_NEAR_ENEMIES), - new AttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BEAM_CHARGING, i18next.t("moveTriggers:tookInSunlight", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.SOLAR_BEAM, Type.GRASS, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 1) + .chargeText(i18next.t("moveTriggers:tookInSunlight", { pokemonName: "{USER}" })) + .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) .attr(AntiSunlightPowerDecreaseAttr) .ignoresVirtual(), new StatusMove(Moves.POISON_POWDER, Type.POISON, 75, 35, -1, 0, 1) @@ -7454,8 +7767,9 @@ export function initMoves() { .attr(OneHitKOAccuracyAttr) .attr(HitsTagAttr, BattlerTagType.UNDERGROUND) .makesContact(false), - new AttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.DIG_CHARGING, i18next.t("moveTriggers:dugAHole", { pokemonName: "{USER}" }), BattlerTagType.UNDERGROUND) + new ChargingAttackMove(Moves.DIG, Type.GROUND, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 1) + .chargeText(i18next.t("moveTriggers:dugAHole", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERGROUND) .ignoresVirtual(), new StatusMove(Moves.TOXIC, Type.POISON, 90, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.TOXIC) @@ -7551,9 +7865,9 @@ export function initMoves() { .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, -1, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKULL_BASH_CHARGING, i18next.t("moveTriggers:loweredItsHead", { pokemonName: "{USER}" }), null, true) - .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true) + new ChargingAttackMove(Moves.SKULL_BASH, Type.NORMAL, MoveCategory.PHYSICAL, 130, 100, 10, -1, 0, 1) + .chargeText(i18next.t("moveTriggers:loweredItsHead", { pokemonName: "{USER}" })) + .chargeAttr(StatStageChangeAttr, [ Stat.DEF ], 1, true) .ignoresVirtual(), new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1) .attr(MultiHitAttr) @@ -7590,14 +7904,15 @@ export function initMoves() { .triageMove(), new StatusMove(Moves.LOVELY_KISS, Type.NORMAL, 75, 10, -1, 0, 1) .attr(StatusEffectAttr, StatusEffect.SLEEP), - new AttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) - .attr(ChargeAttr, ChargeAnim.SKY_ATTACK_CHARGING, i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.SKY_ATTACK, Type.FLYING, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 1) + .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) .attr(HighCritAttr) .attr(FlinchAttr) .makesContact(false) .ignoresVirtual(), new StatusMove(Moves.TRANSFORM, Type.NORMAL, -1, 10, -1, 0, 1) .attr(TransformAttr) + .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE)) .ignoresProtect(), new AttackMove(Moves.BUBBLE, Type.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) @@ -7852,6 +8167,7 @@ export function initMoves() { .attr(StatusEffectAttr, StatusEffect.PARALYSIS), new SelfStatusMove(Moves.BATON_PASS, Type.NORMAL, -1, 40, -1, 0, 2) .attr(ForceSwitchOutAttr, true, SwitchType.BATON_PASS) + .condition(failIfLastInPartyCondition) .hidesUser(), new StatusMove(Moves.ENCORE, Type.NORMAL, 100, 5, -1, 0, 2) .attr(AddBattlerTagAttr, BattlerTagType.ENCORE, false, true) @@ -8028,7 +8344,7 @@ export function initMoves() { .attr(RemoveScreensAttr), new StatusMove(Moves.YAWN, Type.NORMAL, -1, 10, -1, 0, 3) .attr(AddBattlerTagAttr, BattlerTagType.DROWSY, false, true) - .condition((user, target, move) => !target.status && !target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)), + .condition((user, target, move) => !target.status && !target.isSafeguarded(user)), new AttackMove(Moves.KNOCK_OFF, Type.DARK, MoveCategory.PHYSICAL, 65, 100, 20, -1, 0, 3) .attr(MovePowerMultiplierAttr, (user, target, move) => target.getHeldItems().filter(i => i.isTransferable).length > 0 ? 1.5 : 1) .attr(RemoveHeldItemAttr, false), @@ -8055,9 +8371,10 @@ export function initMoves() { new AttackMove(Moves.SECRET_POWER, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, 30, 0, 3) .makesContact(false) .attr(SecretPowerAttr), - new AttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) - .attr(ChargeAttr, ChargeAnim.DIVE_CHARGING, i18next.t("moveTriggers:hidUnderwater", { pokemonName: "{USER}" }), BattlerTagType.UNDERWATER, true) - .attr(GulpMissileTagAttr) + new ChargingAttackMove(Moves.DIVE, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 3) + .chargeText(i18next.t("moveTriggers:hidUnderwater", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.UNDERWATER) + .chargeAttr(GulpMissileTagAttr) .ignoresVirtual(), new AttackMove(Moves.ARM_THRUST, Type.FIGHTING, MoveCategory.PHYSICAL, 15, 100, 20, -1, 0, 3) .attr(MultiHitAttr), @@ -8190,8 +8507,9 @@ export function initMoves() { .attr(RechargeAttr), new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1, true), - new AttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) - .attr(ChargeAttr, ChargeAnim.BOUNCE_CHARGING, i18next.t("moveTriggers:sprangUp", { pokemonName: "{USER}" }), BattlerTagType.FLYING) + new ChargingAttackMove(Moves.BOUNCE, Type.FLYING, MoveCategory.PHYSICAL, 85, 85, 5, 30, 0, 3) + .chargeText(i18next.t("moveTriggers:sprangUp", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .condition(failOnGravityCondition) .ignoresVirtual(), @@ -8546,8 +8864,9 @@ export function initMoves() { new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true) .windMove(), - new AttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) - .attr(ChargeAttr, ChargeAnim.SHADOW_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" }), BattlerTagType.HIDDEN) + new ChargingAttackMove(Moves.SHADOW_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4) + .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5) @@ -8670,12 +8989,13 @@ export function initMoves() { .attr( MovePowerMultiplierAttr, (user, target, move) => target.status || target.hasAbility(Abilities.COMATOSE) ? 2 : 1), - new AttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) - .partial() // Should immobilize the target, Flying types should take no damage. cf https://bulbapedia.bulbagarden.net/wiki/Sky_Drop_(move) and https://www.smogon.com/dex/sv/moves/sky-drop/ - .attr(ChargeAttr, ChargeAnim.SKY_DROP_CHARGING, i18next.t("moveTriggers:tookTargetIntoSky", { pokemonName: "{USER}", targetName: "{TARGET}" }), BattlerTagType.FLYING) // TODO: Add 2nd turn message + new ChargingAttackMove(Moves.SKY_DROP, Type.FLYING, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 5) + .chargeText(i18next.t("moveTriggers:tookTargetIntoSky", { pokemonName: "{USER}", targetName: "{TARGET}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.FLYING) .condition(failOnGravityCondition) .condition((user, target, move) => !target.getTag(BattlerTagType.SUBSTITUTE)) - .ignoresVirtual(), + .ignoresVirtual() + .partial(), // Should immobilize the target, Flying types should take no damage. cf https://bulbapedia.bulbagarden.net/wiki/Sky_Drop_(move) and https://www.smogon.com/dex/sv/moves/sky-drop/ new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5) .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true) .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true), @@ -8825,12 +9145,12 @@ export function initMoves() { new AttackMove(Moves.FIERY_DANCE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5) .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .danceMove(), - new AttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.FREEZE_SHOCK_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingLight", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.FREEZE_SHOCK, Type.ICE, MoveCategory.PHYSICAL, 140, 90, 5, 30, 0, 5) + .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingLight", { pokemonName: "{USER}" })) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) .makesContact(false), - new AttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) - .attr(ChargeAttr, ChargeAnim.ICE_BURN_CHARGING, i18next.t("moveTriggers:becameCloakedInFreezingAir", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.ICE_BURN, Type.ICE, MoveCategory.SPECIAL, 140, 90, 5, 30, 0, 5) + .chargeText(i18next.t("moveTriggers:becameCloakedInFreezingAir", { pokemonName: "{USER}" })) .attr(StatusEffectAttr, StatusEffect.BURN) .ignoresVirtual(), new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5) @@ -8866,19 +9186,19 @@ export function initMoves() { // If any fielded pokémon is grass-type and grounded. return [ ...user.scene.getEnemyParty(), ...user.scene.getParty() ].some((poke) => poke.isOfType(Type.GRASS) && poke.isGrounded()); }) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded()), + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded() }), new StatusMove(Moves.STICKY_WEB, Type.BUG, -1, 20, -1, 0, 6) .attr(AddArenaTrapTagAttr, ArenaTagType.STICKY_WEB) .target(MoveTarget.ENEMY_SIDE), new AttackMove(Moves.FELL_STINGER, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 25, -1, 0, 6) .attr(PostVictoryStatStageChangeAttr, [ Stat.ATK ], 3, true ), - new AttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.PHANTOM_FORCE_CHARGING, i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" }), BattlerTagType.HIDDEN) + new ChargingAttackMove(Moves.PHANTOM_FORCE, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 6) + .chargeText(i18next.t("moveTriggers:vanishedInstantly", { pokemonName: "{USER}" })) + .chargeAttr(SemiInvulnerableAttr, BattlerTagType.HIDDEN) .ignoresProtect() .ignoresVirtual(), new StatusMove(Moves.TRICK_OR_TREAT, Type.GHOST, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GHOST) - .edgeCase(), // Weird interaction with Forest's Curse, reflect type, burn up + .attr(AddTypeAttr, Type.GHOST), new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1) .soundBased(), @@ -8890,8 +9210,7 @@ export function initMoves() { .target(MoveTarget.ALL_NEAR_OTHERS) .triageMove(), new StatusMove(Moves.FORESTS_CURSE, Type.GRASS, 100, 20, -1, 0, 6) - .attr(AddTypeAttr, Type.GRASS) - .edgeCase(), // Weird interaction with Trick or Treat, reflect type, burn up + .attr(AddTypeAttr, Type.GRASS), new AttackMove(Moves.PETAL_BLIZZARD, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 6) .windMove() .makesContact(false) @@ -8904,7 +9223,7 @@ export function initMoves() { .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, { trigger: MoveEffectTrigger.PRE_APPLY }) .attr(ForceSwitchOutAttr, true) .soundBased(), new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6) @@ -8919,7 +9238,7 @@ export function initMoves() { .condition(failIfLastCondition), new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6) .target(MoveTarget.ALL) - .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)), + .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, { condition: (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), @@ -8951,7 +9270,7 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.SPATK ], -1) .soundBased(), new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6) - .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, undefined, undefined, undefined, undefined, true) + .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true, { firstTargetOnly: true }) .makesContact(false) .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.STEAM_ERUPTION, Type.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6) @@ -8977,18 +9296,18 @@ export function initMoves() { new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6) .attr(StatStageChangeAttr, [ Stat.SPATK ], -2), new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, { condition: (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC }) .target(MoveTarget.ALL_NEAR_ENEMIES), new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6) .ignoresSubstitute() .powderMove() .unimplemented(), - new SelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) - .attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) + new ChargingSelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6) + .chargeText(i18next.t("moveTriggers:isChargingPower", { pokemonName: "{USER}" })) .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true) .ignoresVirtual(), new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6) - .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false))) + .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .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)))), @@ -9193,8 +9512,9 @@ export function initMoves() { .attr(StatStageChangeAttr, [ Stat.ATK ], -1) .condition((user, target, move) => target.getStatStage(Stat.ATK) > -6) .triageMove(), - new AttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) - .attr(SunlightChargeAttr, ChargeAnim.SOLAR_BLADE_CHARGING, i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) + new ChargingAttackMove(Moves.SOLAR_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 125, 100, 10, -1, 0, 7) + .chargeText(i18next.t("moveTriggers:isGlowing", { pokemonName: "{USER}" })) + .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]) .attr(AntiSunlightPowerDecreaseAttr) .slicingMove(), new AttackMove(Moves.LEAFAGE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 7) @@ -9207,7 +9527,7 @@ export function initMoves() { new SelfStatusMove(Moves.LASER_FOCUS, Type.NORMAL, -1, 30, -1, 0, 7) .attr(AddBattlerTagAttr, BattlerTagType.ALWAYS_CRIT, true, false), new StatusMove(Moves.GEAR_UP, Type.STEEL, -1, 20, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false))) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, { condition: (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS ].find(a => target.hasAbility(a, false)) }) .ignoresSubstitute() .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)))), @@ -9264,7 +9584,7 @@ export function initMoves() { .ballBombMove() .makesContact(false), new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, null, true, false, MoveEffectTrigger.HIT, true) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.DRAGON_HAMMER, Type.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7), @@ -9378,13 +9698,13 @@ export function initMoves() { .makesContact(false) .ignoresVirtual(), new AttackMove(Moves.CLANGOROUS_SOULBLAZE, Type.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true, undefined, undefined, undefined, undefined, true) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true, { firstTargetOnly: true }) .soundBased() .target(MoveTarget.ALL_NEAR_ENEMIES) .edgeCase() // I assume it needs clanging scales and Kommo-O .ignoresVirtual(), /* End Unused */ - new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) //LGPE Implementation + new AttackMove(Moves.ZIPPY_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 50, 100, 15, -1, 2, 7) // LGPE Implementation .attr(CritOnlyAttr), new AttackMove(Moves.SPLISHY_SPLASH, Type.WATER, MoveCategory.SPECIAL, 90, 100, 15, 30, 0, 7) .attr(StatusEffectAttr, StatusEffect.PARALYSIS) @@ -9394,7 +9714,7 @@ export function initMoves() { new AttackMove(Moves.PIKA_PAPOW, Type.ELECTRIC, MoveCategory.SPECIAL, -1, -1, 20, -1, 0, 7) .attr(FriendshipPowerAttr), new AttackMove(Moves.BOUNCY_BUBBLE, Type.WATER, MoveCategory.SPECIAL, 60, 100, 20, -1, 0, 7) - .attr(HitHealAttr, 1.0) + .attr(HitHealAttr) // Custom .triageMove() .target(MoveTarget.ALL_NEAR_ENEMIES), new AttackMove(Moves.BUZZY_BUZZ, Type.ELECTRIC, MoveCategory.SPECIAL, 60, 100, 20, 100, 0, 7) @@ -9616,13 +9936,13 @@ export function initMoves() { .attr(ClearTerrainAttr) .condition((user, target, move) => !!user.scene.arena.terrain), new AttackMove(Moves.SCALE_SHOT, Type.DRAGON, MoveCategory.PHYSICAL, 25, 90, 20, -1, 0, 8) - .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true, null, true, false, MoveEffectTrigger.HIT, false, true) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, null, true, false, MoveEffectTrigger.HIT, false, true) + .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true, { lastHitOnly: true }) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, { lastHitOnly: true }) .attr(MultiHitAttr) .makesContact(false), - new AttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, 100, 0, 8) - .attr(ChargeAttr, ChargeAnim.METEOR_BEAM_CHARGING, i18next.t("moveTriggers:isOverflowingWithSpacePower", { pokemonName: "{USER}" }), null, true) - .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) + new ChargingAttackMove(Moves.METEOR_BEAM, Type.ROCK, MoveCategory.SPECIAL, 120, 90, 10, -1, 0, 8) + .chargeText(i18next.t("moveTriggers:isOverflowingWithSpacePower", { pokemonName: "{USER}" })) + .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) .ignoresVirtual(), new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8) .attr(ShellSideArmCategoryAttr) @@ -9751,7 +10071,7 @@ export function initMoves() { new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8) .makesContact(false) .attr(HighCritAttr) - .attr(StatStageChangeAttr, [ Stat.DEF ], -1, undefined, undefined, undefined, undefined, undefined, undefined, undefined, 50) + .attr(StatStageChangeAttr, [ Stat.DEF ], -1, false, { effectChanceOverride: 50 }) .attr(FlinchAttr), new AttackMove(Moves.INFERNAL_PARADE, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8) .attr(StatusEffectAttr, StatusEffect.BURN) @@ -9887,7 +10207,7 @@ export function initMoves() { .attr(TeraMoveCategoryAttr) .attr(TeraBlastTypeAttr) .attr(TeraBlastPowerAttr) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR)) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, { condition: (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR) }) .partial(), /** Does not ignore abilities that affect stats, relevant in determining the move's category {@see TeraMoveCategoryAttr} */ new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9) .attr(ProtectAttr, BattlerTagType.SILK_TRAP) @@ -9898,6 +10218,7 @@ export function initMoves() { .attr(ConfuseAttr) .recklessMove(), new AttackMove(Moves.LAST_RESPECTS, Type.GHOST, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 9) + .partial() // Counter resets every wave instead of on arena reset .attr(MovePowerMultiplierAttr, (user, target, move) => 1 + Math.min(user.isPlayer() ? user.scene.currentBattle.playerFaints : user.scene.currentBattle.enemyFaints, 100)) .makesContact(false), new AttackMove(Moves.LUMINA_CRASH, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9) @@ -9970,7 +10291,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(StatStageChangeAttr, [ Stat.SPATK ], -1, true, null, true, false, MoveEffectTrigger.HIT, true) + .attr(StatStageChangeAttr, [ Stat.SPATK ], -1, true, { firstTargetOnly: 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) @@ -9987,12 +10308,13 @@ export function initMoves() { .makesContact(), new SelfStatusMove(Moves.SHED_TAIL, Type.NORMAL, -1, 10, -1, 0, 9) .attr(AddSubstituteAttr, 0.5) - .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL), + .attr(ForceSwitchOutAttr, true, SwitchType.SHED_TAIL) + .condition(failIfLastInPartyCondition), new SelfStatusMove(Moves.CHILLY_RECEPTION, Type.ICE, -1, 10, -1, 0, 9) .attr(PreMoveMessageAttr, (user, move) => i18next.t("moveTriggers:chillyReception", { pokemonName: getPokemonNameWithAffix(user) })) .attr(ChillyReceptionAttr, true), new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9) - .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true) + .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true) .attr(RemoveArenaTrapAttr, true) .attr(RemoveAllSubstitutesAttr), new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9) @@ -10074,8 +10396,10 @@ export function initMoves() { .attr(IvyCudgelTypeAttr) .attr(HighCritAttr) .makesContact(false), - new AttackMove(Moves.ELECTRO_SHOT, Type.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) - .attr(ElectroShotChargeAttr) + new ChargingAttackMove(Moves.ELECTRO_SHOT, Type.ELECTRIC, MoveCategory.SPECIAL, 130, 100, 10, 100, 0, 9) + .chargeText(i18next.t("moveTriggers:absorbedElectricity", { pokemonName: "{USER}" })) + .chargeAttr(StatStageChangeAttr, [ Stat.SPATK ], 1, true) + .chargeAttr(WeatherInstantChargeAttr, [ WeatherType.RAIN, WeatherType.HEAVY_RAIN ]) .ignoresVirtual(), new AttackMove(Moves.TERA_STARSTORM, Type.NORMAL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9) .attr(TeraMoveCategoryAttr) diff --git a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts index 56d80c9598c..f0155b4f2a4 100644 --- a/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts +++ b/src/data/mystery-encounters/encounters/a-trainers-test-encounter.ts @@ -44,32 +44,32 @@ export const ATrainersTestEncounter: MysteryEncounter = let spriteKeys; let trainerNameKey: string; switch (randSeedInt(5)) { - default: - case 0: - trainerType = TrainerType.BUCK; - spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); - trainerNameKey = "buck"; - break; - case 1: - trainerType = TrainerType.CHERYL; - spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); - trainerNameKey = "cheryl"; - break; - case 2: - trainerType = TrainerType.MARLEY; - spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); - trainerNameKey = "marley"; - break; - case 3: - trainerType = TrainerType.MIRA; - spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); - trainerNameKey = "mira"; - break; - case 4: - trainerType = TrainerType.RILEY; - spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); - trainerNameKey = "riley"; - break; + default: + case 0: + trainerType = TrainerType.BUCK; + spriteKeys = getSpriteKeysFromSpecies(Species.CLAYDOL); + trainerNameKey = "buck"; + break; + case 1: + trainerType = TrainerType.CHERYL; + spriteKeys = getSpriteKeysFromSpecies(Species.BLISSEY); + trainerNameKey = "cheryl"; + break; + case 2: + trainerType = TrainerType.MARLEY; + spriteKeys = getSpriteKeysFromSpecies(Species.ARCANINE); + trainerNameKey = "marley"; + break; + case 3: + trainerType = TrainerType.MIRA; + spriteKeys = getSpriteKeysFromSpecies(Species.ALAKAZAM, false, 1); + trainerNameKey = "mira"; + break; + case 4: + trainerType = TrainerType.RILEY; + spriteKeys = getSpriteKeysFromSpecies(Species.LUCARIO, false, 1); + trainerNameKey = "riley"; + break; } // Dialogue and tokens for trainer diff --git a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts index ab892ae00f2..1e20b73e351 100644 --- a/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts +++ b/src/data/mystery-encounters/encounters/an-offer-you-cant-refuse-encounter.ts @@ -1,4 +1,4 @@ -import { leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; +import { generateModifierType, leaveEncounterWithoutBattle, setEncounterExp, updatePlayerMoney, } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { modifierTypes } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { Species } from "#enums/species"; @@ -14,6 +14,7 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import i18next from "i18next"; /** the i18n namespace for this encounter */ const namespace = "mysteryEncounters/anOfferYouCantRefuse"; @@ -98,6 +99,8 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = } } + const shinyCharm = generateModifierType(scene, modifierTypes.SHINY_CHARM); + encounter.setDialogueToken("itemName", shinyCharm?.name ?? i18next.t("modifierType:ModifierType.SHINY_CHARM.name")); encounter.setDialogueToken("liepardName", getPokemonSpecies(Species.LIEPARD).getName()); return true; @@ -123,7 +126,7 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = return true; }) .withOptionPhase(async (scene: BattleScene) => { - // Give the player a Shiny charm + // Give the player a Shiny Charm scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.SHINY_CHARM)); leaveEncounterWithoutBattle(scene, true); }) @@ -132,9 +135,11 @@ export const AnOfferYouCantRefuseEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( - new MoveRequirement(EXTORTION_MOVES), - new AbilityRequirement(EXTORTION_ABILITIES)) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new MoveRequirement(EXTORTION_MOVES, true), + new AbilityRequirement(EXTORTION_ABILITIES, true) + ) ) .withDialogue({ buttonLabel: `${namespace}:option.2.label`, diff --git a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts index b5d47cf6912..e24eadb56c7 100644 --- a/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts +++ b/src/data/mystery-encounters/encounters/bug-type-superfan-encounter.ts @@ -42,6 +42,8 @@ import { AttackTypeBoosterModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, + GigantamaxAccessModifier, + MegaEvolutionAccessModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import i18next from "i18next"; @@ -191,12 +193,14 @@ const WAVE_LEVEL_BREAKPOINTS = [ 30, 50, 70, 100, 120, 140, 160 ]; export const BugTypeSuperfanEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.BUG_TYPE_SUPERFAN) .withEncounterTier(MysteryEncounterTier.GREAT) - .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( - // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1), - new TypeRequirement(Type.BUG, false, 1) - )) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must have at least 1 Bug type on team, OR have a bug item somewhere on the team + new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), + new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1), + new TypeRequirement(Type.BUG, false, 1) + ) + ) .withMaxAllowedEncounters(1) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withIntroSpriteConfigs([]) // These are set in onInit() @@ -356,10 +360,17 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = }, ]; } else { - // If player has any evolution/form change items that are valid for their party, will spawn one of those items in addition to a Master Ball - const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)!, generateModifierTypeOption(scene, modifierTypes.MAX_LURE)! ]; + // If the player has any evolution/form change items that are valid for their party, + // spawn one of those items in addition to Dynamax Band, Mega Band, and Master Ball + const modifierOptions: ModifierTypeOption[] = [ generateModifierTypeOption(scene, modifierTypes.MASTER_BALL)! ]; const specialOptions: ModifierTypeOption[] = []; + if (!scene.findModifier(m => m instanceof MegaEvolutionAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.MEGA_BRACELET)!); + } + if (!scene.findModifier(m => m instanceof GigantamaxAccessModifier)) { + modifierOptions.push(generateModifierTypeOption(scene, modifierTypes.DYNAMAX_BAND)!); + } const nonRareEvolutionModifier = generateModifierTypeOption(scene, modifierTypes.EVOLUTION_ITEM); if (nonRareEvolutionModifier) { specialOptions.push(nonRareEvolutionModifier); @@ -396,11 +407,13 @@ export const BugTypeSuperfanEncounter: MysteryEncounter = .build()) .withOption(MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_DEFAULT) - .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( - // Meets one or both of the below reqs - new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), - new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1) - )) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Meets one or both of the below reqs + new HeldItemRequirement([ "BypassSpeedChanceModifier", "ContactHeldItemTransferChanceModifier" ], 1), + new AttackTypeBoosterHeldItemTypeRequirement(Type.BUG, 1) + ) + ) .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts index be52ab42c9d..0a88c5a699c 100644 --- a/src/data/mystery-encounters/encounters/clowning-around-encounter.ts +++ b/src/data/mystery-encounters/encounters/clowning-around-encounter.ts @@ -1,7 +1,7 @@ import { EnemyPartyConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, loadCustomMovesForEncounter, selectPokemonForOption, setEncounterRewards, transitionMysteryEncounterIntroVisuals } from "#app/data/mystery-encounters/utils/encounter-phase-utils"; import { trainerConfigs, TrainerPartyCompoundTemplate, TrainerPartyTemplate, } from "#app/data/trainer-config"; import { ModifierTier } from "#app/modifier/modifier-tier"; -import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; +import { ModifierPoolType, modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { PartyMemberStrength } from "#enums/party-member-strength"; import BattleScene from "#app/battle-scene"; @@ -11,7 +11,7 @@ import { Species } from "#enums/species"; import { TrainerType } from "#enums/trainer-type"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Abilities } from "#enums/abilities"; -import { applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { applyAbilityOverrideToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { Type } from "#app/data/type"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; @@ -28,7 +28,7 @@ import { BattlerIndex } from "#app/battle"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; import { MoveCategory } from "#app/data/move"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { EncounterAnim } from "#enums/encounter-anims"; import { Challenges } from "#enums/challenges"; @@ -133,7 +133,7 @@ export const ClowningAroundEncounter: MysteryEncounter = }, { // Blacephalon has the random ability from pool, and 2 entirely random types to fit with the theme of the encounter species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ ability: ability, types: [ randSeedInt(18), randSeedInt(18) ]}), + customPokemonData: new CustomPokemonData({ ability: ability, types: [ randSeedInt(18), randSeedInt(18) ]}), isBoss: true, moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] }, @@ -280,7 +280,7 @@ export const ClowningAroundEncounter: MysteryEncounter = let numRogue = 0; items.filter(m => m.isTransferable && !(m instanceof BerryModifier)) .forEach(m => { - const type = m.type.withTierFromPool(); + const type = m.type.withTierFromPool(ModifierPoolType.PLAYER, party); const tier = type.tier ?? ModifierTier.ULTRA; if (type.id === "GOLDEN_EGG" || tier === ModifierTier.ROGUE) { numRogue += m.stackCount; @@ -353,15 +353,15 @@ export const ClowningAroundEncounter: MysteryEncounter = newTypes.push(secondType); // Apply the type changes (to both base and fusion, if pokemon is fused) - if (!pokemon.mysteryEncounterPokemonData) { - pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); } - pokemon.mysteryEncounterPokemonData.types = newTypes; + pokemon.customPokemonData.types = newTypes; if (pokemon.isFusion()) { - if (!pokemon.fusionMysteryEncounterPokemonData) { - pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); } - pokemon.fusionMysteryEncounterPokemonData.types = newTypes; + pokemon.fusionCustomPokemonData.types = newTypes; } } }) @@ -425,17 +425,8 @@ function onYesAbilitySwap(scene: BattleScene, resolve) { const onPokemonSelected = (pokemon: PlayerPokemon) => { // Do ability swap const encounter = scene.currentBattle.mysteryEncounter!; - if (pokemon.isFusion()) { - if (!pokemon.fusionMysteryEncounterPokemonData) { - pokemon.fusionMysteryEncounterPokemonData = new MysteryEncounterPokemonData(); - } - pokemon.fusionMysteryEncounterPokemonData.ability = encounter.misc.ability; - } else { - if (!pokemon.mysteryEncounterPokemonData) { - pokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); - } - pokemon.mysteryEncounterPokemonData.ability = encounter.misc.ability; - } + + applyAbilityOverrideToPokemon(pokemon, encounter.misc.ability); encounter.setDialogueToken("chosenPokemon", pokemon.getNameToRender()); scene.ui.setMode(Mode.MESSAGE).then(() => resolve(true)); }; diff --git a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts index d7f71194f48..55d7ce0e92d 100644 --- a/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts +++ b/src/data/mystery-encounters/encounters/dancing-lessons-encounter.ts @@ -236,7 +236,7 @@ export const DancingLessonsEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(DANCING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts index 7f199b5487c..8a814b58248 100644 --- a/src/data/mystery-encounters/encounters/dark-deal-encounter.ts +++ b/src/data/mystery-encounters/encounters/dark-deal-encounter.ts @@ -14,6 +14,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { ModifierRewardPhase } from "#app/phases/modifier-reward-phase"; import { PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { Challenges } from "#enums/challenges"; /** i18n namespace for encounter */ const namespace = "mysteryEncounters/darkDeal"; @@ -141,6 +142,7 @@ export const DarkDealEncounter: MysteryEncounter = // Removes random pokemon (including fainted) from party and adds name to dialogue data tokens // Will never return last battle able mon and instead pick fainted/unable to battle const removedPokemon = getRandomPlayerPokemon(scene, true, false, true); + // Get all the pokemon's held items const modifiers = removedPokemon.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); scene.removePokemonFromPlayerParty(removedPokemon); @@ -160,7 +162,13 @@ export const DarkDealEncounter: MysteryEncounter = scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.ROGUE_BALL)); // Start encounter with random legendary (7-10 starter strength) that has level additive - const bossTypes: Type[] = encounter.misc.removedTypes; + // If this is a mono-type challenge, always ensure the required type is filtered for + let bossTypes: Type[] = encounter.misc.removedTypes; + const singleTypeChallenges = scene.gameMode.challenges.filter(c => c.value && c.id === Challenges.SINGLE_TYPE); + if (scene.gameMode.isChallenge && singleTypeChallenges.length > 0) { + bossTypes = singleTypeChallenges.map(c => (c.value - 1) as Type); + } + const bossModifiers: PokemonHeldItemModifier[] = encounter.misc.modifiers; // Starter egg tier, 35/50/10/5 %odds for tiers 6/7/8/9+ const roll = randSeedInt(100); @@ -172,7 +180,8 @@ export const DarkDealEncounter: MysteryEncounter = isBoss: true, modifierConfigs: bossModifiers.map(m => { return { - modifier: m + modifier: m, + stackCount: m.getStackCount(), }; }) }; diff --git a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts index 5686d0f6ce5..d5f9388b56c 100644 --- a/src/data/mystery-encounters/encounters/delibirdy-encounter.ts +++ b/src/data/mystery-encounters/encounters/delibirdy-encounter.ts @@ -45,10 +45,13 @@ export const DelibirdyEncounter: MysteryEncounter = .withEncounterTier(MysteryEncounterTier.GREAT) .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) .withSceneRequirement(new MoneyRequirement(0, DELIBIRDY_MONEY_PRICE_MULTIPLIER)) // Must have enough money for it to spawn at the very least - .withPrimaryPokemonRequirement(new CombinationPokemonRequirement( // Must also have either option 2 or 3 available to spawn - new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), - new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true) - )) + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + // Must also have either option 2 or 3 available to spawn + new HeldItemRequirement(OPTION_2_ALLOWED_MODIFIERS), + new HeldItemRequirement(OPTION_3_DISALLOWED_MODIFIERS, 1, true) + ) + ) .withIntroSpriteConfigs([ { spriteKey: "", @@ -196,7 +199,7 @@ export const DelibirdyEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter!; const modifier: BerryModifier | HealingBoosterModifier = encounter.misc.chosenModifier; - // Give the player a Candy Jar if they gave a Berry, and a Healing Charm for Reviver Seed + // Give the player a Candy Jar if they gave a Berry, and a Berry Pouch for Reviver Seed if (modifier instanceof BerryModifier) { // Check if the player has max stacks of that Candy Jar already const existing = scene.findModifier(m => m instanceof LevelIncrementBoosterModifier) as LevelIncrementBoosterModifier; @@ -211,8 +214,8 @@ export const DelibirdyEncounter: MysteryEncounter = scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.CANDY_JAR)); } } else { - // Check if the player has max stacks of that Healing Charm already - const existing = scene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; + // Check if the player has max stacks of that Berry Pouch already + const existing = scene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead @@ -221,7 +224,7 @@ export const DelibirdyEncounter: MysteryEncounter = scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); } } @@ -290,8 +293,8 @@ export const DelibirdyEncounter: MysteryEncounter = const encounter = scene.currentBattle.mysteryEncounter!; const modifier = encounter.misc.chosenModifier; - // Check if the player has max stacks of Berry Pouch already - const existing = scene.findModifier(m => m instanceof PreserveBerryModifier) as PreserveBerryModifier; + // Check if the player has max stacks of Healing Charm already + const existing = scene.findModifier(m => m instanceof HealingBoosterModifier) as HealingBoosterModifier; if (existing && existing.getStackCount() >= existing.getMaxStackCount(scene)) { // At max stacks, give the first party pokemon a Shell Bell instead @@ -300,7 +303,7 @@ export const DelibirdyEncounter: MysteryEncounter = scene.playSound("item_fanfare"); await showEncounterText(scene, i18next.t("battle:rewardGain", { modifierName: shellBell.name }), null, undefined, true); } else { - scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.BERRY_POUCH)); + scene.unshiftPhase(new ModifierRewardPhase(scene, modifierTypes.HEALING_CHARM)); } // Remove the modifier if its stacks go to 0 diff --git a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts index d306206159a..5c16e5d8564 100644 --- a/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts +++ b/src/data/mystery-encounters/encounters/fiery-fallout-encounter.ts @@ -4,24 +4,30 @@ import { AttackTypeBoosterModifierType, modifierTypes, } from "#app/modifier/mod import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import BattleScene from "#app/battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; -import { TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; +import { AbilityRequirement, CombinationPokemonRequirement, TypeRequirement } from "#app/data/mystery-encounters/mystery-encounter-requirements"; import { Species } from "#enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { Gender } from "#app/data/gender"; import { Type } from "#app/data/type"; import { BattlerIndex } from "#app/battle"; -import { PokemonMove } from "#app/field/pokemon"; +import Pokemon, { PokemonMove } from "#app/field/pokemon"; import { Moves } from "#enums/moves"; import { EncounterBattleAnim } from "#app/data/battle-anims"; import { WeatherType } from "#app/data/weather"; import { isNullOrUndefined, randSeedInt } from "#app/utils"; import { StatusEffect } from "#app/data/status-effect"; import { queueEncounterMessage } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; +import { applyAbilityOverrideToPokemon, applyDamageToPokemon, applyModifierTypeToPlayerPokemon } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { EncounterAnim } from "#enums/encounter-anims"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; +import { Stat } from "#enums/stat"; +import { Ability } from "#app/data/ability"; +import { FIRE_RESISTANT_ABILITIES } from "#app/data/mystery-encounters/requirements/requirement-groups"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/fieryFallout"; @@ -62,16 +68,24 @@ export const FieryFalloutEncounter: MysteryEncounter = { species: volcaronaSpecies, isBoss: false, - gender: Gender.MALE + gender: Gender.MALE, + tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); + } }, { species: volcaronaSpecies, isBoss: false, - gender: Gender.FEMALE + gender: Gender.FEMALE, + tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + mysteryEncounterBattleEffects: (pokemon: Pokemon) => { + pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF, Stat.SPD ], 1)); + } } ], doubleBattle: true, - disableSwitch: true + disableSwitch: true, }; encounter.enemyPartyConfigs = [ config ]; @@ -139,7 +153,7 @@ export const FieryFalloutEncounter: MysteryEncounter = async (scene: BattleScene) => { // Pick battle const encounter = scene.currentBattle.mysteryEncounter!; - setEncounterRewards(scene, { fillRemaining: true }, undefined, () => giveLeadPokemonCharcoal(scene)); + setEncounterRewards(scene, { fillRemaining: true }, undefined, () => giveLeadPokemonAttackTypeBoostItem(scene)); encounter.startOfBattleEffects.push( { @@ -153,18 +167,6 @@ export const FieryFalloutEncounter: MysteryEncounter = targets: [ BattlerIndex.PLAYER_2 ], move: new PokemonMove(Moves.FIRE_SPIN), ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY, - targets: [ BattlerIndex.ENEMY ], - move: new PokemonMove(Moves.QUIVER_DANCE), - ignorePp: true - }, - { - sourceBattlerIndex: BattlerIndex.ENEMY_2, - targets: [ BattlerIndex.ENEMY_2 ], - move: new PokemonMove(Moves.QUIVER_DANCE), - ignorePp: true }); await initBattleWithEnemyConfig(scene, scene.currentBattle.mysteryEncounter!.enemyPartyConfigs[0]); } @@ -180,7 +182,7 @@ export const FieryFalloutEncounter: MysteryEncounter = ], }, async (scene: BattleScene) => { - // Damage non-fire types and burn 1 random non-fire type member + // Damage non-fire types and burn 1 random non-fire type member + give it Heatproof const encounter = scene.currentBattle.mysteryEncounter!; const nonFireTypes = scene.getParty().filter((p) => p.isAllowedInBattle() && !p.getTypes().includes(Type.FIRE)); @@ -198,7 +200,11 @@ export const FieryFalloutEncounter: MysteryEncounter = if (chosenPokemon.trySetStatus(StatusEffect.BURN)) { // Burn applied encounter.setDialogueToken("burnedPokemon", chosenPokemon.getNameToRender()); + encounter.setDialogueToken("abilityName", new Ability(Abilities.HEATPROOF, 3).name); queueEncounterMessage(scene, `${namespace}:option.2.target_burned`); + + // Also permanently change the burned Pokemon's ability to Heatproof + applyAbilityOverrideToPokemon(chosenPokemon, Abilities.HEATPROOF); } } @@ -209,8 +215,12 @@ export const FieryFalloutEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3PrimaryName dialogue token automatically - .withSecondaryPokemonRequirement(new TypeRequirement(Type.FIRE, true, 1)) // Will set option3SecondaryName dialogue token automatically + .withPrimaryPokemonRequirement( + CombinationPokemonRequirement.Some( + new TypeRequirement(Type.FIRE, true, 1), + new AbilityRequirement(FIRE_RESISTANT_ABILITIES, true) + ) + ) // Will set option3PrimaryName dialogue token automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, @@ -233,26 +243,32 @@ export const FieryFalloutEncounter: MysteryEncounter = { fillRemaining: true }, undefined, () => { - giveLeadPokemonCharcoal(scene); + giveLeadPokemonAttackTypeBoostItem(scene); }); const primary = encounter.options[2].primaryPokemon!; - const secondary = encounter.options[2].secondaryPokemon![0]; - setEncounterExp(scene, [ primary.id, secondary.id ], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); + setEncounterExp(scene, [ primary.id ], getPokemonSpecies(Species.VOLCARONA).baseExp * 2); leaveEncounterWithoutBattle(scene); }) .build() ) .build(); -function giveLeadPokemonCharcoal(scene: BattleScene) { - // Give first party pokemon Charcoal for free at end of battle +function giveLeadPokemonAttackTypeBoostItem(scene: BattleScene) { + // Give first party pokemon attack type boost item for free at end of battle const leadPokemon = scene.getParty()?.[0]; if (leadPokemon) { - const charcoal = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FIRE ]) as AttackTypeBoosterModifierType; - applyModifierTypeToPlayerPokemon(scene, leadPokemon, charcoal); - scene.currentBattle.mysteryEncounter!.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); - queueEncounterMessage(scene, `${namespace}:found_charcoal`); + // Generate type booster held item, default to Charcoal if item fails to generate + let boosterModifierType = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER) as AttackTypeBoosterModifierType; + if (!boosterModifierType) { + boosterModifierType = generateModifierType(scene, modifierTypes.ATTACK_TYPE_BOOSTER, [ Type.FIRE ]) as AttackTypeBoosterModifierType; + } + applyModifierTypeToPlayerPokemon(scene, leadPokemon, boosterModifierType); + + const encounter = scene.currentBattle.mysteryEncounter!; + encounter.setDialogueToken("itemName", boosterModifierType.name); + encounter.setDialogueToken("leadPokemon", leadPokemon.getNameToRender()); + queueEncounterMessage(scene, `${namespace}:found_item`); } } diff --git a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts index 380662ca817..889868519d2 100644 --- a/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts +++ b/src/data/mystery-encounters/encounters/fight-or-flight-encounter.ts @@ -145,7 +145,7 @@ export const FightOrFlightEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.2.label`, buttonTooltip: `${namespace}:option.2.tooltip`, diff --git a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts index f282064bb94..7fdd29d36a2 100644 --- a/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts +++ b/src/data/mystery-encounters/encounters/mysterious-challengers-encounter.ts @@ -56,7 +56,13 @@ export const MysteriousChallengersEncounter: MysteryEncounter = // Hard difficulty trainer is another random trainer, but with AVERAGE_BALANCED config // Number of mons is based off wave: 1-20 is 2, 20-40 is 3, etc. capping at 6 after wave 100 - const hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); + let retries = 0; + let hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); + while (retries < 5 && hardTrainerType === normalTrainerType) { + // Will try to use a different trainer from the normal trainer type + hardTrainerType = scene.arena.randomTrainerType(scene.currentBattle.waveIndex); + retries++; + } const hardTemplate = new TrainerPartyCompoundTemplate( new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER, false, true), new TrainerPartyTemplate( diff --git a/src/data/mystery-encounters/encounters/part-timer-encounter.ts b/src/data/mystery-encounters/encounters/part-timer-encounter.ts index 17a3a366569..092d2ab2673 100644 --- a/src/data/mystery-encounters/encounters/part-timer-encounter.ts +++ b/src/data/mystery-encounters/encounters/part-timer-encounter.ts @@ -227,7 +227,7 @@ export const PartTimerEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option3PrimaryName and option3PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts index 5b609a2b1c3..8dd730492b1 100644 --- a/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts +++ b/src/data/mystery-encounters/encounters/shady-vitamin-dealer-encounter.ts @@ -21,7 +21,7 @@ import i18next from "i18next"; const namespace = "mysteryEncounters/shadyVitaminDealer"; const VITAMIN_DEALER_CHEAP_PRICE_MULTIPLIER = 1.5; -const VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER = 3.5; +const VITAMIN_DEALER_EXPENSIVE_PRICE_MULTIPLIER = 5; /** * Shady Vitamin Dealer encounter. @@ -138,7 +138,7 @@ export const ShadyVitaminDealerEncounter: MysteryEncounter = newNature = randSeedInt(25) as Nature; } - chosenPokemon.nature = newNature; + chosenPokemon.customPokemonData.nature = newNature; encounter.setDialogueToken("newNature", getNatureName(newNature)); queueEncounterMessage(scene, `${namespace}:cheap_side_effects`); setEncounterExp(scene, [ chosenPokemon.id ], 100); diff --git a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts index 3a4bf465a78..8ea19e1225b 100644 --- a/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts +++ b/src/data/mystery-encounters/encounters/slumbering-snorlax-encounter.ts @@ -18,7 +18,7 @@ import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode import { PartyHealPhase } from "#app/phases/party-heal-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { BerryType } from "#enums/berry-type"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; /** i18n namespace for the encounter */ const namespace = "mysteryEncounters/slumberingSnorlax"; @@ -72,7 +72,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = stackCount: 2 }, ], - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), aiType: AiType.SMART // Required to ensure Snorlax uses Sleep Talk while it is asleep }; const config: EnemyPartyConfig = { @@ -143,7 +143,7 @@ export const SlumberingSnorlaxEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES)) + .withPrimaryPokemonRequirement(new MoveRequirement(STEALING_MOVES, true)) .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts index 945e7ee188d..610209f8aad 100644 --- a/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-expert-pokemon-breeder-encounter.ts @@ -25,6 +25,7 @@ import { achvs } from "#app/system/achv"; import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import { Type } from "#app/data/type"; import { getPokeballTintColor } from "#app/data/pokeball"; +import { PokemonHeldItemModifier } from "#app/modifier/modifier"; /** the i18n namespace for the encounter */ const namespace = "mysteryEncounters/theExpertPokemonBreeder"; @@ -163,7 +164,7 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = if (pokemon2CommonEggs > 0) { const eggsText = i18next.t(`${namespace}:numEggs`, { count: pokemon2CommonEggs, rarity: i18next.t("egg:defaultTier") }); pokemon2Tooltip += i18next.t(`${namespace}:eggs_tooltip`, { eggs: eggsText }); - encounter.setDialogueToken("pokemon1CommonEggs", eggsText); + encounter.setDialogueToken("pokemon2CommonEggs", eggsText); } encounter.options[1].dialogue!.buttonTooltip = pokemon2Tooltip; @@ -221,7 +222,10 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon1; encounter.setDialogueToken("chosenPokemon", pokemon1.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon1CommonEggs, pokemon1RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, + { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, + eggOptions, + () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon1); @@ -247,9 +251,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOption( @@ -273,7 +274,10 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon2; encounter.setDialogueToken("chosenPokemon", pokemon2.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon2CommonEggs, pokemon2RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, + { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, + eggOptions, + () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon2); @@ -299,9 +303,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOption( @@ -325,7 +326,10 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.misc.chosenPokemon = pokemon3; encounter.setDialogueToken("chosenPokemon", pokemon3.getNameToRender()); const eggOptions = getEggOptions(scene, pokemon3CommonEggs, pokemon3RareEggs); - setEncounterRewards(scene, { fillRemaining: true }, eggOptions); + setEncounterRewards(scene, + { guaranteedModifierTypeFuncs: [ modifierTypes.SOOTHE_BELL ], fillRemaining: true }, + eggOptions, + () => doPostEncounterCleanup(scene)); // Remove all Pokemon from the party except the chosen Pokemon removePokemonFromPartyAndStoreHeldItems(scene, encounter, pokemon3); @@ -351,9 +355,6 @@ export const TheExpertPokemonBreederEncounter: MysteryEncounter = encounter.onGameOver = onGameOver; await initBattleWithEnemyConfig(scene, config); }) - .withPostOptionPhase(async (scene: BattleScene) => { - await doPostEncounterCleanup(scene); - }) .build() ) .withOutroDialogue([ @@ -462,12 +463,16 @@ function calculateEggRewardsForPokemon(pokemon: PlayerPokemon): [number, number] } // Maximum of 30 points - const totalPoints = Math.min(pointsFromStarterTier + pointsFromBst, 30); + let totalPoints = Math.min(pointsFromStarterTier + pointsFromBst, 30); - // 1 Rare egg for every 6 points - const numRares = Math.floor(totalPoints / 6); + // First 5 points go to Common eggs + let numCommons = Math.min(totalPoints, 5); + totalPoints -= numCommons; + + // Then, 1 Rare egg for every 4 points + const numRares = Math.floor(totalPoints / 4); // 1 Common egg for every point leftover - const numCommons = totalPoints % 6; + numCommons += totalPoints % 4; return [ numCommons, numRares ]; } @@ -521,19 +526,19 @@ function checkAchievement(scene: BattleScene) { } } -async function restorePartyAndHeldItems(scene: BattleScene) { +function restorePartyAndHeldItems(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; // Restore original party scene.getParty().push(...encounter.misc.originalParty); // Restore held items const originalHeldItems = encounter.misc.originalPartyHeldItems; - originalHeldItems.forEach(pokemonHeldItemsList => { + originalHeldItems.forEach((pokemonHeldItemsList: PokemonHeldItemModifier[]) => { pokemonHeldItemsList.forEach(heldItem => { scene.addModifier(heldItem, true, false, false, true); }); }); - await scene.updateModifiers(true); + scene.updateModifiers(true); } function onGameOver(scene: BattleScene) { @@ -609,13 +614,13 @@ function onGameOver(scene: BattleScene) { return false; } -async function doPostEncounterCleanup(scene: BattleScene) { +function doPostEncounterCleanup(scene: BattleScene) { const encounter = scene.currentBattle.mysteryEncounter!; if (!encounter.misc.encounterFailed) { // Give achievement if in Space biome checkAchievement(scene); // Give 20 friendship to the chosen pokemon encounter.misc.chosenPokemon.addFriendship(FRIENDSHIP_ADDED); - await restorePartyAndHeldItems(scene); + restorePartyAndHeldItems(scene); } } diff --git a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts index 03cf86d06a5..397d2af9522 100644 --- a/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts +++ b/src/data/mystery-encounters/encounters/the-strong-stuff-encounter.ts @@ -14,7 +14,7 @@ import { BattlerIndex } from "#app/battle"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { Stat } from "#enums/stat"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; @@ -79,7 +79,7 @@ export const TheStrongStuffEncounter: MysteryEncounter = species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], modifierConfigs: [ diff --git a/src/data/mystery-encounters/encounters/training-session-encounter.ts b/src/data/mystery-encounters/encounters/training-session-encounter.ts index 9f80bbbffde..03341a713f2 100644 --- a/src/data/mystery-encounters/encounters/training-session-encounter.ts +++ b/src/data/mystery-encounters/encounters/training-session-encounter.ts @@ -37,6 +37,7 @@ export const TrainingSessionEncounter: MysteryEncounter = .withScenePartySizeRequirement(2, 6, true) // Must have at least 2 unfainted pokemon in party .withFleeAllowed(false) .withHideWildIntroMessage(true) + .withPreventGameStatsUpdates(true) // Do not count the Pokemon as seen or defeated since it is ours .withIntroSpriteConfigs([ { spriteKey: "training_session_gear", diff --git a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts index 2b3b38b2164..d3c16ce2122 100644 --- a/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts +++ b/src/data/mystery-encounters/encounters/trash-to-treasure-encounter.ts @@ -71,7 +71,7 @@ export const TrashToTreasureEncounter: MysteryEncounter = moveSet: [ Moves.PAYBACK, Moves.GUNK_SHOT, Moves.STOMPING_TANTRUM, Moves.DRAIN_PUNCH ] }; const config: EnemyPartyConfig = { - levelAdditiveModifier: 1, + levelAdditiveModifier: 0.5, pokemonConfigs: [ pokemonConfig ], disableSwitch: true }; diff --git a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts index 13594f273d9..b7ce3bab48c 100644 --- a/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts +++ b/src/data/mystery-encounters/encounters/uncommon-breed-encounter.ts @@ -210,7 +210,7 @@ export const UncommonBreedEncounter: MysteryEncounter = .withOption( MysteryEncounterOptionBuilder .newOptionWithMode(MysteryEncounterOptionMode.DISABLED_OR_SPECIAL) - .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically + .withPrimaryPokemonRequirement(new MoveRequirement(CHARMING_MOVES, true)) // Will set option2PrimaryName and option2PrimaryMove dialogue tokens automatically .withDialogue({ buttonLabel: `${namespace}:option.3.label`, buttonTooltip: `${namespace}:option.3.tooltip`, diff --git a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts index 6e2f8352480..2ecba6ce658 100644 --- a/src/data/mystery-encounters/encounters/weird-dream-encounter.ts +++ b/src/data/mystery-encounters/encounters/weird-dream-encounter.ts @@ -4,23 +4,30 @@ import { Species } from "#enums/species"; import BattleScene from "#app/battle-scene"; import MysteryEncounter, { MysteryEncounterBuilder } from "#app/data/mystery-encounters/mystery-encounter"; import { MysteryEncounterOptionBuilder } from "#app/data/mystery-encounters/mystery-encounter-option"; -import { leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; +import { EnemyPartyConfig, EnemyPokemonConfig, generateModifierType, initBattleWithEnemyConfig, leaveEncounterWithoutBattle, setEncounterRewards, } from "../utils/encounter-phase-utils"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; -import { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; +import Pokemon, { PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { IntegerHolder, isNullOrUndefined, randSeedInt, randSeedShuffle } from "#app/utils"; import PokemonSpecies, { allSpecies, getPokemonSpecies } from "#app/data/pokemon-species"; import { HiddenAbilityRateBoosterModifier, PokemonFormChangeItemModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { achvs } from "#app/system/achv"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { showEncounterText } from "#app/data/mystery-encounters/utils/encounter-dialogue-utils"; -import { modifierTypes } from "#app/modifier/modifier-type"; +import { modifierTypes, PokemonHeldItemModifierType } from "#app/modifier/modifier-type"; import i18next from "#app/plugins/i18n"; import { doPokemonTransformationSequence, TransformationScreenPosition } from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat } from "#enums/stat"; -import { CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES } from "#app/game-mode"; import { Challenges } from "#enums/challenges"; +import { ModifierTier } from "#app/modifier/modifier-tier"; +import { PlayerGender } from "#enums/player-gender"; +import { TrainerType } from "#enums/trainer-type"; +import PokemonData from "#app/system/pokemon-data"; +import { Nature } from "#enums/nature"; +import HeldModifierConfig from "#app/interfaces/held-modifier-config"; +import { trainerConfigs, TrainerPartyTemplate } from "#app/data/trainer-config"; +import { PartyMemberStrength } from "#enums/party-member-strength"; /** i18n namespace for encounter */ const namespace = "mysteryEncounters/weirdDream"; @@ -80,10 +87,11 @@ const EXCLUDED_TRANSFORMATION_SPECIES = [ const SUPER_LEGENDARY_BST_THRESHOLD = 600; const NON_LEGENDARY_BST_THRESHOLD = 570; -const GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD = 450; + +const OLD_GATEAU_STATS_UP = 20; /** 0-100 */ -const PERCENT_LEVEL_LOSS_ON_REFUSE = 12.5; +const PERCENT_LEVEL_LOSS_ON_REFUSE = 10; /** * Value ranges of the resulting species BST transformations after adding values to original species @@ -105,7 +113,8 @@ export const WeirdDreamEncounter: MysteryEncounter = MysteryEncounterBuilder.withEncounterType(MysteryEncounterType.WEIRD_DREAM) .withEncounterTier(MysteryEncounterTier.ROGUE) .withDisallowedChallenges(Challenges.SINGLE_TYPE, Challenges.SINGLE_GENERATION) - .withSceneWaveRangeRequirement(...CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES) + // TODO: should reset minimum wave to 10 when there are more Rogue tiers in pool. Matching Dark Deal minimum for now. + .withSceneWaveRangeRequirement(30, 140) .withIntroSpriteConfigs([ { spriteKey: "weird_dream_woman", @@ -131,6 +140,15 @@ export const WeirdDreamEncounter: MysteryEncounter = .withQuery(`${namespace}:query`) .withOnInit((scene: BattleScene) => { scene.loadBgm("mystery_encounter_weird_dream", "mystery_encounter_weird_dream.mp3"); + + // Calculate all the newly transformed Pokemon and begin asset load + const teamTransformations = getTeamTransformations(scene); + const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); + scene.currentBattle.mysteryEncounter!.misc = { + teamTransformations, + loadAssets + }; + return true; }) .withOnVisualsStart((scene: BattleScene) => { @@ -156,13 +174,10 @@ export const WeirdDreamEncounter: MysteryEncounter = doShowDreamBackground(scene); }); - // Calculate all the newly transformed Pokemon and begin asset load - const teamTransformations = getTeamTransformations(scene); - const loadAssets = teamTransformations.map(t => (t.newPokemon as PlayerPokemon).loadAssets()); - scene.currentBattle.mysteryEncounter!.misc = { - teamTransformations, - loadAssets - }; + for (const transformation of scene.currentBattle.mysteryEncounter!.misc.teamTransformations) { + scene.removePokemonFromPlayerParty(transformation.previousPokemon, false); + scene.getParty().push(transformation.newPokemon); + } }) .withOptionPhase(async (scene: BattleScene) => { // Starts cutscene dialogue, but does not await so that cutscene plays as player goes through dialogue @@ -193,7 +208,7 @@ export const WeirdDreamEncounter: MysteryEncounter = await showEncounterText(scene, `${namespace}:option.1.dream_complete`); await doNewTeamPostProcess(scene, transformations); - setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.ROGUE_BALL, modifierTypes.MINT, modifierTypes.MINT ]}); + setEncounterRewards(scene, { guaranteedModifierTypeFuncs: [ modifierTypes.MEMORY_MUSHROOM, modifierTypes.ROGUE_BALL, modifierTypes.MINT, modifierTypes.MINT, modifierTypes.MINT ], fillRemaining: false }); leaveEncounterWithoutBattle(scene, true); }) .build() @@ -209,7 +224,88 @@ export const WeirdDreamEncounter: MysteryEncounter = ], }, async (scene: BattleScene) => { - // Reduce party levels by 20% + // Battle your "future" team for some item rewards + const transformations: PokemonTransformation[] = scene.currentBattle.mysteryEncounter!.misc.teamTransformations; + + // Uses the pokemon that player's party would have transformed into + const enemyPokemonConfigs: EnemyPokemonConfig[] = []; + for (const transformation of transformations) { + const newPokemon = transformation.newPokemon; + const previousPokemon = transformation.previousPokemon; + + await postProcessTransformedPokemon(scene, previousPokemon, newPokemon, newPokemon.species.getRootSpeciesId(), true); + + const dataSource = new PokemonData(newPokemon); + dataSource.player = false; + + // Copy held items to new pokemon + const newPokemonHeldItemConfigs: HeldModifierConfig[] = []; + for (const item of transformation.heldItems) { + newPokemonHeldItemConfigs.push({ + modifier: item.clone() as PokemonHeldItemModifier, + stackCount: item.getStackCount(), + isTransferable: false + }); + } + // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats + if (shouldGetOldGateau(newPokemon)) { + const stats = getOldGateauBoostedStats(newPokemon); + newPokemonHeldItemConfigs.push({ + modifier: generateModifierType(scene, modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU, [ OLD_GATEAU_STATS_UP, stats ]) as PokemonHeldItemModifierType, + stackCount: 1, + isTransferable: false + }); + } + + const enemyConfig: EnemyPokemonConfig = { + species: transformation.newSpecies, + isBoss: newPokemon.getSpeciesForm().getBaseStatTotal() > NON_LEGENDARY_BST_THRESHOLD, + level: previousPokemon.level, + dataSource: dataSource, + modifierConfigs: newPokemonHeldItemConfigs + }; + + enemyPokemonConfigs.push(enemyConfig); + } + + const genderIndex = scene.gameData.gender ?? PlayerGender.UNSET; + const trainerConfig = trainerConfigs[genderIndex === PlayerGender.FEMALE ? TrainerType.FUTURE_SELF_F : TrainerType.FUTURE_SELF_M].clone(); + trainerConfig.setPartyTemplates(new TrainerPartyTemplate(transformations.length, PartyMemberStrength.STRONG)); + const enemyPartyConfig: EnemyPartyConfig = { + trainerConfig: trainerConfig, + pokemonConfigs: enemyPokemonConfigs, + female: genderIndex === PlayerGender.FEMALE + }; + + const onBeforeRewards = () => { + // Before battle rewards, unlock the passive on a pokemon in the player's team for the rest of the run (not permanently) + // One random pokemon will get its passive unlocked + const passiveDisabledPokemon = scene.getParty().filter(p => !p.passive); + if (passiveDisabledPokemon?.length > 0) { + const enablePassiveMon = passiveDisabledPokemon[randSeedInt(passiveDisabledPokemon.length)]; + enablePassiveMon.passive = true; + enablePassiveMon.updateInfo(true); + } + }; + + setEncounterRewards(scene, { guaranteedModifierTiers: [ ModifierTier.ROGUE, ModifierTier.ROGUE, ModifierTier.ULTRA, ModifierTier.ULTRA, ModifierTier.GREAT, ModifierTier.GREAT ], fillRemaining: false }, undefined, onBeforeRewards); + + await showEncounterText(scene, `${namespace}:option.2.selected_2`, null, undefined, true); + await initBattleWithEnemyConfig(scene, enemyPartyConfig); + } + ) + .withSimpleOption( + { + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }, + async (scene: BattleScene) => { + // Leave, reduce party levels by 10% for (const pokemon of scene.getParty()) { pokemon.level = Math.max(Math.ceil((100 - PERCENT_LEVEL_LOSS_ON_REFUSE) / 100 * pokemon.level), 1); pokemon.exp = getLevelTotalExp(pokemon.level, pokemon.species.growthRate); @@ -235,7 +331,7 @@ interface PokemonTransformation { function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { const party = scene.getParty(); // Removes all pokemon from the party - const alreadyUsedSpecies: PokemonSpecies[] = []; + const alreadyUsedSpecies: PokemonSpecies[] = party.map(p => p.species); const pokemonTransformations: PokemonTransformation[] = party.map(p => { return { previousPokemon: p @@ -250,11 +346,11 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { // First, roll 2 of the party members to new Pokemon at a +90 to +110 BST difference // Then, roll the remainder of the party members at a +40 to +50 BST difference const numPokemon = party.length; + const removedPokemon = randSeedShuffle(party.slice(0)); for (let i = 0; i < numPokemon; i++) { - const removed = party[randSeedInt(party.length)]; + const removed = removedPokemon[i]; const index = pokemonTransformations.findIndex(p => p.previousPokemon.id === removed.id); pokemonTransformations[index].heldItems = removed.getHeldItems().filter(m => !(m instanceof PokemonFormChangeItemModifier)); - scene.removePokemonFromPlayerParty(removed, false); const bst = removed.calculateBaseStats().reduce((a, b) => a + b, 0); let newBstRange: [number, number]; @@ -276,14 +372,13 @@ function getTeamTransformations(scene: BattleScene): PokemonTransformation[] { pokemonTransformations[index].newSpecies = newSpecies; + console.log("New species: " + JSON.stringify(newSpecies)); alreadyUsedSpecies.push(newSpecies); } for (const transformation of pokemonTransformations) { const newAbilityIndex = randSeedInt(transformation.newSpecies.getAbilityCount()); - const newPlayerPokemon = scene.addPlayerPokemon(transformation.newSpecies, transformation.previousPokemon.level, newAbilityIndex, undefined); - transformation.newPokemon = newPlayerPokemon; - scene.getParty().push(newPlayerPokemon); + transformation.newPokemon = scene.addPlayerPokemon(transformation.newSpecies, transformation.previousPokemon.level, newAbilityIndex, undefined); } return pokemonTransformations; @@ -296,109 +391,20 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon const newPokemon = transformation.newPokemon; const speciesRootForm = newPokemon.species.getRootSpeciesId(); - // Roll HA a second time - if (newPokemon.species.abilityHidden) { - const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; - if (newPokemon.abilityIndex < hiddenIndex) { - const hiddenAbilityChance = new IntegerHolder(256); - scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); - - const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); - - if (hasHiddenAbility) { - newPokemon.abilityIndex = hiddenIndex; - } - } + if (await postProcessTransformedPokemon(scene, previousPokemon, newPokemon, speciesRootForm)) { + atLeastOneNewStarter = true; } - // Roll IVs a second time - newPokemon.ivs = newPokemon.ivs.map(iv => { - const newValue = randSeedInt(31); - return newValue > iv ? newValue : iv; - }); - - // For pokemon at/below 570 BST or any shiny pokemon, unlock it permanently as if you had caught it - if (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny()) { - if (newPokemon.getSpeciesForm().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { - scene.validateAchv(achvs.HIDDEN_ABILITY); - } - - if (newPokemon.species.subLegendary) { - scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); - } - - if (newPokemon.species.legendary) { - scene.validateAchv(achvs.CATCH_LEGENDARY); - } - - if (newPokemon.species.mythical) { - scene.validateAchv(achvs.CATCH_MYTHICAL); - } - - scene.gameData.updateSpeciesDexIvs(newPokemon.species.getRootSpeciesId(true), newPokemon.ivs); - const newStarterUnlocked = await scene.gameData.setPokemonCaught(newPokemon, true, false, false); - if (newStarterUnlocked) { - atLeastOneNewStarter = true; - await showEncounterText(scene, i18next.t("battle:addedAsAStarter", { pokemonName: getPokemonSpecies(speciesRootForm).getName() })); - } - } - - // If the previous pokemon had pokerus, transfer to new pokemon - newPokemon.pokerus = previousPokemon.pokerus; - - // Transfer previous Pokemon's luck value - newPokemon.luck = previousPokemon.getLuck(); - - // If the previous pokemon had higher IVs, override to those (after updating dex IVs > prevents perfect 31s on a new unlock) - newPokemon.ivs = newPokemon.ivs.map((iv, index) => { - return previousPokemon.ivs[index] > iv ? previousPokemon.ivs[index] : iv; - }); - - // For pokemon that the player owns (including ones just caught), gain a candy - if (!!scene.gameData.dexData[speciesRootForm].caughtAttr) { - scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1); - } - - // Set the moveset of the new pokemon to be the same as previous, but with 1 egg move and 1 (attempted) STAB move of the new species - newPokemon.generateAndPopulateMoveset(); - // Store a copy of a "standard" generated moveset for the new pokemon, will be used later for finding a favored move - const newPokemonGeneratedMoveset = newPokemon.moveset; - - newPokemon.moveset = previousPokemon.moveset; - - const newEggMoveIndex = await addEggMoveToNewPokemonMoveset(scene, newPokemon, speciesRootForm); - - // Try to add a favored STAB move (might fail if Pokemon already knows a bunch of moves from newPokemonGeneratedMoveset) - addFavoredMoveToNewPokemonMoveset(newPokemon, newPokemonGeneratedMoveset, newEggMoveIndex); - - // Randomize the second type of the pokemon - // If the pokemon does not normally have a second type, it will gain 1 - const newTypes = [ newPokemon.getTypes()[0] ]; - let newType = randSeedInt(18) as Type; - while (newType === newTypes[0]) { - newType = randSeedInt(18) as Type; - } - newTypes.push(newType); - if (!newPokemon.mysteryEncounterPokemonData) { - newPokemon.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); - } - newPokemon.mysteryEncounterPokemonData.types = newTypes; - + // Copy old items to new pokemon for (const item of transformation.heldItems) { item.pokemonId = newPokemon.id; await scene.addModifier(item, false, false, false, true); } - - // Any pokemon that is at or below 450 BST gets +20 permanent BST to 3 stats: HP (halved, +10), lowest of Atk/SpAtk, and lowest of Def/SpDef - if (newPokemon.getSpeciesForm().getBaseStatTotal() <= GAIN_OLD_GATEAU_ITEM_BST_THRESHOLD) { - const stats: Stat[] = [ Stat.HP ]; - const baseStats = newPokemon.getSpeciesForm().baseStats.slice(0); - // Attack or SpAtk - stats.push(baseStats[Stat.ATK] < baseStats[Stat.SPATK] ? Stat.ATK : Stat.SPATK); - // Def or SpDef - stats.push(baseStats[Stat.DEF] < baseStats[Stat.SPDEF] ? Stat.DEF : Stat.SPDEF); + // Any pokemon that is below 570 BST gets +20 permanent BST to 3 stats + if (shouldGetOldGateau(newPokemon)) { + const stats = getOldGateauBoostedStats(newPokemon); const modType = modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU() - .generateType(scene.getParty(), [ 20, stats ]) + .generateType(scene.getParty(), [ OLD_GATEAU_STATS_UP, stats ]) ?.withIdFromFunc(modifierTypes.MYSTERY_ENCOUNTER_OLD_GATEAU); const modifier = modType?.newModifier(newPokemon); if (modifier) { @@ -406,9 +412,6 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon } } - // Enable passive if previous had it - newPokemon.passive = previousPokemon.passive; - newPokemon.calculateStats(); await newPokemon.updateInfo(); } @@ -427,6 +430,138 @@ async function doNewTeamPostProcess(scene: BattleScene, transformations: Pokemon } } +/** + * Applies special changes to the newly transformed pokemon, such as passing previous moves, gaining egg moves, etc. + * Returns whether the transformed pokemon unlocks a new starter for the player. + * @param scene + * @param previousPokemon + * @param newPokemon + * @param speciesRootForm + * @param forBattle Default `false`. If false, will perform achievements and dex unlocks for the player. + */ +async function postProcessTransformedPokemon(scene: BattleScene, previousPokemon: PlayerPokemon, newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { + let isNewStarter = false; + // Roll HA a second time + if (newPokemon.species.abilityHidden) { + const hiddenIndex = newPokemon.species.ability2 ? 2 : 1; + if (newPokemon.abilityIndex < hiddenIndex) { + const hiddenAbilityChance = new IntegerHolder(256); + scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance); + + const hasHiddenAbility = !randSeedInt(hiddenAbilityChance.value); + + if (hasHiddenAbility) { + newPokemon.abilityIndex = hiddenIndex; + } + } + } + + // Roll IVs a second time + newPokemon.ivs = newPokemon.ivs.map(iv => { + const newValue = randSeedInt(31); + return newValue > iv ? newValue : iv; + }); + + // Roll a neutral nature + newPokemon.nature = [ Nature.HARDY, Nature.DOCILE, Nature.BASHFUL, Nature.QUIRKY, Nature.SERIOUS ][randSeedInt(5)]; + + // For pokemon at/below 570 BST or any shiny pokemon, unlock it permanently as if you had caught it + if (!forBattle && (newPokemon.getSpeciesForm().getBaseStatTotal() <= NON_LEGENDARY_BST_THRESHOLD || newPokemon.isShiny())) { + if (newPokemon.getSpeciesForm().abilityHidden && newPokemon.abilityIndex === newPokemon.getSpeciesForm().getAbilityCount() - 1) { + scene.validateAchv(achvs.HIDDEN_ABILITY); + } + + if (newPokemon.species.subLegendary) { + scene.validateAchv(achvs.CATCH_SUB_LEGENDARY); + } + + if (newPokemon.species.legendary) { + scene.validateAchv(achvs.CATCH_LEGENDARY); + } + + if (newPokemon.species.mythical) { + scene.validateAchv(achvs.CATCH_MYTHICAL); + } + + scene.gameData.updateSpeciesDexIvs(newPokemon.species.getRootSpeciesId(true), newPokemon.ivs); + const newStarterUnlocked = await scene.gameData.setPokemonCaught(newPokemon, true, false, false); + if (newStarterUnlocked) { + isNewStarter = true; + await showEncounterText(scene, i18next.t("battle:addedAsAStarter", { pokemonName: getPokemonSpecies(speciesRootForm).getName() })); + } + } + + // If the previous pokemon had pokerus, transfer to new pokemon + newPokemon.pokerus = previousPokemon.pokerus; + + // Transfer previous Pokemon's luck value + newPokemon.luck = previousPokemon.getLuck(); + + // If the previous pokemon had higher IVs, override to those (after updating dex IVs > prevents perfect 31s on a new unlock) + newPokemon.ivs = newPokemon.ivs.map((iv, index) => { + return previousPokemon.ivs[index] > iv ? previousPokemon.ivs[index] : iv; + }); + + // For pokemon that the player owns (including ones just caught), gain a candy + if (!forBattle && !!scene.gameData.dexData[speciesRootForm].caughtAttr) { + scene.gameData.addStarterCandy(getPokemonSpecies(speciesRootForm), 1); + } + + // Set the moveset of the new pokemon to be the same as previous, but with 1 egg move and 1 (attempted) STAB move of the new species + newPokemon.generateAndPopulateMoveset(); + // Store a copy of a "standard" generated moveset for the new pokemon, will be used later for finding a favored move + const newPokemonGeneratedMoveset = newPokemon.moveset; + + newPokemon.moveset = previousPokemon.moveset.slice(0); + + const newEggMoveIndex = await addEggMoveToNewPokemonMoveset(scene, newPokemon, speciesRootForm, forBattle); + + // Try to add a favored STAB move (might fail if Pokemon already knows a bunch of moves from newPokemonGeneratedMoveset) + addFavoredMoveToNewPokemonMoveset(newPokemon, newPokemonGeneratedMoveset, newEggMoveIndex); + + // Randomize the second type of the pokemon + // If the pokemon does not normally have a second type, it will gain 1 + const newTypes = [ newPokemon.getTypes()[0] ]; + let newType = randSeedInt(18) as Type; + while (newType === newTypes[0]) { + newType = randSeedInt(18) as Type; + } + newTypes.push(newType); + if (!newPokemon.customPokemonData) { + newPokemon.customPokemonData = new CustomPokemonData(); + } + newPokemon.customPokemonData.types = newTypes; + + // Enable passive if previous had it + newPokemon.passive = previousPokemon.passive; + + return isNewStarter; +} + +/** + * @returns `true` if a given Pokemon has valid BST to be given an Old Gateau + */ +function shouldGetOldGateau(pokemon: Pokemon): boolean { + return pokemon.getSpeciesForm().getBaseStatTotal() < NON_LEGENDARY_BST_THRESHOLD; +} + +/** + * Get the lowest of HP/Spd, lowest of Atk/SpAtk, and lowest of Def/SpDef + * @returns Array of 3 {@linkcode Stat}s to boost + */ +function getOldGateauBoostedStats(pokemon: Pokemon): Stat[] { + const stats: Stat[] = []; + const baseStats = pokemon.getSpeciesForm().baseStats.slice(0); + // HP or Speed + stats.push(baseStats[Stat.HP] < baseStats[Stat.SPD] ? Stat.HP : Stat.SPD); + // Attack or SpAtk + stats.push(baseStats[Stat.ATK] < baseStats[Stat.SPATK] ? Stat.ATK : Stat.SPATK); + // Def or SpDef + stats.push(baseStats[Stat.DEF] < baseStats[Stat.SPDEF] ? Stat.DEF : Stat.SPDEF); + return stats; +} + + function getTransformedSpecies(originalBst: number, bstSearchRange: [number, number], hasPokemonBstHigherThan600: boolean, hasPokemonBstBetween570And600: boolean, alreadyUsedSpecies: PokemonSpecies[]): PokemonSpecies { let newSpecies: PokemonSpecies | undefined; while (isNullOrUndefined(newSpecies)) { @@ -550,7 +685,7 @@ function doSideBySideTransformations(scene: BattleScene, transformations: Pokemo * @param newPokemon * @param speciesRootForm */ -async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: PlayerPokemon, speciesRootForm: Species): Promise { +async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: PlayerPokemon, speciesRootForm: Species, forBattle: boolean = false): Promise { let eggMoveIndex: null | number = null; const eggMoves = newPokemon.getEggMoves()?.slice(0); if (eggMoves) { @@ -576,7 +711,7 @@ async function addEggMoveToNewPokemonMoveset(scene: BattleScene, newPokemon: Pla } // For pokemon that the player owns (including ones just caught), unlock the egg move - if (!isNullOrUndefined(randomEggMoveIndex) && !!scene.gameData.dexData[speciesRootForm].caughtAttr) { + if (!forBattle && !isNullOrUndefined(randomEggMoveIndex) && !!scene.gameData.dexData[speciesRootForm].caughtAttr) { await scene.gameData.setEggMoveUnlocked(getPokemonSpecies(speciesRootForm), randomEggMoveIndex, true); } } diff --git a/src/data/mystery-encounters/mystery-encounter-requirements.ts b/src/data/mystery-encounters/mystery-encounter-requirements.ts index 86e04e80807..91ea0c5be19 100644 --- a/src/data/mystery-encounters/mystery-encounter-requirements.ts +++ b/src/data/mystery-encounters/mystery-encounter-requirements.ts @@ -15,6 +15,7 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type"; import { AttackTypeBoosterModifier } from "#app/modifier/modifier"; import { AttackTypeBoosterModifierType } from "#app/modifier/modifier-type"; import { SpeciesFormKey } from "#enums/species-form-key"; +import { allAbilities } from "#app/data/ability"; export interface EncounterRequirement { meetsRequirement(scene: BattleScene): boolean; // Boolean to see if a requirement is met @@ -36,31 +37,58 @@ export abstract class EncounterSceneRequirement implements EncounterRequirement abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; } +/** + * Combination of multiple {@linkcode EncounterSceneRequirement | EncounterSceneRequirements} (OR/AND possible. See {@linkcode isAnd}) + */ export class CombinationSceneRequirement extends EncounterSceneRequirement { - orRequirements: EncounterSceneRequirement[]; + /** If `true`, all requirements must be met (AND). If `false`, any requirement must be met (OR) */ + private isAnd: boolean; + requirements: EncounterSceneRequirement[]; - constructor(... orRequirements: EncounterSceneRequirement[]) { + public static Some(...requirements: EncounterSceneRequirement[]): CombinationSceneRequirement { + return new CombinationSceneRequirement(false, ...requirements); + } + + public static Every(...requirements: EncounterSceneRequirement[]): CombinationSceneRequirement { + return new CombinationSceneRequirement(true, ...requirements); + } + + private constructor(isAnd: boolean, ...requirements: EncounterSceneRequirement[]) { super(); - this.orRequirements = orRequirements; + this.isAnd = isAnd; + this.requirements = requirements; } + /** + * Checks if all/any requirements are met (depends on {@linkcode isAnd}) + * @param scene The {@linkcode BattleScene} to check against + * @returns true if all/any requirements are met (depends on {@linkcode isAnd}) + */ override meetsRequirement(scene: BattleScene): boolean { - for (const req of this.orRequirements) { - if (req.meetsRequirement(scene)) { - return true; - } - } - return false; + return this.isAnd + ? this.requirements.every(req => req.meetsRequirement(scene)) + : this.requirements.some(req => req.meetsRequirement(scene)); } + /** + * Retrieves a dialogue token key/value pair for the given {@linkcode EncounterSceneRequirement | requirements}. + * @param scene The {@linkcode BattleScene} to check against + * @param pokemon The {@linkcode PlayerPokemon} to check against + * @returns A dialogue token key/value pair + * @throws An {@linkcode Error} if {@linkcode isAnd} is `true` (not supported) + */ override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - for (const req of this.orRequirements) { - if (req.meetsRequirement(scene)) { - return req.getDialogueToken(scene, pokemon); + if (this.isAnd) { + throw new Error("Not implemented (Sorry)"); + } else { + for (const req of this.requirements) { + if (req.meetsRequirement(scene)) { + return req.getDialogueToken(scene, pokemon); + } } - } - return this.orRequirements[0].getDialogueToken(scene, pokemon); + return this.requirements[0].getDialogueToken(scene, pokemon); + } } } @@ -89,44 +117,74 @@ export abstract class EncounterPokemonRequirement implements EncounterRequiremen abstract getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string]; } +/** + * Combination of multiple {@linkcode EncounterPokemonRequirement | EncounterPokemonRequirements} (OR/AND possible. See {@linkcode isAnd}) + */ export class CombinationPokemonRequirement extends EncounterPokemonRequirement { - orRequirements: EncounterPokemonRequirement[]; + /** If `true`, all requirements must be met (AND). If `false`, any requirement must be met (OR) */ + private isAnd: boolean; + private requirements: EncounterPokemonRequirement[]; - constructor(...orRequirements: EncounterPokemonRequirement[]) { + public static Some(...requirements: EncounterPokemonRequirement[]): CombinationPokemonRequirement { + return new CombinationPokemonRequirement(false, ...requirements); + } + + public static Every(...requirements: EncounterPokemonRequirement[]): CombinationPokemonRequirement { + return new CombinationPokemonRequirement(true, ...requirements); + } + + private constructor(isAnd: boolean, ...requirements: EncounterPokemonRequirement[]) { super(); + this.isAnd = isAnd; this.invertQuery = false; this.minNumberOfPokemon = 1; - this.orRequirements = orRequirements; + this.requirements = requirements; } + /** + * Checks if all/any requirements are met (depends on {@linkcode isAnd}) + * @param scene The {@linkcode BattleScene} to check against + * @returns true if all/any requirements are met (depends on {@linkcode isAnd}) + */ override meetsRequirement(scene: BattleScene): boolean { - for (const req of this.orRequirements) { - if (req.meetsRequirement(scene)) { - return true; - } - } - return false; + return this.isAnd + ? this.requirements.every(req => req.meetsRequirement(scene)) + : this.requirements.some(req => req.meetsRequirement(scene)); } + /** + * Queries the players party for all party members that are compatible with all/any requirements (depends on {@linkcode isAnd}) + * @param partyPokemon The party of {@linkcode PlayerPokemon} + * @returns All party members that are compatible with all/any requirements (depends on {@linkcode isAnd}) + */ override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { - for (const req of this.orRequirements) { - const result = req.queryParty(partyPokemon); - if (result?.length > 0) { - return result; - } + if (this.isAnd) { + return this.requirements.reduce((relevantPokemon, req) => req.queryParty(relevantPokemon), partyPokemon); + } else { + const matchingRequirement = this.requirements.find(req => req.queryParty(partyPokemon).length > 0); + return matchingRequirement ? matchingRequirement.queryParty(partyPokemon) : []; } - - return []; } + /** + * Retrieves a dialogue token key/value pair for the given {@linkcode EncounterPokemonRequirement | requirements}. + * @param scene The {@linkcode BattleScene} to check against + * @param pokemon The {@linkcode PlayerPokemon} to check against + * @returns A dialogue token key/value pair + * @throws An {@linkcode Error} if {@linkcode isAnd} is `true` (not supported) + */ override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - for (const req of this.orRequirements) { - if (req.meetsRequirement(scene)) { - return req.getDialogueToken(scene, pokemon); + if (this.isAnd) { + throw new Error("Not implemented (Sorry)"); + } else { + for (const req of this.requirements) { + if (req.meetsRequirement(scene)) { + return req.getDialogueToken(scene, pokemon); + } } - } - return this.orRequirements[0].getDialogueToken(scene, pokemon); + return this.requirements[0].getDialogueToken(scene, pokemon); + } } } @@ -476,9 +534,11 @@ export class MoveRequirement extends EncounterPokemonRequirement { requiredMoves: Moves[] = []; minNumberOfPokemon: number; invertQuery: boolean; + excludeDisallowedPokemon: boolean; - constructor(moves: Moves | Moves[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(moves: Moves | Moves[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); + this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredMoves = Array.isArray(moves) ? moves : [ moves ]; @@ -494,10 +554,15 @@ export class MoveRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length > 0).length > 0); + // get the Pokemon with at least one move in the required moves list + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); } else { // for an inverted query, we only want to get the pokemon that don't have ANY of the listed moves - return partyPokemon.filter((pokemon) => this.requiredMoves.filter((reqMove) => pokemon.moveset.filter((move) => move?.moveId === reqMove).length === 0).length === 0); + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && !pokemon.moveset.some((move) => move?.moveId && this.requiredMoves.includes(move.moveId))); } } @@ -559,9 +624,11 @@ export class AbilityRequirement extends EncounterPokemonRequirement { requiredAbilities: Abilities[]; minNumberOfPokemon: number; invertQuery: boolean; + excludeDisallowedPokemon: boolean; - constructor(abilities: Abilities | Abilities[], minNumberOfPokemon: number = 1, invertQuery: boolean = false) { + constructor(abilities: Abilities | Abilities[], excludeDisallowedPokemon: boolean, minNumberOfPokemon: number = 1, invertQuery: boolean = false) { super(); + this.excludeDisallowedPokemon = excludeDisallowedPokemon; this.minNumberOfPokemon = minNumberOfPokemon; this.invertQuery = invertQuery; this.requiredAbilities = Array.isArray(abilities) ? abilities : [ abilities ]; @@ -577,16 +644,21 @@ export class AbilityRequirement extends EncounterPokemonRequirement { override queryParty(partyPokemon: PlayerPokemon[]): PlayerPokemon[] { if (!this.invertQuery) { - return partyPokemon.filter((pokemon) => this.requiredAbilities.some((ability) => pokemon.getAbility().id === ability)); + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && this.requiredAbilities.some((ability) => pokemon.hasAbility(ability, false))); } else { - // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilitiess - return partyPokemon.filter((pokemon) => this.requiredAbilities.filter((ability) => pokemon.getAbility().id === ability).length === 0); + // for an inverted query, we only want to get the pokemon that don't have ANY of the listed abilities + return partyPokemon.filter((pokemon) => + (!this.excludeDisallowedPokemon || pokemon.isAllowedInBattle()) + && this.requiredAbilities.filter((ability) => pokemon.hasAbility(ability, false)).length === 0); } } - override getDialogueToken(scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { - if (pokemon?.getAbility().id && this.requiredAbilities.some(a => pokemon.getAbility().id === a)) { - return [ "ability", pokemon.getAbility().name ]; + override getDialogueToken(_scene: BattleScene, pokemon?: PlayerPokemon): [string, string] { + const matchingAbility = this.requiredAbilities.find(a => pokemon?.hasAbility(a, false)); + if (!isNullOrUndefined(matchingAbility)) { + return [ "ability", allAbilities[matchingAbility].name ]; } return [ "ability", "" ]; } diff --git a/src/data/mystery-encounters/mystery-encounter.ts b/src/data/mystery-encounters/mystery-encounter.ts index 7e175957e21..c045ee51bd7 100644 --- a/src/data/mystery-encounters/mystery-encounter.ts +++ b/src/data/mystery-encounters/mystery-encounter.ts @@ -53,6 +53,7 @@ export interface IMysteryEncounter { hasBattleAnimationsWithoutTargets: boolean; skipEnemyBattleTurns: boolean; skipToFightInput: boolean; + preventGameStatsUpdates: boolean; onInit?: (scene: BattleScene) => boolean; onVisualsStart?: (scene: BattleScene) => boolean; @@ -150,6 +151,10 @@ export default class MysteryEncounter implements IMysteryEncounter { * If true, will skip COMMAND input and go straight to FIGHT (move select) input menu */ skipToFightInput: boolean; + /** + * If true, will prevent updating {@linkcode GameStats} for encountering and/or defeating Pokemon + */ + preventGameStatsUpdates: boolean; // #region Event callback functions @@ -325,7 +330,7 @@ export default class MysteryEncounter implements IMysteryEncounter { if (activeMon.length > 0) { this.primaryPokemon = activeMon[0]; } else { - this.primaryPokemon = scene.getParty().filter(p => !p.isFainted())[0]; + this.primaryPokemon = scene.getParty().filter(p => p.isAllowedInBattle())[0]; } return true; } @@ -548,6 +553,7 @@ export class MysteryEncounterBuilder implements Partial { hasBattleAnimationsWithoutTargets: boolean = false; skipEnemyBattleTurns: boolean = false; skipToFightInput: boolean = false; + preventGameStatsUpdates: boolean = false; maxAllowedEncounters: number = 3; expMultiplier: number = 1; @@ -735,6 +741,14 @@ export class MysteryEncounterBuilder implements Partial { return Object.assign(this, { skipToFightInput }); } + /** + * If true, will prevent updating {@linkcode GameStats} for encountering and/or defeating Pokemon + * Default `false` + */ + withPreventGameStatsUpdates(preventGameStatsUpdates: boolean): this & Required> { + return Object.assign(this, { preventGameStatsUpdates }); + } + /** * Sets the maximum number of times that an encounter can spawn in a given Classic run * @param maxAllowedEncounters diff --git a/src/data/mystery-encounters/requirements/requirement-groups.ts b/src/data/mystery-encounters/requirements/requirement-groups.ts index 63c899fc5e9..76bbb8f03a7 100644 --- a/src/data/mystery-encounters/requirements/requirement-groups.ts +++ b/src/data/mystery-encounters/requirements/requirement-groups.ts @@ -118,3 +118,20 @@ export const EXTORTION_ABILITIES = [ Abilities.SUCTION_CUPS, Abilities.STICKY_HOLD ]; + +/** + * Abilities that signify resistance to fire + */ +export const FIRE_RESISTANT_ABILITIES = [ + Abilities.FLAME_BODY, + Abilities.FLASH_FIRE, + Abilities.WELL_BAKED_BODY, + Abilities.HEATPROOF, + Abilities.THERMAL_EXCHANGE, + Abilities.THICK_FAT, + Abilities.WATER_BUBBLE, + Abilities.MAGMA_ARMOR, + Abilities.WATER_VEIL, + Abilities.STEAM_ENGINE, + Abilities.PRIMORDIAL_SEA +]; diff --git a/src/data/mystery-encounters/utils/encounter-phase-utils.ts b/src/data/mystery-encounters/utils/encounter-phase-utils.ts index f76dff1fec7..66459c96ede 100644 --- a/src/data/mystery-encounters/utils/encounter-phase-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-phase-utils.ts @@ -27,7 +27,7 @@ import { Status, StatusEffect } from "#app/data/status-effect"; import { TrainerConfig, trainerConfigs, TrainerSlot } from "#app/data/trainer-config"; import PokemonSpecies from "#app/data/pokemon-species"; import { Egg, IEggOptions } from "#app/data/egg"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import HeldModifierConfig from "#app/interfaces/held-modifier-config"; import { MovePhase } from "#app/phases/move-phase"; import { EggLapsePhase } from "#app/phases/egg-lapse-phase"; @@ -71,7 +71,7 @@ export interface EnemyPokemonConfig { nickname?: string; bossSegments?: number; bossSegmentModifier?: number; // Additive to the determined segment number - mysteryEncounterPokemonData?: MysteryEncounterPokemonData; + customPokemonData?: CustomPokemonData; formIndex?: number; abilityIndex?: number; level?: number; @@ -145,7 +145,7 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: newTrainer.setVisible(false); scene.field.add(newTrainer); scene.currentBattle.trainer = newTrainer; - loadEnemyAssets.push(newTrainer.loadAssets()); + loadEnemyAssets.push(newTrainer.loadAssets().then(() => newTrainer.initSprite())); battle.enemyLevels = scene.currentBattle.trainer.getPartyLevels(scene.currentBattle.waveIndex); } else { @@ -250,8 +250,8 @@ export async function initBattleWithEnemyConfig(scene: BattleScene, partyConfig: } // Set custom mystery encounter data fields (such as sprite scale, custom abilities, types, etc.) - if (!isNullOrUndefined(config.mysteryEncounterPokemonData)) { - enemyPokemon.mysteryEncounterPokemonData = config.mysteryEncounterPokemonData; + if (!isNullOrUndefined(config.customPokemonData)) { + enemyPokemon.customPokemonData = config.customPokemonData; } // Set Boss @@ -418,7 +418,7 @@ export function generateModifierType(scene: BattleScene, modifier: () => Modifie // Populates item id and tier (order matters) result = result .withIdFromFunc(modifierTypes[modifierId]) - .withTierFromPool(); + .withTierFromPool(ModifierPoolType.PLAYER, scene.getParty()); return result instanceof ModifierTypeGenerator ? result.generateType(scene.getParty(), pregenArgs) : result; } @@ -1069,19 +1069,19 @@ export function calculateRareSpawnAggregateStats(scene: BattleScene, luckValue: const tier = tierValue >= 20 ? BiomePoolTier.BOSS : tierValue >= 6 ? BiomePoolTier.BOSS_RARE : tierValue >= 1 ? BiomePoolTier.BOSS_SUPER_RARE : BiomePoolTier.BOSS_ULTRA_RARE; switch (tier) { - default: - case BiomePoolTier.BOSS: - ++bossEncountersByRarity[0]; - break; - case BiomePoolTier.BOSS_RARE: - ++bossEncountersByRarity[1]; - break; - case BiomePoolTier.BOSS_SUPER_RARE: - ++bossEncountersByRarity[2]; - break; - case BiomePoolTier.BOSS_ULTRA_RARE: - ++bossEncountersByRarity[3]; - break; + default: + case BiomePoolTier.BOSS: + ++bossEncountersByRarity[0]; + break; + case BiomePoolTier.BOSS_RARE: + ++bossEncountersByRarity[1]; + break; + case BiomePoolTier.BOSS_SUPER_RARE: + ++bossEncountersByRarity[2]; + break; + case BiomePoolTier.BOSS_ULTRA_RARE: + ++bossEncountersByRarity[3]; + break; } } diff --git a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts index 5fa8af95f4d..b1adc478ab0 100644 --- a/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts +++ b/src/data/mystery-encounters/utils/encounter-pokemon-utils.ts @@ -21,6 +21,8 @@ import { Gender } from "#app/data/gender"; import { PermanentStat } from "#enums/stat"; import { VictoryPhase } from "#app/phases/victory-phase"; import { SummaryUiMode } from "#app/ui/summary-ui-handler"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; +import { Abilities } from "#enums/abilities"; /** Will give +1 level every 10 waves */ export const STANDARD_ENCOUNTER_BOOSTED_LEVEL_MODIFIER = 1; @@ -833,3 +835,21 @@ export function isPokemonValidForEncounterOptionSelection(pokemon: Pokemon, scen return null; } + +/** + * Permanently overrides the ability (not passive) of a pokemon. + * If the pokemon is a fusion, instead overrides the fused pokemon's ability. + */ +export function applyAbilityOverrideToPokemon(pokemon: Pokemon, ability: Abilities) { + if (pokemon.isFusion()) { + if (!pokemon.fusionCustomPokemonData) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(); + } + pokemon.fusionCustomPokemonData.ability = ability; + } else { + if (!pokemon.customPokemonData) { + pokemon.customPokemonData = new CustomPokemonData(); + } + pokemon.customPokemonData.ability = ability; + } +} diff --git a/src/data/nature.ts b/src/data/nature.ts index c614be465c3..edac06f1a4f 100644 --- a/src/data/nature.ts +++ b/src/data/nature.ts @@ -37,76 +37,76 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals export function getNatureStatMultiplier(nature: Nature, stat: Stat): number { switch (stat) { - case Stat.ATK: - switch (nature) { - case Nature.LONELY: - case Nature.BRAVE: - case Nature.ADAMANT: - case Nature.NAUGHTY: - return 1.1; - case Nature.BOLD: - case Nature.TIMID: - case Nature.MODEST: - case Nature.CALM: - return 0.9; - } - break; - case Stat.DEF: - switch (nature) { - case Nature.BOLD: - case Nature.RELAXED: - case Nature.IMPISH: - case Nature.LAX: - return 1.1; - case Nature.LONELY: - case Nature.HASTY: - case Nature.MILD: - case Nature.GENTLE: - return 0.9; - } - break; - case Stat.SPATK: - switch (nature) { - case Nature.MODEST: - case Nature.MILD: - case Nature.QUIET: - case Nature.RASH: - return 1.1; - case Nature.ADAMANT: - case Nature.IMPISH: - case Nature.JOLLY: - case Nature.CAREFUL: - return 0.9; - } - break; - case Stat.SPDEF: - switch (nature) { - case Nature.CALM: - case Nature.GENTLE: - case Nature.SASSY: - case Nature.CAREFUL: - return 1.1; - case Nature.NAUGHTY: - case Nature.LAX: - case Nature.NAIVE: - case Nature.RASH: - return 0.9; - } - break; - case Stat.SPD: - switch (nature) { - case Nature.TIMID: - case Nature.HASTY: - case Nature.JOLLY: - case Nature.NAIVE: - return 1.1; - case Nature.BRAVE: - case Nature.RELAXED: - case Nature.QUIET: - case Nature.SASSY: - return 0.9; - } - break; + case Stat.ATK: + switch (nature) { + case Nature.LONELY: + case Nature.BRAVE: + case Nature.ADAMANT: + case Nature.NAUGHTY: + return 1.1; + case Nature.BOLD: + case Nature.TIMID: + case Nature.MODEST: + case Nature.CALM: + return 0.9; + } + break; + case Stat.DEF: + switch (nature) { + case Nature.BOLD: + case Nature.RELAXED: + case Nature.IMPISH: + case Nature.LAX: + return 1.1; + case Nature.LONELY: + case Nature.HASTY: + case Nature.MILD: + case Nature.GENTLE: + return 0.9; + } + break; + case Stat.SPATK: + switch (nature) { + case Nature.MODEST: + case Nature.MILD: + case Nature.QUIET: + case Nature.RASH: + return 1.1; + case Nature.ADAMANT: + case Nature.IMPISH: + case Nature.JOLLY: + case Nature.CAREFUL: + return 0.9; + } + break; + case Stat.SPDEF: + switch (nature) { + case Nature.CALM: + case Nature.GENTLE: + case Nature.SASSY: + case Nature.CAREFUL: + return 1.1; + case Nature.NAUGHTY: + case Nature.LAX: + case Nature.NAIVE: + case Nature.RASH: + return 0.9; + } + break; + case Stat.SPD: + switch (nature) { + case Nature.TIMID: + case Nature.HASTY: + case Nature.JOLLY: + case Nature.NAIVE: + return 1.1; + case Nature.BRAVE: + case Nature.RELAXED: + case Nature.QUIET: + case Nature.SASSY: + return 0.9; + } + break; } return 1; diff --git a/src/data/pokeball.ts b/src/data/pokeball.ts index 59ff4ed86ce..57a78e2cd61 100644 --- a/src/data/pokeball.ts +++ b/src/data/pokeball.ts @@ -8,77 +8,77 @@ export const MAX_PER_TYPE_POKEBALLS: integer = 99; export function getPokeballAtlasKey(type: PokeballType): string { switch (type) { - case PokeballType.POKEBALL: - return "pb"; - case PokeballType.GREAT_BALL: - return "gb"; - case PokeballType.ULTRA_BALL: - return "ub"; - case PokeballType.ROGUE_BALL: - return "rb"; - case PokeballType.MASTER_BALL: - return "mb"; - case PokeballType.LUXURY_BALL: - return "lb"; + case PokeballType.POKEBALL: + return "pb"; + case PokeballType.GREAT_BALL: + return "gb"; + case PokeballType.ULTRA_BALL: + return "ub"; + case PokeballType.ROGUE_BALL: + return "rb"; + case PokeballType.MASTER_BALL: + return "mb"; + case PokeballType.LUXURY_BALL: + return "lb"; } } export function getPokeballName(type: PokeballType): string { let ret: string; switch (type) { - case PokeballType.POKEBALL: - ret = i18next.t("pokeball:pokeBall"); - break; - case PokeballType.GREAT_BALL: - ret = i18next.t("pokeball:greatBall"); - break; - case PokeballType.ULTRA_BALL: - ret = i18next.t("pokeball:ultraBall"); - break; - case PokeballType.ROGUE_BALL: - ret = i18next.t("pokeball:rogueBall"); - break; - case PokeballType.MASTER_BALL: - ret = i18next.t("pokeball:masterBall"); - break; - case PokeballType.LUXURY_BALL: - ret = i18next.t("pokeball:luxuryBall"); - break; + case PokeballType.POKEBALL: + ret = i18next.t("pokeball:pokeBall"); + break; + case PokeballType.GREAT_BALL: + ret = i18next.t("pokeball:greatBall"); + break; + case PokeballType.ULTRA_BALL: + ret = i18next.t("pokeball:ultraBall"); + break; + case PokeballType.ROGUE_BALL: + ret = i18next.t("pokeball:rogueBall"); + break; + case PokeballType.MASTER_BALL: + ret = i18next.t("pokeball:masterBall"); + break; + case PokeballType.LUXURY_BALL: + ret = i18next.t("pokeball:luxuryBall"); + break; } return ret; } export function getPokeballCatchMultiplier(type: PokeballType): number { switch (type) { - case PokeballType.POKEBALL: - return 1; - case PokeballType.GREAT_BALL: - return 1.5; - case PokeballType.ULTRA_BALL: - return 2; - case PokeballType.ROGUE_BALL: - return 3; - case PokeballType.MASTER_BALL: - return -1; - case PokeballType.LUXURY_BALL: - return 1; + case PokeballType.POKEBALL: + return 1; + case PokeballType.GREAT_BALL: + return 1.5; + case PokeballType.ULTRA_BALL: + return 2; + case PokeballType.ROGUE_BALL: + return 3; + case PokeballType.MASTER_BALL: + return -1; + case PokeballType.LUXURY_BALL: + return 1; } } export function getPokeballTintColor(type: PokeballType): number { switch (type) { - case PokeballType.POKEBALL: - return 0xd52929; - case PokeballType.GREAT_BALL: - return 0x94b4de; - case PokeballType.ULTRA_BALL: - return 0xe6cd31; - case PokeballType.ROGUE_BALL: - return 0xd52929; - case PokeballType.MASTER_BALL: - return 0xa441bd; - case PokeballType.LUXURY_BALL: - return 0xffde6a; + case PokeballType.POKEBALL: + return 0xd52929; + case PokeballType.GREAT_BALL: + return 0x94b4de; + case PokeballType.ULTRA_BALL: + return 0xe6cd31; + case PokeballType.ROGUE_BALL: + return 0xd52929; + case PokeballType.MASTER_BALL: + return 0xa441bd; + case PokeballType.LUXURY_BALL: + return 0xffde6a; } } diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts index eb1b761e306..107fa5073af 100644 --- a/src/data/pokemon-species.ts +++ b/src/data/pokemon-species.ts @@ -47,7 +47,7 @@ export function getPokemonSpecies(species: Species | Species[] | undefined): Pok return allSpecies[species - 1]; } -export function getPokemonSpeciesForm(species: Species, formIndex: integer): PokemonSpeciesForm { +export function getPokemonSpeciesForm(species: Species, formIndex: number): PokemonSpeciesForm { const retSpecies: PokemonSpecies = species >= 2000 ? allSpecies.find(s => s.speciesId === species)! // TODO: is the bang correct? : allSpecies[species - 1]; @@ -129,26 +129,27 @@ export type PokemonSpeciesFilter = (species: PokemonSpecies) => boolean; export abstract class PokemonSpeciesForm { public speciesId: Species; - public formIndex: integer; - public generation: integer; - public type1: Type; - public type2: Type | null; - public height: number; - public weight: number; - public ability1: Abilities; - public ability2: Abilities; - public abilityHidden: Abilities; - public baseTotal: integer; - public baseStats: integer[]; - public catchRate: integer; - public baseFriendship: integer; - public baseExp: integer; - public genderDiffs: boolean; - public isStarterSelectable: boolean; + protected _formIndex: number; + protected _generation: number; + readonly type1: Type; + readonly type2: Type | null; + readonly height: number; + readonly weight: number; + readonly ability1: Abilities; + readonly ability2: Abilities; + readonly abilityHidden: Abilities; + readonly baseTotal: number; + readonly baseStats: number[]; + readonly catchRate: number; + readonly baseFriendship: number; + readonly baseExp: number; + readonly genderDiffs: boolean; + readonly isStarterSelectable: boolean; constructor(type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs: boolean, isStarterSelectable: boolean) { + baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, + catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean, isStarterSelectable: boolean + ) { this.type1 = type1; this.type2 = type2; this.height = height; @@ -180,7 +181,23 @@ export abstract class PokemonSpeciesForm { return ret; } - isOfType(type: integer): boolean { + get generation(): number { + return this._generation; + } + + set generation(generation: number) { + this._generation = generation; + } + + get formIndex(): number { + return this._formIndex; + } + + set formIndex(formIndex: number) { + this._formIndex = formIndex; + } + + isOfType(type: number): boolean { return this.type1 === type || (this.type2 !== null && this.type2 === type); } @@ -188,7 +205,7 @@ export abstract class PokemonSpeciesForm { * Method to get the total number of abilities a Pokemon species has. * @returns Number of abilities */ - getAbilityCount(): integer { + getAbilityCount(): number { return this.abilityHidden !== Abilities.NONE ? 3 : 2; } @@ -197,7 +214,7 @@ export abstract class PokemonSpeciesForm { * @param abilityIndex Which ability to get (should only be 0-2) * @returns The id of the Ability */ - getAbility(abilityIndex: integer): Abilities { + getAbility(abilityIndex: number): Abilities { let ret: Abilities; if (abilityIndex === 0) { ret = this.ability1; @@ -238,8 +255,8 @@ export abstract class PokemonSpeciesForm { isRareRegional(): boolean { switch (this.getRegion()) { - case Region.HISUI: - return true; + case Region.HISUI: + return true; } return false; @@ -265,24 +282,24 @@ export abstract class PokemonSpeciesForm { getBaseExp(): number { let ret = this.baseExp; switch (this.getFormSpriteKey()) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.MEGA_X: - case SpeciesFormKey.MEGA_Y: - case SpeciesFormKey.PRIMAL: - case SpeciesFormKey.GIGANTAMAX: - case SpeciesFormKey.ETERNAMAX: - ret *= 1.5; - break; + case SpeciesFormKey.MEGA: + case SpeciesFormKey.MEGA_X: + case SpeciesFormKey.MEGA_Y: + case SpeciesFormKey.PRIMAL: + case SpeciesFormKey.GIGANTAMAX: + case SpeciesFormKey.ETERNAMAX: + ret *= 1.5; + break; } return ret; } - getSpriteAtlasPath(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { + getSpriteAtlasPath(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { const spriteId = this.getSpriteId(female, formIndex, shiny, variant).replace(/\_{2}/g, "/"); return `${/_[1-3]$/.test(spriteId) ? "variant/" : ""}${spriteId}`; } - getSpriteId(female: boolean, formIndex?: integer, shiny?: boolean, variant: integer = 0, back?: boolean): string { + getSpriteId(female: boolean, formIndex?: number, shiny?: boolean, variant: number = 0, back?: boolean): string { if (formIndex === undefined || this instanceof PokemonForm) { formIndex = this.formIndex; } @@ -299,11 +316,11 @@ export abstract class PokemonSpeciesForm { return `${back ? "back__" : ""}${shiny && (!variantSet || (!variant && !variantSet[variant || 0])) ? "shiny__" : ""}${baseSpriteKey}${shiny && variantSet && variantSet[variant] === 2 ? `_${variant + 1}` : ""}`; } - getSpriteKey(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { + getSpriteKey(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { return `pkmn__${this.getSpriteId(female, formIndex, shiny, variant)}`; } - abstract getFormSpriteKey(formIndex?: integer): string; + abstract getFormSpriteKey(formIndex?: number): string; /** @@ -311,9 +328,9 @@ export abstract class PokemonSpeciesForm { * @param formIndex optional form index for pokemon with different forms * @returns species id if no additional forms, index with formkey if a pokemon with a form */ - getVariantDataIndex(formIndex?: integer) { + getVariantDataIndex(formIndex?: number) { let formkey: string | null = null; - let variantDataIndex: integer | string = this.speciesId; + let variantDataIndex: number | string = this.speciesId; const species = getPokemonSpecies(this.speciesId); if (species.forms.length > 0 && formIndex !== undefined) { formkey = species.forms[formIndex]?.getFormSpriteKey(formIndex); @@ -324,13 +341,13 @@ export abstract class PokemonSpeciesForm { return variantDataIndex; } - getIconAtlasKey(formIndex?: integer, shiny?: boolean, variant?: integer): string { + getIconAtlasKey(formIndex?: number, shiny?: boolean, variant?: number): string { const variantDataIndex = this.getVariantDataIndex(formIndex); const isVariant = shiny && variantData[variantDataIndex] && (variant !== undefined && variantData[variantDataIndex][variant]); return `pokemon_icons_${this.generation}${isVariant ? "v" : ""}`; } - getIconId(female: boolean, formIndex?: integer, shiny?: boolean, variant?: integer): string { + getIconId(female: boolean, formIndex?: number, shiny?: boolean, variant?: number): string { if (formIndex === undefined) { formIndex = this.formIndex; } @@ -346,29 +363,29 @@ export abstract class PokemonSpeciesForm { } switch (this.speciesId) { - case Species.HIPPOPOTAS: - case Species.HIPPOWDON: - case Species.UNFEZANT: - case Species.FRILLISH: - case Species.JELLICENT: - case Species.PYROAR: - ret += female ? "-f" : ""; - break; + case Species.HIPPOPOTAS: + case Species.HIPPOWDON: + case Species.UNFEZANT: + case Species.FRILLISH: + case Species.JELLICENT: + case Species.PYROAR: + ret += female ? "-f" : ""; + break; } let formSpriteKey = this.getFormSpriteKey(formIndex); if (formSpriteKey) { switch (this.speciesId) { - case Species.DUDUNSPARCE: - break; - case Species.ZACIAN: - case Species.ZAMAZENTA: - if (formSpriteKey.startsWith("behemoth")) { - formSpriteKey = "crowned"; - } - default: - ret += `-${formSpriteKey}`; - break; + case Species.DUDUNSPARCE: + break; + case Species.ZACIAN: + case Species.ZAMAZENTA: + if (formSpriteKey.startsWith("behemoth")) { + formSpriteKey = "crowned"; + } + default: + ret += `-${formSpriteKey}`; + break; } } @@ -379,19 +396,19 @@ export abstract class PokemonSpeciesForm { return ret; } - getCryKey(formIndex?: integer): string { + getCryKey(formIndex?: number): string { let speciesId = this.speciesId; if (this.speciesId > 2000) { switch (this.speciesId) { - case Species.GALAR_SLOWPOKE: - break; - case Species.ETERNAL_FLOETTE: - break; - case Species.BLOODMOON_URSALUNA: - break; - default: - speciesId = speciesId % 2000; - break; + case Species.GALAR_SLOWPOKE: + break; + case Species.ETERNAL_FLOETTE: + break; + case Species.BLOODMOON_URSALUNA: + break; + default: + speciesId = speciesId % 2000; + break; } } let ret = speciesId.toString(); @@ -403,50 +420,50 @@ export abstract class PokemonSpeciesForm { } const formKey = forms[formIndex || 0].formKey; switch (formKey) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.MEGA_X: - case SpeciesFormKey.MEGA_Y: - case SpeciesFormKey.GIGANTAMAX: - case SpeciesFormKey.GIGANTAMAX_SINGLE: - case SpeciesFormKey.GIGANTAMAX_RAPID: - case "white": - case "black": - case "therian": - case "sky": - case "gorging": - case "gulping": - case "no-ice": - case "hangry": - case "crowned": - case "eternamax": - case "four": - case "droopy": - case "stretchy": - case "hero": - case "roaming": - case "complete": - case "10-complete": - case "10": - case "10-pc": - case "super": - case "unbound": - case "pau": - case "pompom": - case "sensu": - case "dusk": - case "midnight": - case "school": - case "dawn-wings": - case "dusk-mane": - case "ultra": - ret += `-${formKey}`; - break; + case SpeciesFormKey.MEGA: + case SpeciesFormKey.MEGA_X: + case SpeciesFormKey.MEGA_Y: + case SpeciesFormKey.GIGANTAMAX: + case SpeciesFormKey.GIGANTAMAX_SINGLE: + case SpeciesFormKey.GIGANTAMAX_RAPID: + case "white": + case "black": + case "therian": + case "sky": + case "gorging": + case "gulping": + case "no-ice": + case "hangry": + case "crowned": + case "eternamax": + case "four": + case "droopy": + case "stretchy": + case "hero": + case "roaming": + case "complete": + case "10-complete": + case "10": + case "10-pc": + case "super": + case "unbound": + case "pau": + case "pompom": + case "sensu": + case "dusk": + case "midnight": + case "school": + case "dawn-wings": + case "dusk-mane": + case "ultra": + ret += `-${formKey}`; + break; } } return ret; } - validateStarterMoveset(moveset: StarterMoveset, eggMoves: integer): boolean { + validateStarterMoveset(moveset: StarterMoveset, eggMoves: number): boolean { const rootSpeciesId = this.getRootSpeciesId(); for (const moveId of moveset) { if (speciesEggMoves.hasOwnProperty(rootSpeciesId)) { @@ -467,7 +484,7 @@ export abstract class PokemonSpeciesForm { return true; } - loadAssets(scene: BattleScene, female: boolean, formIndex?: integer, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise { + loadAssets(scene: BattleScene, female: boolean, formIndex?: number, shiny?: boolean, variant?: Variant, startLoad?: boolean): Promise { return new Promise(resolve => { const spriteKey = this.getSpriteKey(female, formIndex, shiny, variant); scene.loadPokemonAtlas(spriteKey, this.getSpriteAtlasPath(female, formIndex, shiny, variant)); @@ -536,7 +553,7 @@ export abstract class PokemonSpeciesForm { return cry; } - generateCandyColors(scene: BattleScene): integer[][] { + generateCandyColors(scene: BattleScene): number[][] { const sourceTexture = scene.textures.get(this.getSpriteKey(false)); const sourceFrame = sourceTexture.frames[sourceTexture.firstFrame]; @@ -544,7 +561,7 @@ export abstract class PokemonSpeciesForm { const canvas = document.createElement("canvas"); - const spriteColors: integer[][] = []; + const spriteColors: number[][] = []; const context = canvas.getContext("2d"); const frame = sourceFrame; @@ -567,7 +584,7 @@ export abstract class PokemonSpeciesForm { } for (let i = 0; i < pixelData.length; i += 4) { - const total = pixelData.slice(i, i + 3).reduce((total: integer, value: integer) => total + value, 0); + const total = pixelData.slice(i, i + 3).reduce((total: number, value: number) => total + value, 0); if (!total) { continue; } @@ -586,27 +603,28 @@ export abstract class PokemonSpeciesForm { Math.random = originalRandom; - return Array.from(paletteColors.keys()).map(c => Object.values(rgbaFromArgb(c)) as integer[]); + return Array.from(paletteColors.keys()).map(c => Object.values(rgbaFromArgb(c)) as number[]); } } export default class PokemonSpecies extends PokemonSpeciesForm implements Localizable { public name: string; - public subLegendary: boolean; - public legendary: boolean; - public mythical: boolean; - public species: string; - public growthRate: GrowthRate; - public malePercent: number | null; - public genderDiffs: boolean; - public canChangeForm: boolean; - public forms: PokemonForm[]; + readonly subLegendary: boolean; + readonly legendary: boolean; + readonly mythical: boolean; + readonly species: string; + readonly growthRate: GrowthRate; + readonly malePercent: number | null; + readonly genderDiffs: boolean; + readonly canChangeForm: boolean; + readonly forms: PokemonForm[]; - constructor(id: Species, generation: integer, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, + constructor(id: Species, generation: number, subLegendary: boolean, legendary: boolean, mythical: boolean, species: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, growthRate: GrowthRate, malePercent: number | null, - genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[]) { + baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, + catchRate: number, baseFriendship: number, baseExp: number, growthRate: GrowthRate, malePercent: number | null, + genderDiffs: boolean, canChangeForm?: boolean, ...forms: PokemonForm[] + ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, catchRate, baseFriendship, baseExp, genderDiffs, false); this.speciesId = id; @@ -631,24 +649,24 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali }); } - getName(formIndex?: integer): string { + getName(formIndex?: number): string { if (formIndex !== undefined && this.forms.length) { const form = this.forms[formIndex]; let key: string | null; switch (form.formKey) { - case SpeciesFormKey.MEGA: - case SpeciesFormKey.PRIMAL: - case SpeciesFormKey.ETERNAMAX: - case SpeciesFormKey.MEGA_X: - case SpeciesFormKey.MEGA_Y: - key = form.formKey; - break; - default: - if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) { - key = "gigantamax"; - } else { - key = null; - } + case SpeciesFormKey.MEGA: + case SpeciesFormKey.PRIMAL: + case SpeciesFormKey.ETERNAMAX: + case SpeciesFormKey.MEGA_X: + case SpeciesFormKey.MEGA_Y: + key = form.formKey; + break; + default: + if (form.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1) { + key = "gigantamax"; + } else { + key = null; + } } if (key) { @@ -662,11 +680,11 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali this.name = i18next.t(`pokemon:${Species[this.speciesId].toLowerCase()}`); } - getWildSpeciesForLevel(level: integer, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): Species { + getWildSpeciesForLevel(level: number, allowEvolving: boolean, isBoss: boolean, gameMode: GameMode): Species { return this.getSpeciesForLevel(level, allowEvolving, false, (isBoss ? PartyMemberStrength.WEAKER : PartyMemberStrength.AVERAGE) + (gameMode?.isEndless ? 1 : 0)); } - getTrainerSpeciesForLevel(level: integer, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { + getTrainerSpeciesForLevel(level: number, allowEvolving: boolean = false, strength: PartyMemberStrength, currentWave: number = 0): Species { return this.getSpeciesForLevel(level, allowEvolving, true, strength, currentWave); } @@ -688,24 +706,24 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali * @param strength {@linkcode PartyMemberStrength} The strength of the party member in question * @returns {@linkcode integer} The level difference from expected evolution level tolerated for a mon to be unevolved. Lower value = higher evolution chance. */ - private getStrengthLevelDiff(strength: PartyMemberStrength): integer { + private getStrengthLevelDiff(strength: PartyMemberStrength): number { switch (Math.min(strength, PartyMemberStrength.STRONGER)) { - case PartyMemberStrength.WEAKEST: - return 60; - case PartyMemberStrength.WEAKER: - return 40; - case PartyMemberStrength.WEAK: - return 20; - case PartyMemberStrength.AVERAGE: - return 8; - case PartyMemberStrength.STRONG: - return 4; - default: - return 0; + case PartyMemberStrength.WEAKEST: + return 60; + case PartyMemberStrength.WEAKER: + return 40; + case PartyMemberStrength.WEAK: + return 20; + case PartyMemberStrength.AVERAGE: + return 8; + case PartyMemberStrength.STRONG: + return 4; + default: + return 0; } } - getSpeciesForLevel(level: integer, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { + getSpeciesForLevel(level: number, allowEvolving: boolean = false, forTrainer: boolean = false, strength: PartyMemberStrength = PartyMemberStrength.WEAKER, currentWave: number = 0): Species { const prevolutionLevels = this.getPrevolutionLevels(); if (prevolutionLevels.length) { @@ -847,7 +865,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali } // This could definitely be written better and more accurate to the getSpeciesForLevel logic, but it is only for generating movesets for evolved Pokemon - getSimulatedEvolutionChain(currentLevel: integer, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): EvolutionLevel[] { + getSimulatedEvolutionChain(currentLevel: number, forTrainer: boolean = false, isBoss: boolean = false, player: boolean = false): EvolutionLevel[] { const ret: EvolutionLevel[] = []; if (pokemonPrevolutions.hasOwnProperty(this.speciesId)) { const prevolutionLevels = this.getPrevolutionLevels().reverse(); @@ -899,7 +917,7 @@ export default class PokemonSpecies extends PokemonSpeciesForm implements Locali return variantData.hasOwnProperty(variantDataIndex) || variantData.hasOwnProperty(this.speciesId); } - getFormSpriteKey(formIndex?: integer) { + getFormSpriteKey(formIndex?: number) { if (this.forms.length && (formIndex !== undefined && formIndex >= this.forms.length)) { console.warn(`Attempted accessing form with index ${formIndex} of species ${this.getName()} with only ${this.forms.length || 0} forms`); formIndex = Math.min(formIndex, this.forms.length - 1); @@ -919,16 +937,17 @@ export class PokemonForm extends PokemonSpeciesForm { private starterSelectableKeys: string[] = [ "10", "50", "10-pc", "50-pc", "red", "orange", "yellow", "green", "blue", "indigo", "violet" ]; constructor(formName: string, formKey: string, type1: Type, type2: Type | null, height: number, weight: number, ability1: Abilities, ability2: Abilities, abilityHidden: Abilities, - baseTotal: integer, baseHp: integer, baseAtk: integer, baseDef: integer, baseSpatk: integer, baseSpdef: integer, baseSpd: integer, - catchRate: integer, baseFriendship: integer, baseExp: integer, genderDiffs?: boolean, formSpriteKey?: string | null, isStarterSelectable?: boolean, ) { + baseTotal: number, baseHp: number, baseAtk: number, baseDef: number, baseSpatk: number, baseSpdef: number, baseSpd: number, + catchRate: number, baseFriendship: number, baseExp: number, genderDiffs: boolean = false, formSpriteKey: string | null = null, isStarterSelectable: boolean = false + ) { super(type1, type2, height, weight, ability1, ability2, abilityHidden, baseTotal, baseHp, baseAtk, baseDef, baseSpatk, baseSpdef, baseSpd, - catchRate, baseFriendship, baseExp, !!genderDiffs, (!!isStarterSelectable || !formKey)); + catchRate, baseFriendship, baseExp, genderDiffs, (isStarterSelectable || !formKey)); this.formName = formName; this.formKey = formKey; - this.formSpriteKey = formSpriteKey !== undefined ? formSpriteKey : null; + this.formSpriteKey = formSpriteKey; } - getFormSpriteKey(_formIndex?: integer) { + getFormSpriteKey(_formIndex?: number) { return this.formSpriteKey !== null ? this.formSpriteKey : this.formKey; } } @@ -1864,7 +1883,7 @@ export function initSpecies() { new PokemonSpecies(Species.ALOMOMOLA, 5, false, false, false, "Caring Pokémon", Type.WATER, null, 1.2, 31.6, Abilities.HEALER, Abilities.HYDRATION, Abilities.REGENERATOR, 470, 165, 75, 80, 40, 45, 65, 75, 70, 165, GrowthRate.FAST, 50, false), new PokemonSpecies(Species.JOLTIK, 5, false, false, false, "Attaching Pokémon", Type.BUG, Type.ELECTRIC, 0.1, 0.6, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 319, 50, 47, 50, 57, 50, 65, 190, 50, 64, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.GALVANTULA, 5, false, false, false, "EleSpider Pokémon", Type.BUG, Type.ELECTRIC, 0.8, 14.3, Abilities.COMPOUND_EYES, Abilities.UNNERVE, Abilities.SWARM, 472, 70, 77, 60, 97, 60, 108, 75, 50, 165, GrowthRate.MEDIUM_FAST, 50, false), - new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.IRON_BARBS, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), + new PokemonSpecies(Species.FERROSEED, 5, false, false, false, "Thorn Seed Pokémon", Type.GRASS, Type.STEEL, 0.6, 18.8, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 305, 44, 50, 91, 24, 86, 10, 255, 50, 61, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.FERROTHORN, 5, false, false, false, "Thorn Pod Pokémon", Type.GRASS, Type.STEEL, 1, 110, Abilities.IRON_BARBS, Abilities.NONE, Abilities.ANTICIPATION, 489, 74, 94, 131, 54, 116, 20, 90, 50, 171, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.KLINK, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.3, 21, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 300, 40, 55, 70, 45, 60, 30, 130, 50, 60, GrowthRate.MEDIUM_SLOW, null, false), new PokemonSpecies(Species.KLANG, 5, false, false, false, "Gear Pokémon", Type.STEEL, null, 0.6, 51, Abilities.PLUS, Abilities.MINUS, Abilities.CLEAR_BODY, 440, 60, 80, 95, 70, 85, 50, 60, 50, 154, GrowthRate.MEDIUM_SLOW, null, false), @@ -2580,11 +2599,11 @@ export function initSpecies() { new PokemonSpecies(Species.VAROOM, 9, false, false, false, "Single-Cyl Pokémon", Type.STEEL, Type.POISON, 1, 35, Abilities.OVERCOAT, Abilities.NONE, Abilities.SLOW_START, 300, 45, 70, 63, 30, 45, 47, 190, 50, 60, GrowthRate.MEDIUM_FAST, 50, false), new PokemonSpecies(Species.REVAVROOM, 9, false, false, false, "Multi-Cyl Pokémon", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, GrowthRate.MEDIUM_FAST, 50, false, false, new PokemonForm("Normal", "", Type.STEEL, Type.POISON, 1.8, 120, Abilities.OVERCOAT, Abilities.NONE, Abilities.FILTER, 500, 80, 119, 90, 54, 67, 90, 75, 50, 175, false, null, true), - new PokemonForm("Segin Starmobile", "segin-starmobile", Type.STEEL, Type.DARK, 1.8, 240, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 120, 129, 100, 59, 77, 115, 75, 50, 175), - new PokemonForm("Schedar Starmobile", "schedar-starmobile", Type.STEEL, Type.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 120, 129, 100, 59, 77, 115, 75, 50, 175), - new PokemonForm("Navi Starmobile", "navi-starmobile", Type.STEEL, Type.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 120, 129, 100, 59, 77, 115, 75, 50, 175), - new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", Type.STEEL, Type.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 120, 129, 100, 59, 77, 115, 75, 50, 175), - new PokemonForm("Caph Starmobile", "caph-starmobile", Type.STEEL, Type.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 120, 129, 100, 59, 77, 115, 75, 50, 175), + new PokemonForm("Segin Starmobile", "segin-starmobile", Type.STEEL, Type.DARK, 1.8, 240, Abilities.INTIMIDATE, Abilities.NONE, Abilities.INTIMIDATE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Schedar Starmobile", "schedar-starmobile", Type.STEEL, Type.FIRE, 1.8, 240, Abilities.SPEED_BOOST, Abilities.NONE, Abilities.SPEED_BOOST, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Navi Starmobile", "navi-starmobile", Type.STEEL, Type.POISON, 1.8, 240, Abilities.TOXIC_DEBRIS, Abilities.NONE, Abilities.TOXIC_DEBRIS, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Ruchbah Starmobile", "ruchbah-starmobile", Type.STEEL, Type.FAIRY, 1.8, 240, Abilities.MISTY_SURGE, Abilities.NONE, Abilities.MISTY_SURGE, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), + new PokemonForm("Caph Starmobile", "caph-starmobile", Type.STEEL, Type.FIGHTING, 1.8, 240, Abilities.STAMINA, Abilities.NONE, Abilities.STAMINA, 600, 110, 129, 100, 77, 79, 105, 75, 50, 175), ), new PokemonSpecies(Species.CYCLIZAR, 9, false, false, false, "Mount Pokémon", Type.DRAGON, Type.NORMAL, 1.6, 63, Abilities.SHED_SKIN, Abilities.NONE, Abilities.REGENERATOR, 501, 70, 95, 65, 85, 65, 121, 190, 50, 175, GrowthRate.MEDIUM_SLOW, 50, false), new PokemonSpecies(Species.ORTHWORM, 9, false, false, false, "Earthworm Pokémon", Type.STEEL, null, 2.5, 310, Abilities.EARTH_EATER, Abilities.NONE, Abilities.SAND_VEIL, 480, 70, 85, 145, 60, 55, 65, 25, 50, 240, GrowthRate.SLOW, 50, false), diff --git a/src/data/status-effect.ts b/src/data/status-effect.ts index ffe32a02aeb..56e754ac407 100644 --- a/src/data/status-effect.ts +++ b/src/data/status-effect.ts @@ -1,4 +1,4 @@ -import * as Utils from "../utils"; +import { randIntRange } from "#app/utils"; import { StatusEffect } from "#enums/status-effect"; import i18next, { ParseKeys } from "i18next"; @@ -6,17 +6,21 @@ export { StatusEffect }; export class Status { public effect: StatusEffect; - public turnCount: integer; - public cureTurn: integer | null; + /** Toxic damage is `1/16 max HP * toxicTurnCount` */ + public toxicTurnCount: number = 0; + public sleepTurnsRemaining?: number; - constructor(effect: StatusEffect, turnCount: integer = 0, cureTurn?: integer) { + constructor(effect: StatusEffect, toxicTurnCount: number = 0, sleepTurnsRemaining?: number) { this.effect = effect; - this.turnCount = turnCount === undefined ? 0 : turnCount; - this.cureTurn = cureTurn!; // TODO: is this bang correct? + this.toxicTurnCount = toxicTurnCount; + this.sleepTurnsRemaining = sleepTurnsRemaining; } incrementTurn(): void { - this.turnCount++; + this.toxicTurnCount++; + if (this.sleepTurnsRemaining) { + this.sleepTurnsRemaining--; + } } isPostTurn(): boolean { @@ -26,20 +30,20 @@ export class Status { function getStatusEffectMessageKey(statusEffect: StatusEffect | undefined): string { switch (statusEffect) { - case StatusEffect.POISON: - return "statusEffect:poison"; - case StatusEffect.TOXIC: - return "statusEffect:toxic"; - case StatusEffect.PARALYSIS: - return "statusEffect:paralysis"; - case StatusEffect.SLEEP: - return "statusEffect:sleep"; - case StatusEffect.FREEZE: - return "statusEffect:freeze"; - case StatusEffect.BURN: - return "statusEffect:burn"; - default: - return "statusEffect:none"; + case StatusEffect.POISON: + return "statusEffect:poison"; + case StatusEffect.TOXIC: + return "statusEffect:toxic"; + case StatusEffect.PARALYSIS: + return "statusEffect:paralysis"; + case StatusEffect.SLEEP: + return "statusEffect:sleep"; + case StatusEffect.FREEZE: + return "statusEffect:freeze"; + case StatusEffect.BURN: + return "statusEffect:burn"; + default: + return "statusEffect:none"; } } @@ -90,14 +94,14 @@ export function getStatusEffectDescriptor(statusEffect: StatusEffect): string { export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): number { switch (statusEffect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - case StatusEffect.PARALYSIS: - case StatusEffect.BURN: - return 1.5; - case StatusEffect.SLEEP: - case StatusEffect.FREEZE: - return 2.5; + case StatusEffect.POISON: + case StatusEffect.TOXIC: + case StatusEffect.PARALYSIS: + case StatusEffect.BURN: + return 1.5; + case StatusEffect.SLEEP: + case StatusEffect.FREEZE: + return 2.5; } return 1; @@ -107,7 +111,7 @@ export function getStatusEffectCatchRateMultiplier(statusEffect: StatusEffect): * Returns a random non-volatile StatusEffect */ export function generateRandomStatusEffect(): StatusEffect { - return Utils.randIntRange(1, 6); + return randIntRange(1, 6); } /** @@ -123,7 +127,7 @@ export function getRandomStatusEffect(statusEffectA: StatusEffect, statusEffectB return statusEffectA; } - return Utils.randIntRange(0, 2) ? statusEffectA : statusEffectB; + return randIntRange(0, 2) ? statusEffectA : statusEffectB; } /** @@ -140,7 +144,7 @@ export function getRandomStatus(statusA: Status | null, statusB: Status | null): } - return Utils.randIntRange(0, 2) ? statusA : statusB; + return randIntRange(0, 2) ? statusA : statusB; } /** diff --git a/src/data/terrain.ts b/src/data/terrain.ts index 6db68b92239..d8ee8d67925 100644 --- a/src/data/terrain.ts +++ b/src/data/terrain.ts @@ -34,21 +34,21 @@ export class Terrain { getAttackTypeMultiplier(attackType: Type): number { switch (this.terrainType) { - case TerrainType.ELECTRIC: - if (attackType === Type.ELECTRIC) { - return 1.3; - } - break; - case TerrainType.GRASSY: - if (attackType === Type.GRASS) { - return 1.3; - } - break; - case TerrainType.PSYCHIC: - if (attackType === Type.PSYCHIC) { - return 1.3; - } - break; + case TerrainType.ELECTRIC: + if (attackType === Type.ELECTRIC) { + return 1.3; + } + break; + case TerrainType.GRASSY: + if (attackType === Type.GRASS) { + return 1.3; + } + break; + case TerrainType.PSYCHIC: + if (attackType === Type.PSYCHIC) { + return 1.3; + } + break; } return 1; @@ -56,13 +56,13 @@ export class Terrain { isMoveTerrainCancelled(user: Pokemon, targets: BattlerIndex[], move: Move): boolean { switch (this.terrainType) { - case TerrainType.PSYCHIC: - if (!move.hasAttr(ProtectAttr)) { - const priority = new Utils.IntegerHolder(move.priority); - applyAbAttrs(ChangeMovePriorityAbAttr, user, null, false, move, priority); - // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain - return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); - } + case TerrainType.PSYCHIC: + if (!move.hasAttr(ProtectAttr)) { + const priority = new Utils.IntegerHolder(move.priority); + applyAbAttrs(ChangeMovePriorityAbAttr, user, null, false, move, priority); + // Cancels move if the move has positive priority and targets a Pokemon grounded on the Psychic Terrain + return priority.value > 0 && user.getOpponents().some(o => targets.includes(o.getBattlerIndex()) && o.isGrounded()); + } } return false; @@ -71,14 +71,14 @@ export class Terrain { export function getTerrainName(terrainType: TerrainType): string { switch (terrainType) { - case TerrainType.MISTY: - return i18next.t("terrain:misty"); - case TerrainType.ELECTRIC: - return i18next.t("terrain:electric"); - case TerrainType.GRASSY: - return i18next.t("terrain:grassy"); - case TerrainType.PSYCHIC: - return i18next.t("terrain:psychic"); + case TerrainType.MISTY: + return i18next.t("terrain:misty"); + case TerrainType.ELECTRIC: + return i18next.t("terrain:electric"); + case TerrainType.GRASSY: + return i18next.t("terrain:grassy"); + case TerrainType.PSYCHIC: + return i18next.t("terrain:psychic"); } return ""; @@ -87,14 +87,14 @@ export function getTerrainName(terrainType: TerrainType): string { export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] { switch (terrainType) { - case TerrainType.MISTY: - return [ 232, 136, 200 ]; - case TerrainType.ELECTRIC: - return [ 248, 248, 120 ]; - case TerrainType.GRASSY: - return [ 120, 200, 80 ]; - case TerrainType.PSYCHIC: - return [ 160, 64, 160 ]; + case TerrainType.MISTY: + return [ 232, 136, 200 ]; + case TerrainType.ELECTRIC: + return [ 248, 248, 120 ]; + case TerrainType.GRASSY: + return [ 120, 200, 80 ]; + case TerrainType.PSYCHIC: + return [ 160, 64, 160 ]; } return [ 0, 0, 0 ]; diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts index bbeecba84e6..18bcec1f928 100644 --- a/src/data/trainer-config.ts +++ b/src/data/trainer-config.ts @@ -203,6 +203,7 @@ export class TrainerConfig { public modifierRewardFuncs: ModifierTypeFunc[] = []; public partyTemplates: TrainerPartyTemplate[]; public partyTemplateFunc: PartyTemplateFunc; + public eventRewardFuncs: ModifierTypeFunc[] = []; public partyMemberFuncs: PartyMemberFuncs = {}; public speciesPools: TrainerTierPools; public speciesFilter: PokemonSpeciesFilter; @@ -299,65 +300,65 @@ export class TrainerConfig { getDerivedType(trainerTypeToDeriveFrom: TrainerType | null = null): TrainerType { let trainerType = trainerTypeToDeriveFrom ? trainerTypeToDeriveFrom : this.trainerType; switch (trainerType) { - case TrainerType.RIVAL_2: - case TrainerType.RIVAL_3: - case TrainerType.RIVAL_4: - case TrainerType.RIVAL_5: - case TrainerType.RIVAL_6: - trainerType = TrainerType.RIVAL; - break; - case TrainerType.LANCE_CHAMPION: - trainerType = TrainerType.LANCE; - break; - case TrainerType.LARRY_ELITE: - trainerType = TrainerType.LARRY; - break; - case TrainerType.ROCKET_BOSS_GIOVANNI_1: - case TrainerType.ROCKET_BOSS_GIOVANNI_2: - trainerType = TrainerType.GIOVANNI; - break; - case TrainerType.MAXIE_2: - trainerType = TrainerType.MAXIE; - break; - case TrainerType.ARCHIE_2: - trainerType = TrainerType.ARCHIE; - break; - case TrainerType.CYRUS_2: - trainerType = TrainerType.CYRUS; - break; - case TrainerType.GHETSIS_2: - trainerType = TrainerType.GHETSIS; - break; - case TrainerType.LYSANDRE_2: - trainerType = TrainerType.LYSANDRE; - break; - case TrainerType.LUSAMINE_2: - trainerType = TrainerType.LUSAMINE; - break; - case TrainerType.GUZMA_2: - trainerType = TrainerType.GUZMA; - break; - case TrainerType.ROSE_2: - trainerType = TrainerType.ROSE; - break; - case TrainerType.PENNY_2: - trainerType = TrainerType.PENNY; - break; - case TrainerType.MARNIE_ELITE: - trainerType = TrainerType.MARNIE; - break; - case TrainerType.NESSA_ELITE: - trainerType = TrainerType.NESSA; - break; - case TrainerType.BEA_ELITE: - trainerType = TrainerType.BEA; - break; - case TrainerType.ALLISTER_ELITE: - trainerType = TrainerType.ALLISTER; - break; - case TrainerType.RAIHAN_ELITE: - trainerType = TrainerType.RAIHAN; - break; + case TrainerType.RIVAL_2: + case TrainerType.RIVAL_3: + case TrainerType.RIVAL_4: + case TrainerType.RIVAL_5: + case TrainerType.RIVAL_6: + trainerType = TrainerType.RIVAL; + break; + case TrainerType.LANCE_CHAMPION: + trainerType = TrainerType.LANCE; + break; + case TrainerType.LARRY_ELITE: + trainerType = TrainerType.LARRY; + break; + case TrainerType.ROCKET_BOSS_GIOVANNI_1: + case TrainerType.ROCKET_BOSS_GIOVANNI_2: + trainerType = TrainerType.GIOVANNI; + break; + case TrainerType.MAXIE_2: + trainerType = TrainerType.MAXIE; + break; + case TrainerType.ARCHIE_2: + trainerType = TrainerType.ARCHIE; + break; + case TrainerType.CYRUS_2: + trainerType = TrainerType.CYRUS; + break; + case TrainerType.GHETSIS_2: + trainerType = TrainerType.GHETSIS; + break; + case TrainerType.LYSANDRE_2: + trainerType = TrainerType.LYSANDRE; + break; + case TrainerType.LUSAMINE_2: + trainerType = TrainerType.LUSAMINE; + break; + case TrainerType.GUZMA_2: + trainerType = TrainerType.GUZMA; + break; + case TrainerType.ROSE_2: + trainerType = TrainerType.ROSE; + break; + case TrainerType.PENNY_2: + trainerType = TrainerType.PENNY; + break; + case TrainerType.MARNIE_ELITE: + trainerType = TrainerType.MARNIE; + break; + case TrainerType.NESSA_ELITE: + trainerType = TrainerType.NESSA; + break; + case TrainerType.BEA_ELITE: + trainerType = TrainerType.BEA; + break; + case TrainerType.ALLISTER_ELITE: + trainerType = TrainerType.ALLISTER; + break; + case TrainerType.RAIHAN_ELITE: + trainerType = TrainerType.RAIHAN; + break; } return trainerType; @@ -546,6 +547,17 @@ export class TrainerConfig { return this; } + setEventModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { + this.eventRewardFuncs = modifierTypeFuncs.map(func => () => { + const modifierTypeFunc = func(); + const modifierType = modifierTypeFunc(); + modifierType.withIdFromFunc(modifierTypeFunc); + return modifierType; + }); + return this; + } + + setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig { this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => { const modifierTypeFunc = func(); @@ -564,104 +576,104 @@ export class TrainerConfig { speciesPoolPerEvilTeamAdmin(team): TrainerTierPools { team = team.toLowerCase(); switch (team) { - case "rocket": { - return { - [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], - [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], - [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] - }; - } - case "magma": { - return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], - [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] - }; - } - case "aqua": { - return { - [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], - [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], - [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] - }; - } - case "galactic": { - return { - [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], - [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], - [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] - }; - } - case "plasma": { - return { - [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], - [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], - [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] - }; - } - case "flare": { - return { - [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], - [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], - [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] - }; - } - case "aether": { - return { - [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], - [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] - }; - } - case "skull": { - return { - [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], - [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], - [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] - }; - } - case "macro": { - return { - [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], - [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], - [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] - }; - } - case "star_1": { - return { - [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], - [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], - [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] - }; - } - case "star_2": { - return { - [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], - [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], - [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] - }; - } - case "star_3": { - return { - [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], - [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], - [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] - }; - } - case "star_4": { - return { - [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], - [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], - [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] - }; - } - case "star_5": { - return { - [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], - [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], - [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] - }; - } + case "rocket": { + return { + [TrainerPoolTier.COMMON]: [ Species.RATTATA, Species.KOFFING, Species.EKANS, Species.ZUBAT, Species.MAGIKARP, Species.HOUNDOUR, Species.ONIX, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB, Species.DROWZEE, Species.VILEPLUME ], + [TrainerPoolTier.UNCOMMON]: [ Species.PORYGON, Species.MANKEY, Species.MAGNEMITE, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE, Species.PALDEA_TAUROS, Species.OMANYTE, Species.KABUTO, Species.MAGBY, Species.ELEKID ], + [TrainerPoolTier.RARE]: [ Species.DRATINI, Species.LARVITAR ] + }; + } + case "magma": { + return { + [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.BALTOY, Species.ROLYCOLY, Species.GLIGAR, Species.TORKOAL, Species.HOUNDOUR, Species.MAGBY ], + [TrainerPoolTier.UNCOMMON]: [ Species.TRAPINCH, Species.SILICOBRA, Species.RHYHORN, Species.ANORITH, Species.LILEEP, Species.HISUI_GROWLITHE, Species.TURTONATOR, Species.ARON, Species.TOEDSCOOL ], + [TrainerPoolTier.RARE]: [ Species.CAPSAKID, Species.CHARCADET ] + }; + } + case "aqua": { + return { + [TrainerPoolTier.COMMON]: [ Species.CORPHISH, Species.SPHEAL, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.AZURILL, Species.LOTAD, Species.WAILMER, Species.REMORAID, Species.BARBOACH ], + [TrainerPoolTier.UNCOMMON]: [ Species.MANTYKE, Species.HISUI_QWILFISH, Species.ARROKUDA, Species.DHELMISE, Species.CLOBBOPUS, Species.FEEBAS, Species.PALDEA_WOOPER, Species.HORSEA, Species.SKRELP ], + [TrainerPoolTier.RARE]: [ Species.DONDOZO, Species.BASCULEGION ] + }; + } + case "galactic": { + return { + [TrainerPoolTier.COMMON]: [ Species.BRONZOR, Species.SWINUB, Species.YANMA, Species.LICKITUNG, Species.TANGELA, Species.MAGBY, Species.ELEKID, Species.SKORUPI, Species.ZUBAT, Species.MURKROW, Species.MAGIKARP, Species.VOLTORB ], + [TrainerPoolTier.UNCOMMON]: [ Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.SNEASEL, Species.DUSKULL, Species.ROTOM, Species.HISUI_VOLTORB, Species.GLIGAR, Species.ABRA ], + [TrainerPoolTier.RARE]: [ Species.URSALUNA, Species.HISUI_LILLIGANT, Species.SPIRITOMB, Species.HISUI_SNEASEL ] + }; + } + case "plasma": { + return { + [TrainerPoolTier.COMMON]: [ Species.YAMASK, Species.ROGGENROLA, Species.JOLTIK, Species.TYMPOLE, Species.FRILLISH, Species.FERROSEED, Species.SANDILE, Species.TIMBURR, Species.DARUMAKA, Species.FOONGUS, Species.CUBCHOO, Species.VANILLITE ], + [TrainerPoolTier.UNCOMMON]: [ Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK, Species.TYNAMO, Species.GALAR_DARUMAKA, Species.GOLETT, Species.MIENFOO, Species.DURANT, Species.SIGILYPH ], + [TrainerPoolTier.RARE]: [ Species.HISUI_ZORUA, Species.AXEW, Species.DEINO, Species.HISUI_BRAVIARY ] + }; + } + case "flare": { + return { + [TrainerPoolTier.COMMON]: [ Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.FOONGUS, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKORUPI, Species.PURRLOIN, Species.CLAWITZER, Species.PANCHAM, Species.ESPURR, Species.BUNNELBY ], + [TrainerPoolTier.UNCOMMON]: [ Species.LITWICK, Species.SNEASEL, Species.PUMPKABOO, Species.PHANTUMP, Species.HONEDGE, Species.BINACLE, Species.HOUNDOUR, Species.SKRELP, Species.SLIGGOO ], + [TrainerPoolTier.RARE]: [ Species.NOIBAT, Species.HISUI_AVALUGG, Species.HISUI_SLIGGOO ] + }; + } + case "aether": { + return { + [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU, Species.BLIPBUG, Species.GIRAFARIG, Species.ORANGURU ], + [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.MEDITITE, Species.BELDUM, Species.HATENNA, Species.INKAY, Species.RALTS, Species.GALAR_MR_MIME ], + [TrainerPoolTier.RARE]: [ Species.ARMAROUGE, Species.HISUI_BRAVIARY, Species.PORYGON ] + }; + } + case "skull": { + return { + [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.FOMANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING, Species.STUNKY, Species.CROAGUNK, Species.NIDORAN_F ], + [TrainerPoolTier.UNCOMMON]: [ Species.GALAR_SLOWPOKE, Species.SKORUPI, Species.PALDEA_WOOPER, Species.VULLABY, Species.HISUI_QWILFISH, Species.GLIMMET ], + [TrainerPoolTier.RARE]: [ Species.SKRELP, Species.HISUI_SNEASEL ] + }; + } + case "macro": { + return { + [TrainerPoolTier.COMMON]: [ Species.HATENNA, Species.FEEBAS, Species.BOUNSWEET, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS, Species.VULPIX, Species.FRILLISH, Species.ODDISH, Species.SINISTEA ], + [TrainerPoolTier.UNCOMMON]: [ Species.VULLABY, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.APPLIN ], + [TrainerPoolTier.RARE]: [ Species.TINKATINK, Species.HISUI_LILLIGANT ] + }; + } + case "star_1": { + return { + [TrainerPoolTier.COMMON]: [ Species.MURKROW, Species.SEEDOT, Species.CACNEA, Species.STUNKY, Species.SANDILE, Species.NYMBLE, Species.MASCHIFF, Species.GALAR_ZIGZAGOON ], + [TrainerPoolTier.UNCOMMON]: [ Species.UMBREON, Species.SNEASEL, Species.CORPHISH, Species.ZORUA, Species.INKAY, Species.BOMBIRDIER ], + [TrainerPoolTier.RARE]: [ Species.DEINO, Species.SPRIGATITO ] + }; + } + case "star_2": { + return { + [TrainerPoolTier.COMMON]: [ Species.GROWLITHE, Species.HOUNDOUR, Species.NUMEL, Species.LITWICK, Species.FLETCHLING, Species.LITLEO, Species.ROLYCOLY, Species.CAPSAKID ], + [TrainerPoolTier.UNCOMMON]: [ Species.PONYTA, Species.FLAREON, Species.MAGBY, Species.TORKOAL, Species.SALANDIT, Species.TURTONATOR ], + [TrainerPoolTier.RARE]: [ Species.LARVESTA, Species.FUECOCO ] + }; + } + case "star_3": { + return { + [TrainerPoolTier.COMMON]: [ Species.ZUBAT, Species.GRIMER, Species.STUNKY, Species.FOONGUS, Species.MAREANIE, Species.TOXEL, Species.SHROODLE, Species.PALDEA_WOOPER ], + [TrainerPoolTier.UNCOMMON]: [ Species.GASTLY, Species.SEVIPER, Species.SKRELP, Species.ALOLA_GRIMER, Species.GALAR_SLOWPOKE, Species.HISUI_QWILFISH ], + [TrainerPoolTier.RARE]: [ Species.GLIMMET, Species.BULBASAUR ] + }; + } + case "star_4": { + return { + [TrainerPoolTier.COMMON]: [ Species.CLEFFA, Species.IGGLYBUFF, Species.AZURILL, Species.COTTONEE, Species.FLABEBE, Species.HATENNA, Species.IMPIDIMP, Species.TINKATINK ], + [TrainerPoolTier.UNCOMMON]: [ Species.TOGEPI, Species.GARDEVOIR, Species.SYLVEON, Species.KLEFKI, Species.MIMIKYU, Species.ALOLA_VULPIX ], + [TrainerPoolTier.RARE]: [ Species.GALAR_PONYTA, Species.POPPLIO ] + }; + } + case "star_5": { + return { + [TrainerPoolTier.COMMON]: [ Species.SHROOMISH, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.SCRAGGY, Species.MIENFOO, Species.PAWMI, Species.PALDEA_TAUROS ], + [TrainerPoolTier.UNCOMMON]: [ Species.RIOLU, Species.TIMBURR, Species.HAWLUCHA, Species.PASSIMIAN, Species.FALINKS, Species.FLAMIGO ], + [TrainerPoolTier.RARE]: [ Species.JANGMO_O, Species.QUAXLY ] + }; + } } console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`); @@ -1828,10 +1840,12 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.RIVAL]: new TrainerConfig((t = TrainerType.RIVAL)).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL) .setModifierRewardFuncs(() => modifierTypes.SUPER_EXP_CHARM, () => modifierTypes.EXP_SHARE) + .setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM, () => modifierTypes.ABILITY_CHARM) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE, Species.CHIKORITA, Species.CYNDAQUIL, Species.TOTODILE, Species.TREECKO, Species.TORCHIC, Species.MUDKIP, Species.TURTWIG, Species.CHIMCHAR, Species.PIPLUP, Species.SNIVY, Species.TEPIG, Species.OSHAWOTT, Species.CHESPIN, Species.FENNEKIN, Species.FROAKIE, Species.ROWLET, Species.LITTEN, Species.POPPLIO, Species.GROOKEY, Species.SCORBUNNY, Species.SOBBLE, Species.SPRIGATITO, Species.FUECOCO, Species.QUAXLY ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEY, Species.HOOTHOOT, Species.TAILLOW, Species.STARLY, Species.PIDOVE, Species.FLETCHLING, Species.PIKIPEK, Species.ROOKIDEE, Species.WATTREL ], TrainerSlot.TRAINER, true)), [TrainerType.RIVAL_2]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_2) .setModifierRewardFuncs(() => modifierTypes.EXP_SHARE) + .setEventModifierRewardFuncs(() => modifierTypes.SHINY_CHARM) .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL ], TrainerSlot.TRAINER, true)) .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)), @@ -2500,6 +2514,22 @@ export const trainerConfigs: TrainerConfigs = { [TrainerType.BUG_TYPE_SUPERFAN]: new TrainerConfig(++t).setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER) .setPartyTemplates(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE)), [TrainerType.EXPERT_POKEMON_BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(3).setEncounterBgm(TrainerType.ACE_TRAINER).setLocalizedName("Expert Pokemon Breeder") - .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.STRONG)) + .setPartyTemplates(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE)), + [TrainerType.FUTURE_SELF_M]: new TrainerConfig(++t) + .setMoneyMultiplier(0) + .setEncounterBgm("mystery_encounter_weird_dream") + .setBattleBgm("mystery_encounter_weird_dream") + .setMixedBattleBgm("mystery_encounter_weird_dream") + .setVictoryBgm("mystery_encounter_weird_dream") + .setLocalizedName("Future Self M") + .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)), + [TrainerType.FUTURE_SELF_F]: new TrainerConfig(++t) + .setMoneyMultiplier(0) + .setEncounterBgm("mystery_encounter_weird_dream") + .setBattleBgm("mystery_encounter_weird_dream") + .setMixedBattleBgm("mystery_encounter_weird_dream") + .setVictoryBgm("mystery_encounter_weird_dream") + .setLocalizedName("Future Self F") + .setPartyTemplates(new TrainerPartyTemplate(6, PartyMemberStrength.STRONG)) }; diff --git a/src/data/type.ts b/src/data/type.ts index 47bea8dd72b..483ec068d3c 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -29,260 +29,260 @@ export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDa } switch (defType) { - case Type.NORMAL: - switch (attackType) { - case Type.FIGHTING: - return 2; - case Type.GHOST: - return 0; - default: - return 1; - } - case Type.FIGHTING: - switch (attackType) { - case Type.FLYING: - case Type.PSYCHIC: - case Type.FAIRY: - return 2; - case Type.ROCK: - case Type.BUG: - case Type.DARK: - return 0.5; - default: - return 1; - } - case Type.FLYING: - switch (attackType) { - case Type.ROCK: - case Type.ELECTRIC: - case Type.ICE: - return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.GRASS: - return 0.5; - case Type.GROUND: - return 0; - default: - return 1; - } - case Type.POISON: - switch (attackType) { - case Type.GROUND: - case Type.PSYCHIC: - return 2; - case Type.FIGHTING: - case Type.POISON: - case Type.BUG: - case Type.GRASS: - case Type.FAIRY: - return 0.5; - default: - return 1; - } - case Type.GROUND: - switch (attackType) { - case Type.WATER: - case Type.GRASS: - case Type.ICE: - return 2; - case Type.POISON: - case Type.ROCK: - return 0.5; - case Type.ELECTRIC: - return 0; - default: - return 1; - } - case Type.ROCK: - switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.STEEL: - case Type.WATER: - case Type.GRASS: - return 2; case Type.NORMAL: - case Type.FLYING: - case Type.POISON: - case Type.FIRE: - return 0.5; - default: - return 1; - } - case Type.BUG: - switch (attackType) { - case Type.FLYING: - case Type.ROCK: - case Type.FIRE: - return 2; + switch (attackType) { + case Type.FIGHTING: + return 2; + case Type.GHOST: + return 0; + default: + return 1; + } case Type.FIGHTING: + switch (attackType) { + case Type.FLYING: + case Type.PSYCHIC: + case Type.FAIRY: + return 2; + case Type.ROCK: + case Type.BUG: + case Type.DARK: + return 0.5; + default: + return 1; + } + case Type.FLYING: + switch (attackType) { + case Type.ROCK: + case Type.ELECTRIC: + case Type.ICE: + return 2; + case Type.FIGHTING: + case Type.BUG: + case Type.GRASS: + return 0.5; + case Type.GROUND: + return 0; + default: + return 1; + } + case Type.POISON: + switch (attackType) { + case Type.GROUND: + case Type.PSYCHIC: + return 2; + case Type.FIGHTING: + case Type.POISON: + case Type.BUG: + case Type.GRASS: + case Type.FAIRY: + return 0.5; + default: + return 1; + } case Type.GROUND: - case Type.GRASS: - return 0.5; - default: - return 1; - } - case Type.GHOST: - switch (attackType) { + switch (attackType) { + case Type.WATER: + case Type.GRASS: + case Type.ICE: + return 2; + case Type.POISON: + case Type.ROCK: + return 0.5; + case Type.ELECTRIC: + return 0; + default: + return 1; + } + case Type.ROCK: + switch (attackType) { + case Type.FIGHTING: + case Type.GROUND: + case Type.STEEL: + case Type.WATER: + case Type.GRASS: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.POISON: + case Type.FIRE: + return 0.5; + default: + return 1; + } + case Type.BUG: + switch (attackType) { + case Type.FLYING: + case Type.ROCK: + case Type.FIRE: + return 2; + case Type.FIGHTING: + case Type.GROUND: + case Type.GRASS: + return 0.5; + default: + return 1; + } case Type.GHOST: - case Type.DARK: - return 2; - case Type.POISON: - case Type.BUG: - return 0.5; - case Type.NORMAL: - case Type.FIGHTING: - return 0; - default: - return 1; - } - case Type.STEEL: - switch (attackType) { - case Type.FIGHTING: - case Type.GROUND: - case Type.FIRE: - return 2; - case Type.NORMAL: - case Type.FLYING: - case Type.ROCK: - case Type.BUG: + switch (attackType) { + case Type.GHOST: + case Type.DARK: + return 2; + case Type.POISON: + case Type.BUG: + return 0.5; + case Type.NORMAL: + case Type.FIGHTING: + return 0; + default: + return 1; + } case Type.STEEL: + switch (attackType) { + case Type.FIGHTING: + case Type.GROUND: + case Type.FIRE: + return 2; + case Type.NORMAL: + case Type.FLYING: + case Type.ROCK: + case Type.BUG: + case Type.STEEL: + case Type.GRASS: + case Type.PSYCHIC: + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 0.5; + case Type.POISON: + return 0; + default: + return 1; + } + case Type.FIRE: + switch (attackType) { + case Type.GROUND: + case Type.ROCK: + case Type.WATER: + return 2; + case Type.BUG: + case Type.STEEL: + case Type.FIRE: + case Type.GRASS: + case Type.ICE: + case Type.FAIRY: + return 0.5; + default: + return 1; + } + case Type.WATER: + switch (attackType) { + case Type.GRASS: + case Type.ELECTRIC: + return 2; + case Type.STEEL: + case Type.FIRE: + case Type.WATER: + case Type.ICE: + return 0.5; + default: + return 1; + } case Type.GRASS: + switch (attackType) { + case Type.FLYING: + case Type.POISON: + case Type.BUG: + case Type.FIRE: + case Type.ICE: + return 2; + case Type.GROUND: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + return 0.5; + default: + return 1; + } + case Type.ELECTRIC: + switch (attackType) { + case Type.GROUND: + return 2; + case Type.FLYING: + case Type.STEEL: + case Type.ELECTRIC: + return 0.5; + default: + return 1; + } case Type.PSYCHIC: + switch (attackType) { + case Type.BUG: + case Type.GHOST: + case Type.DARK: + return 2; + case Type.FIGHTING: + case Type.PSYCHIC: + return 0.5; + default: + return 1; + } case Type.ICE: + switch (attackType) { + case Type.FIGHTING: + case Type.ROCK: + case Type.STEEL: + case Type.FIRE: + return 2; + case Type.ICE: + return 0.5; + default: + return 1; + } case Type.DRAGON: - case Type.FAIRY: - return 0.5; - case Type.POISON: - return 0; - default: - return 1; - } - case Type.FIRE: - switch (attackType) { - case Type.GROUND: - case Type.ROCK: - case Type.WATER: - return 2; - case Type.BUG: - case Type.STEEL: - case Type.FIRE: - case Type.GRASS: - case Type.ICE: - case Type.FAIRY: - return 0.5; - default: - return 1; - } - case Type.WATER: - switch (attackType) { - case Type.GRASS: - case Type.ELECTRIC: - return 2; - case Type.STEEL: - case Type.FIRE: - case Type.WATER: - case Type.ICE: - return 0.5; - default: - return 1; - } - case Type.GRASS: - switch (attackType) { - case Type.FLYING: - case Type.POISON: - case Type.BUG: - case Type.FIRE: - case Type.ICE: - return 2; - case Type.GROUND: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - return 0.5; - default: - return 1; - } - case Type.ELECTRIC: - switch (attackType) { - case Type.GROUND: - return 2; - case Type.FLYING: - case Type.STEEL: - case Type.ELECTRIC: - return 0.5; - default: - return 1; - } - case Type.PSYCHIC: - switch (attackType) { - case Type.BUG: - case Type.GHOST: + switch (attackType) { + case Type.ICE: + case Type.DRAGON: + case Type.FAIRY: + return 2; + case Type.FIRE: + case Type.WATER: + case Type.GRASS: + case Type.ELECTRIC: + return 0.5; + default: + return 1; + } case Type.DARK: - return 2; - case Type.FIGHTING: - case Type.PSYCHIC: - return 0.5; - default: - return 1; - } - case Type.ICE: - switch (attackType) { - case Type.FIGHTING: - case Type.ROCK: - case Type.STEEL: - case Type.FIRE: - return 2; - case Type.ICE: - return 0.5; - default: - return 1; - } - case Type.DRAGON: - switch (attackType) { - case Type.ICE: - case Type.DRAGON: + switch (attackType) { + case Type.FIGHTING: + case Type.BUG: + case Type.FAIRY: + return 2; + case Type.GHOST: + case Type.DARK: + return 0.5; + case Type.PSYCHIC: + return 0; + default: + return 1; + } case Type.FAIRY: - return 2; - case Type.FIRE: - case Type.WATER: - case Type.GRASS: - case Type.ELECTRIC: - return 0.5; - default: + switch (attackType) { + case Type.POISON: + case Type.STEEL: + return 2; + case Type.FIGHTING: + case Type.BUG: + case Type.DARK: + return 0.5; + case Type.DRAGON: + return 0; + default: + return 1; + } + case Type.STELLAR: return 1; - } - case Type.DARK: - switch (attackType) { - case Type.FIGHTING: - case Type.BUG: - case Type.FAIRY: - return 2; - case Type.GHOST: - case Type.DARK: - return 0.5; - case Type.PSYCHIC: - return 0; - default: - return 1; - } - case Type.FAIRY: - switch (attackType) { - case Type.POISON: - case Type.STEEL: - return 2; - case Type.FIGHTING: - case Type.BUG: - case Type.DARK: - return 0.5; - case Type.DRAGON: - return 0; - default: - return 1; - } - case Type.STELLAR: - return 1; } return 1; @@ -295,86 +295,86 @@ export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDa export function getTypeDamageMultiplierColor(multiplier: TypeDamageMultiplier, side: "defense" | "offense"): string | undefined { if (side === "offense") { switch (multiplier) { - case 0: - return "#929292"; - case 0.125: - return "#FF5500"; - case 0.25: - return "#FF7400"; - case 0.5: - return "#FE8E00"; - case 1: - return undefined; - case 2: - return "#4AA500"; - case 4: - return "#4BB400"; - case 8: - return "#52C200"; + case 0: + return "#929292"; + case 0.125: + return "#FF5500"; + case 0.25: + return "#FF7400"; + case 0.5: + return "#FE8E00"; + case 1: + return undefined; + case 2: + return "#4AA500"; + case 4: + return "#4BB400"; + case 8: + return "#52C200"; } } else if (side === "defense") { switch (multiplier) { - case 0: - return "#B1B100"; - case 0.125: - return "#2DB4FF"; - case 0.25: - return "#00A4FF"; - case 0.5: - return "#0093FF"; - case 1: - return undefined; - case 2: - return "#FE8E00"; - case 4: - return "#FF7400"; - case 8: - return "#FF5500"; + case 0: + return "#B1B100"; + case 0.125: + return "#2DB4FF"; + case 0.25: + return "#00A4FF"; + case 0.5: + return "#0093FF"; + case 1: + return undefined; + case 2: + return "#FE8E00"; + case 4: + return "#FF7400"; + case 8: + return "#FF5500"; } } } export function getTypeRgb(type: Type): [ integer, integer, integer ] { switch (type) { - case Type.NORMAL: - return [ 168, 168, 120 ]; - case Type.FIGHTING: - return [ 192, 48, 40 ]; - case Type.FLYING: - return [ 168, 144, 240 ]; - case Type.POISON: - return [ 160, 64, 160 ]; - case Type.GROUND: - return [ 224, 192, 104 ]; - case Type.ROCK: - return [ 184, 160, 56 ]; - case Type.BUG: - return [ 168, 184, 32 ]; - case Type.GHOST: - return [ 112, 88, 152 ]; - case Type.STEEL: - return [ 184, 184, 208 ]; - case Type.FIRE: - return [ 240, 128, 48 ]; - case Type.WATER: - return [ 104, 144, 240 ]; - case Type.GRASS: - return [ 120, 200, 80 ]; - case Type.ELECTRIC: - return [ 248, 208, 48 ]; - case Type.PSYCHIC: - return [ 248, 88, 136 ]; - case Type.ICE: - return [ 152, 216, 216 ]; - case Type.DRAGON: - return [ 112, 56, 248 ]; - case Type.DARK: - return [ 112, 88, 72 ]; - case Type.FAIRY: - return [ 232, 136, 200 ]; - case Type.STELLAR: - return [ 255, 255, 255 ]; - default: - return [ 0, 0, 0 ]; + case Type.NORMAL: + return [ 168, 168, 120 ]; + case Type.FIGHTING: + return [ 192, 48, 40 ]; + case Type.FLYING: + return [ 168, 144, 240 ]; + case Type.POISON: + return [ 160, 64, 160 ]; + case Type.GROUND: + return [ 224, 192, 104 ]; + case Type.ROCK: + return [ 184, 160, 56 ]; + case Type.BUG: + return [ 168, 184, 32 ]; + case Type.GHOST: + return [ 112, 88, 152 ]; + case Type.STEEL: + return [ 184, 184, 208 ]; + case Type.FIRE: + return [ 240, 128, 48 ]; + case Type.WATER: + return [ 104, 144, 240 ]; + case Type.GRASS: + return [ 120, 200, 80 ]; + case Type.ELECTRIC: + return [ 248, 208, 48 ]; + case Type.PSYCHIC: + return [ 248, 88, 136 ]; + case Type.ICE: + return [ 152, 216, 216 ]; + case Type.DRAGON: + return [ 112, 56, 248 ]; + case Type.DARK: + return [ 112, 88, 72 ]; + case Type.FAIRY: + return [ 232, 136, 200 ]; + case Type.STELLAR: + return [ 255, 255, 255 ]; + default: + return [ 0, 0, 0 ]; } } diff --git a/src/data/variant.ts b/src/data/variant.ts index b7a01a4be89..13869635f1e 100644 --- a/src/data/variant.ts +++ b/src/data/variant.ts @@ -10,22 +10,22 @@ export const variantColorCache = {}; export function getVariantTint(variant: Variant): integer { switch (variant) { - case 0: - return 0xf8c020; - case 1: - return 0x20f8f0; - case 2: - return 0xe81048; + case 0: + return 0xf8c020; + case 1: + return 0x20f8f0; + case 2: + return 0xe81048; } } export function getVariantIcon(variant: Variant): integer { switch (variant) { - case 0: - return VariantTier.STANDARD; - case 1: - return VariantTier.RARE; - case 2: - return VariantTier.EPIC; + case 0: + return VariantTier.STANDARD; + case 1: + return VariantTier.RARE; + case 2: + return VariantTier.EPIC; } } diff --git a/src/data/weather.ts b/src/data/weather.ts index 8dfa17c4ef8..20c03af77c8 100644 --- a/src/data/weather.ts +++ b/src/data/weather.ts @@ -33,10 +33,10 @@ export class Weather { isImmutable(): boolean { switch (this.weatherType) { - case WeatherType.HEAVY_RAIN: - case WeatherType.HARSH_SUN: - case WeatherType.STRONG_WINDS: - return true; + case WeatherType.HEAVY_RAIN: + case WeatherType.HARSH_SUN: + case WeatherType.STRONG_WINDS: + return true; } return false; @@ -44,9 +44,9 @@ export class Weather { isDamaging(): boolean { switch (this.weatherType) { - case WeatherType.SANDSTORM: - case WeatherType.HAIL: - return true; + case WeatherType.SANDSTORM: + case WeatherType.HAIL: + return true; } return false; @@ -54,10 +54,10 @@ export class Weather { isTypeDamageImmune(type: Type): boolean { switch (this.weatherType) { - case WeatherType.SANDSTORM: - return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; - case WeatherType.HAIL: - return type === Type.ICE; + case WeatherType.SANDSTORM: + return type === Type.GROUND || type === Type.ROCK || type === Type.STEEL; + case WeatherType.HAIL: + return type === Type.ICE; } return false; @@ -65,24 +65,24 @@ export class Weather { getAttackTypeMultiplier(attackType: Type): number { switch (this.weatherType) { - case WeatherType.SUNNY: - case WeatherType.HARSH_SUN: - if (attackType === Type.FIRE) { - return 1.5; - } - if (attackType === Type.WATER) { - return 0.5; - } - break; - case WeatherType.RAIN: - case WeatherType.HEAVY_RAIN: - if (attackType === Type.FIRE) { - return 0.5; - } - if (attackType === Type.WATER) { - return 1.5; - } - break; + case WeatherType.SUNNY: + case WeatherType.HARSH_SUN: + if (attackType === Type.FIRE) { + return 1.5; + } + if (attackType === Type.WATER) { + return 0.5; + } + break; + case WeatherType.RAIN: + case WeatherType.HEAVY_RAIN: + if (attackType === Type.FIRE) { + return 0.5; + } + if (attackType === Type.WATER) { + return 1.5; + } + break; } return 1; @@ -92,10 +92,10 @@ export class Weather { const moveType = user.getMoveType(move); switch (this.weatherType) { - case WeatherType.HARSH_SUN: - return move instanceof AttackMove && moveType === Type.WATER; - case WeatherType.HEAVY_RAIN: - return move instanceof AttackMove && moveType === Type.FIRE; + case WeatherType.HARSH_SUN: + return move instanceof AttackMove && moveType === Type.WATER; + case WeatherType.HEAVY_RAIN: + return move instanceof AttackMove && moveType === Type.FIRE; } return false; @@ -120,24 +120,24 @@ export class Weather { export function getWeatherStartMessage(weatherType: WeatherType): string | null { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t("weather:sunnyStartMessage"); - case WeatherType.RAIN: - return i18next.t("weather:rainStartMessage"); - case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormStartMessage"); - case WeatherType.HAIL: - return i18next.t("weather:hailStartMessage"); - case WeatherType.SNOW: - return i18next.t("weather:snowStartMessage"); - case WeatherType.FOG: - return i18next.t("weather:fogStartMessage"); - case WeatherType.HEAVY_RAIN: - return i18next.t("weather:heavyRainStartMessage"); - case WeatherType.HARSH_SUN: - return i18next.t("weather:harshSunStartMessage"); - case WeatherType.STRONG_WINDS: - return i18next.t("weather:strongWindsStartMessage"); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyStartMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainStartMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormStartMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailStartMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowStartMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogStartMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainStartMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunStartMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsStartMessage"); } return null; @@ -145,24 +145,24 @@ export function getWeatherStartMessage(weatherType: WeatherType): string | null export function getWeatherLapseMessage(weatherType: WeatherType): string | null { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t("weather:sunnyLapseMessage"); - case WeatherType.RAIN: - return i18next.t("weather:rainLapseMessage"); - case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormLapseMessage"); - case WeatherType.HAIL: - return i18next.t("weather:hailLapseMessage"); - case WeatherType.SNOW: - return i18next.t("weather:snowLapseMessage"); - case WeatherType.FOG: - return i18next.t("weather:fogLapseMessage"); - case WeatherType.HEAVY_RAIN: - return i18next.t("weather:heavyRainLapseMessage"); - case WeatherType.HARSH_SUN: - return i18next.t("weather:harshSunLapseMessage"); - case WeatherType.STRONG_WINDS: - return i18next.t("weather:strongWindsLapseMessage"); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyLapseMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainLapseMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormLapseMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailLapseMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowLapseMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogLapseMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainLapseMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunLapseMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsLapseMessage"); } return null; @@ -170,10 +170,10 @@ export function getWeatherLapseMessage(weatherType: WeatherType): string | null export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokemon): string | null { switch (weatherType) { - case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); - case WeatherType.HAIL: - return i18next.t("weather:hailDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); + case WeatherType.HAIL: + return i18next.t("weather:hailDamageMessage", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }); } return null; @@ -181,24 +181,24 @@ export function getWeatherDamageMessage(weatherType: WeatherType, pokemon: Pokem export function getWeatherClearMessage(weatherType: WeatherType): string | null { switch (weatherType) { - case WeatherType.SUNNY: - return i18next.t("weather:sunnyClearMessage"); - case WeatherType.RAIN: - return i18next.t("weather:rainClearMessage"); - case WeatherType.SANDSTORM: - return i18next.t("weather:sandstormClearMessage"); - case WeatherType.HAIL: - return i18next.t("weather:hailClearMessage"); - case WeatherType.SNOW: - return i18next.t("weather:snowClearMessage"); - case WeatherType.FOG: - return i18next.t("weather:fogClearMessage"); - case WeatherType.HEAVY_RAIN: - return i18next.t("weather:heavyRainClearMessage"); - case WeatherType.HARSH_SUN: - return i18next.t("weather:harshSunClearMessage"); - case WeatherType.STRONG_WINDS: - return i18next.t("weather:strongWindsClearMessage"); + case WeatherType.SUNNY: + return i18next.t("weather:sunnyClearMessage"); + case WeatherType.RAIN: + return i18next.t("weather:rainClearMessage"); + case WeatherType.SANDSTORM: + return i18next.t("weather:sandstormClearMessage"); + case WeatherType.HAIL: + return i18next.t("weather:hailClearMessage"); + case WeatherType.SNOW: + return i18next.t("weather:snowClearMessage"); + case WeatherType.FOG: + return i18next.t("weather:fogClearMessage"); + case WeatherType.HEAVY_RAIN: + return i18next.t("weather:heavyRainClearMessage"); + case WeatherType.HARSH_SUN: + return i18next.t("weather:harshSunClearMessage"); + case WeatherType.STRONG_WINDS: + return i18next.t("weather:strongWindsClearMessage"); } return null; @@ -206,33 +206,33 @@ export function getWeatherClearMessage(weatherType: WeatherType): string | null export function getTerrainStartMessage(terrainType: TerrainType): string | null { switch (terrainType) { - case TerrainType.MISTY: - return i18next.t("terrain:mistyStartMessage"); - case TerrainType.ELECTRIC: - return i18next.t("terrain:electricStartMessage"); - case TerrainType.GRASSY: - return i18next.t("terrain:grassyStartMessage"); - case TerrainType.PSYCHIC: - return i18next.t("terrain:psychicStartMessage"); - default: - console.warn("getTerrainStartMessage not defined. Using default null"); - return null; + case TerrainType.MISTY: + return i18next.t("terrain:mistyStartMessage"); + case TerrainType.ELECTRIC: + return i18next.t("terrain:electricStartMessage"); + case TerrainType.GRASSY: + return i18next.t("terrain:grassyStartMessage"); + case TerrainType.PSYCHIC: + return i18next.t("terrain:psychicStartMessage"); + default: + console.warn("getTerrainStartMessage not defined. Using default null"); + return null; } } export function getTerrainClearMessage(terrainType: TerrainType): string | null { switch (terrainType) { - case TerrainType.MISTY: - return i18next.t("terrain:mistyClearMessage"); - case TerrainType.ELECTRIC: - return i18next.t("terrain:electricClearMessage"); - case TerrainType.GRASSY: - return i18next.t("terrain:grassyClearMessage"); - case TerrainType.PSYCHIC: - return i18next.t("terrain:psychicClearMessage"); - default: - console.warn("getTerrainClearMessage not defined. Using default null"); - return null; + case TerrainType.MISTY: + return i18next.t("terrain:mistyClearMessage"); + case TerrainType.ELECTRIC: + return i18next.t("terrain:electricClearMessage"); + case TerrainType.GRASSY: + return i18next.t("terrain:grassyClearMessage"); + case TerrainType.PSYCHIC: + return i18next.t("terrain:psychicClearMessage"); + default: + console.warn("getTerrainClearMessage not defined. Using default null"); + return null; } } @@ -252,126 +252,126 @@ export function getRandomWeatherType(arena: any /* Importing from arena causes a let weatherPool: WeatherPoolEntry[] = []; const hasSun = arena.getTimeOfDay() < 2; switch (arena.biomeType) { - case Biome.GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 7 } - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); - } - break; - case Biome.TALL_GRASS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 }, - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 }); - } - break; - case Biome.FOREST: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 5 } - ]; - break; - case Biome.SEA: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 12 } - ]; - break; - case Biome.SWAMP: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.RAIN, weight: 4 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.BEACH: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 3 } - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); - } - break; - case Biome.LAKE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 10 }, - { weatherType: WeatherType.RAIN, weight: 5 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.SEABED: - weatherPool = [ - { weatherType: WeatherType.RAIN, weight: 1 } - ]; - break; - case Biome.BADLANDS: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); - } - break; - case Biome.DESERT: - weatherPool = [ - { weatherType: WeatherType.SANDSTORM, weight: 2 } - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - } - break; - case Biome.ICE_CAVE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.SNOW, weight: 4 }, - { weatherType: WeatherType.HAIL, weight: 1 } - ]; - break; - case Biome.MEADOW: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 2 } - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - } - case Biome.VOLCANO: - weatherPool = [ - { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } - ]; - break; - case Biome.GRAVEYARD: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 3 }, - { weatherType: WeatherType.FOG, weight: 1 } - ]; - break; - case Biome.JUNGLE: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 8 }, - { weatherType: WeatherType.RAIN, weight: 2 } - ]; - break; - case Biome.SNOWY_FOREST: - weatherPool = [ - { weatherType: WeatherType.SNOW, weight: 7 }, - { weatherType: WeatherType.HAIL, weight: 1 } - ]; - break; - case Biome.ISLAND: - weatherPool = [ - { weatherType: WeatherType.NONE, weight: 5 }, - { weatherType: WeatherType.RAIN, weight: 1 }, - ]; - if (hasSun) { - weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); - } - break; + case Biome.GRASS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 7 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 3 }); + } + break; + case Biome.TALL_GRASS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 5 }, + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 8 }); + } + break; + case Biome.FOREST: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 5 } + ]; + break; + case Biome.SEA: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.RAIN, weight: 12 } + ]; + break; + case Biome.SWAMP: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.RAIN, weight: 4 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.BEACH: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 3 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); + } + break; + case Biome.LAKE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 10 }, + { weatherType: WeatherType.RAIN, weight: 5 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.SEABED: + weatherPool = [ + { weatherType: WeatherType.RAIN, weight: 1 } + ]; + break; + case Biome.BADLANDS: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.SANDSTORM, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 5 }); + } + break; + case Biome.DESERT: + weatherPool = [ + { weatherType: WeatherType.SANDSTORM, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + break; + case Biome.ICE_CAVE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.SNOW, weight: 4 }, + { weatherType: WeatherType.HAIL, weight: 1 } + ]; + break; + case Biome.MEADOW: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 2 } + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + case Biome.VOLCANO: + weatherPool = [ + { weatherType: hasSun ? WeatherType.SUNNY : WeatherType.NONE, weight: 1 } + ]; + break; + case Biome.GRAVEYARD: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 3 }, + { weatherType: WeatherType.FOG, weight: 1 } + ]; + break; + case Biome.JUNGLE: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 8 }, + { weatherType: WeatherType.RAIN, weight: 2 } + ]; + break; + case Biome.SNOWY_FOREST: + weatherPool = [ + { weatherType: WeatherType.SNOW, weight: 7 }, + { weatherType: WeatherType.HAIL, weight: 1 } + ]; + break; + case Biome.ISLAND: + weatherPool = [ + { weatherType: WeatherType.NONE, weight: 5 }, + { weatherType: WeatherType.RAIN, weight: 1 }, + ]; + if (hasSun) { + weatherPool.push({ weatherType: WeatherType.SUNNY, weight: 2 }); + } + break; } if (weatherPool.length > 1) { diff --git a/src/enums/switch-type.ts b/src/enums/switch-type.ts index b25ba6ad119..752c0902636 100644 --- a/src/enums/switch-type.ts +++ b/src/enums/switch-type.ts @@ -3,6 +3,8 @@ * or {@linkcode SwitchSummonPhase} will carry out. */ export enum SwitchType { + /** Switchout specifically for when combat starts and the player is prompted if they will switch Pokemon */ + INITIAL_SWITCH, /** Basic switchout where the Pokemon to switch in is selected */ SWITCH, /** Transfers stat stages and other effects from the returning Pokemon to the switched in Pokemon */ diff --git a/src/enums/trainer-type.ts b/src/enums/trainer-type.ts index cb7509067b5..708faf69196 100644 --- a/src/enums/trainer-type.ts +++ b/src/enums/trainer-type.ts @@ -116,6 +116,8 @@ export enum TrainerType { VITO, BUG_TYPE_SUPERFAN, EXPERT_POKEMON_BREEDER, + FUTURE_SELF_M, + FUTURE_SELF_F, BROCK = 200, MISTY, diff --git a/src/field/anims.ts b/src/field/anims.ts index 52a15aa4f20..c73c52027c5 100644 --- a/src/field/anims.ts +++ b/src/field/anims.ts @@ -4,21 +4,21 @@ import * as Utils from "../utils"; export function addPokeballOpenParticles(scene: BattleScene, x: number, y: number, pokeballType: PokeballType): void { switch (pokeballType) { - case PokeballType.POKEBALL: - doDefaultPbOpenParticles(scene, x, y, 48); - break; - case PokeballType.GREAT_BALL: - doDefaultPbOpenParticles(scene, x, y, 96); - break; - case PokeballType.ULTRA_BALL: - doUbOpenParticles(scene, x, y, 8); - break; - case PokeballType.ROGUE_BALL: - doUbOpenParticles(scene, x, y, 10); - break; - case PokeballType.MASTER_BALL: - doMbOpenParticles(scene, x, y); - break; + case PokeballType.POKEBALL: + doDefaultPbOpenParticles(scene, x, y, 48); + break; + case PokeballType.GREAT_BALL: + doDefaultPbOpenParticles(scene, x, y, 96); + break; + case PokeballType.ULTRA_BALL: + doUbOpenParticles(scene, x, y, 8); + break; + case PokeballType.ROGUE_BALL: + doUbOpenParticles(scene, x, y, 10); + break; + case PokeballType.MASTER_BALL: + doMbOpenParticles(scene, x, y); + break; } } diff --git a/src/field/arena.ts b/src/field/arena.ts index ad1846884fc..abc2b89569c 100644 --- a/src/field/arena.ts +++ b/src/field/arena.ts @@ -10,7 +10,14 @@ import Move from "#app/data/move"; import { ArenaTag, ArenaTagSide, ArenaTrapTag, getArenaTag } from "#app/data/arena-tag"; import { BattlerIndex } from "#app/battle"; import { Terrain, TerrainType } from "#app/data/terrain"; -import { applyPostTerrainChangeAbAttrs, applyPostWeatherChangeAbAttrs, PostTerrainChangeAbAttr, PostWeatherChangeAbAttr } from "#app/data/ability"; +import { + applyAbAttrs, + applyPostTerrainChangeAbAttrs, + applyPostWeatherChangeAbAttrs, + PostTerrainChangeAbAttr, + PostWeatherChangeAbAttr, + TerrainEventTypeChangeAbAttr +} from "#app/data/ability"; import Pokemon from "#app/field/pokemon"; import Overrides from "#app/overrides"; import { TagAddedEvent, TagRemovedEvent, TerrainChangedEvent, WeatherChangedEvent } from "#app/events/arena"; @@ -129,18 +136,18 @@ export class Arena { if (ret.subLegendary || ret.legendary || ret.mythical) { switch (true) { - case (ret.baseTotal >= 720): - regen = level < 90; - break; - case (ret.baseTotal >= 670): - regen = level < 70; - break; - case (ret.baseTotal >= 580): - regen = level < 50; - break; - default: - regen = level < 30; - break; + case (ret.baseTotal >= 720): + regen = level < 90; + break; + case (ret.baseTotal >= 670): + regen = level < 70; + break; + case (ret.baseTotal >= 580): + regen = level < 50; + break; + default: + regen = level < 30; + break; } } } @@ -177,112 +184,52 @@ export class Arena { getSpeciesFormIndex(species: PokemonSpecies): integer { switch (species.speciesId) { - case Species.BURMY: - case Species.WORMADAM: - switch (this.biomeType) { - case Biome.BEACH: - return 1; - case Biome.SLUM: - return 2; - } - break; - case Species.ROTOM: - switch (this.biomeType) { - case Biome.VOLCANO: - return 1; - case Biome.SEA: - return 2; - case Biome.ICE_CAVE: - return 3; - case Biome.MOUNTAIN: - return 4; - case Biome.TALL_GRASS: - return 5; - } - break; - case Species.LYCANROC: - const timeOfDay = this.getTimeOfDay(); - switch (timeOfDay) { - case TimeOfDay.DAY: - case TimeOfDay.DAWN: - return 0; - case TimeOfDay.DUSK: - return 2; - case TimeOfDay.NIGHT: - return 1; - } - break; + case Species.BURMY: + case Species.WORMADAM: + switch (this.biomeType) { + case Biome.BEACH: + return 1; + case Biome.SLUM: + return 2; + } + break; + case Species.ROTOM: + switch (this.biomeType) { + case Biome.VOLCANO: + return 1; + case Biome.SEA: + return 2; + case Biome.ICE_CAVE: + return 3; + case Biome.MOUNTAIN: + return 4; + case Biome.TALL_GRASS: + return 5; + } + break; + case Species.LYCANROC: + const timeOfDay = this.getTimeOfDay(); + switch (timeOfDay) { + case TimeOfDay.DAY: + case TimeOfDay.DAWN: + return 0; + case TimeOfDay.DUSK: + return 2; + case TimeOfDay.NIGHT: + return 1; + } + break; } return 0; } - getTypeForBiome() { - switch (this.biomeType) { - case Biome.TOWN: - case Biome.PLAINS: - case Biome.METROPOLIS: - return Type.NORMAL; - case Biome.GRASS: - case Biome.TALL_GRASS: - return Type.GRASS; - case Biome.FOREST: - case Biome.JUNGLE: - return Type.BUG; - case Biome.SLUM: - case Biome.SWAMP: - return Type.POISON; - case Biome.SEA: - case Biome.BEACH: - case Biome.LAKE: - case Biome.SEABED: - return Type.WATER; - case Biome.MOUNTAIN: - return Type.FLYING; - case Biome.BADLANDS: - return Type.GROUND; - case Biome.CAVE: - case Biome.DESERT: - return Type.ROCK; - case Biome.ICE_CAVE: - case Biome.SNOWY_FOREST: - return Type.ICE; - case Biome.MEADOW: - case Biome.FAIRY_CAVE: - case Biome.ISLAND: - return Type.FAIRY; - case Biome.POWER_PLANT: - return Type.ELECTRIC; - case Biome.VOLCANO: - return Type.FIRE; - case Biome.GRAVEYARD: - case Biome.TEMPLE: - return Type.GHOST; - case Biome.DOJO: - case Biome.CONSTRUCTION_SITE: - return Type.FIGHTING; - case Biome.FACTORY: - case Biome.LABORATORY: - return Type.STEEL; - case Biome.RUINS: - case Biome.SPACE: - return Type.PSYCHIC; - case Biome.WASTELAND: - case Biome.END: - return Type.DRAGON; - case Biome.ABYSS: - return Type.DARK; - default: - return Type.UNKNOWN; - } - } - getBgTerrainColorRatioForBiome(): number { switch (this.biomeType) { - case Biome.SPACE: - return 1; - case Biome.END: - return 0; + case Biome.SPACE: + return 1; + case Biome.END: + return 0; } return 131 / 180; @@ -387,6 +334,7 @@ export class Arena { this.scene.getField(true).filter(p => p.isOnField()).map(pokemon => { pokemon.findAndRemoveTags(t => "terrainTypes" in t && !(t.terrainTypes as TerrainType[]).find(t => t === terrain)); applyPostTerrainChangeAbAttrs(PostTerrainChangeAbAttr, pokemon, terrain); + applyAbAttrs(TerrainEventTypeChangeAbAttr, pokemon, null, false); }); return true; @@ -424,52 +372,52 @@ export class Arena { */ getTrainerChance(): integer { switch (this.biomeType) { - case Biome.METROPOLIS: - return 2; - case Biome.SLUM: - case Biome.BEACH: - case Biome.DOJO: - case Biome.CONSTRUCTION_SITE: - return 4; - case Biome.PLAINS: - case Biome.GRASS: - case Biome.LAKE: - case Biome.CAVE: - return 6; - case Biome.TALL_GRASS: - case Biome.FOREST: - case Biome.SEA: - case Biome.SWAMP: - case Biome.MOUNTAIN: - case Biome.BADLANDS: - case Biome.DESERT: - case Biome.MEADOW: - case Biome.POWER_PLANT: - case Biome.GRAVEYARD: - case Biome.FACTORY: - case Biome.SNOWY_FOREST: - return 8; - case Biome.ICE_CAVE: - case Biome.VOLCANO: - case Biome.RUINS: - case Biome.WASTELAND: - case Biome.JUNGLE: - case Biome.FAIRY_CAVE: - return 12; - case Biome.SEABED: - case Biome.ABYSS: - case Biome.SPACE: - case Biome.TEMPLE: - return 16; - default: - return 0; + case Biome.METROPOLIS: + return 2; + case Biome.SLUM: + case Biome.BEACH: + case Biome.DOJO: + case Biome.CONSTRUCTION_SITE: + return 4; + case Biome.PLAINS: + case Biome.GRASS: + case Biome.LAKE: + case Biome.CAVE: + return 6; + case Biome.TALL_GRASS: + case Biome.FOREST: + case Biome.SEA: + case Biome.SWAMP: + case Biome.MOUNTAIN: + case Biome.BADLANDS: + case Biome.DESERT: + case Biome.MEADOW: + case Biome.POWER_PLANT: + case Biome.GRAVEYARD: + case Biome.FACTORY: + case Biome.SNOWY_FOREST: + return 8; + case Biome.ICE_CAVE: + case Biome.VOLCANO: + case Biome.RUINS: + case Biome.WASTELAND: + case Biome.JUNGLE: + case Biome.FAIRY_CAVE: + return 12; + case Biome.SEABED: + case Biome.ABYSS: + case Biome.SPACE: + case Biome.TEMPLE: + return 16; + default: + return 0; } } getTimeOfDay(): TimeOfDay { switch (this.biomeType) { - case Biome.ABYSS: - return TimeOfDay.NIGHT; + case Biome.ABYSS: + return TimeOfDay.NIGHT; } const waveCycle = ((this.scene.currentBattle?.waveIndex || 0) + this.scene.waveCycleOffset) % 40; @@ -491,35 +439,35 @@ export class Arena { isOutside(): boolean { switch (this.biomeType) { - case Biome.SEABED: - case Biome.CAVE: - case Biome.ICE_CAVE: - case Biome.POWER_PLANT: - case Biome.DOJO: - case Biome.FACTORY: - case Biome.ABYSS: - case Biome.FAIRY_CAVE: - case Biome.TEMPLE: - case Biome.LABORATORY: - return false; - default: - return true; + case Biome.SEABED: + case Biome.CAVE: + case Biome.ICE_CAVE: + case Biome.POWER_PLANT: + case Biome.DOJO: + case Biome.FACTORY: + case Biome.ABYSS: + case Biome.FAIRY_CAVE: + case Biome.TEMPLE: + case Biome.LABORATORY: + return false; + default: + return true; } } overrideTint(): [integer, integer, integer] { switch (Overrides.ARENA_TINT_OVERRIDE) { - case TimeOfDay.DUSK: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; - break; - case (TimeOfDay.NIGHT): - return [ 64, 64, 64 ]; - break; - case TimeOfDay.DAWN: - case TimeOfDay.DAY: - default: - return [ 128, 128, 128 ]; - break; + case TimeOfDay.DUSK: + return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; + break; + case (TimeOfDay.NIGHT): + return [ 64, 64, 64 ]; + break; + case TimeOfDay.DAWN: + case TimeOfDay.DAY: + default: + return [ 128, 128, 128 ]; + break; } } @@ -528,10 +476,10 @@ export class Arena { return this.overrideTint(); } switch (this.biomeType) { - case Biome.ABYSS: - return [ 64, 64, 64 ]; - default: - return [ 128, 128, 128 ]; + case Biome.ABYSS: + return [ 64, 64, 64 ]; + default: + return [ 128, 128, 128 ]; } } @@ -544,8 +492,8 @@ export class Arena { } switch (this.biomeType) { - default: - return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; + default: + return [ 98, 48, 73 ].map(c => Math.round((c + 128) / 2)) as [integer, integer, integer]; } } @@ -554,10 +502,10 @@ export class Arena { return this.overrideTint(); } switch (this.biomeType) { - case Biome.ABYSS: - case Biome.SPACE: - case Biome.END: - return this.getDayTint(); + case Biome.ABYSS: + case Biome.SPACE: + case Biome.END: + return this.getDayTint(); } if (!this.isOutside()) { @@ -565,8 +513,8 @@ export class Arena { } switch (this.biomeType) { - default: - return [ 48, 48, 98 ]; + default: + return [ 48, 48, 98 ]; } } @@ -747,77 +695,77 @@ export class Arena { getBgmLoopPoint(): number { switch (this.biomeType) { - case Biome.TOWN: - return 7.288; - case Biome.PLAINS: - return 17.485; - case Biome.GRASS: - return 1.995; - case Biome.TALL_GRASS: - return 9.608; - case Biome.METROPOLIS: - return 141.470; - case Biome.FOREST: - return 4.294; - case Biome.SEA: - return 0.024; - case Biome.SWAMP: - return 4.461; - case Biome.BEACH: - return 3.462; - case Biome.LAKE: - return 7.215; - case Biome.SEABED: - return 2.600; - case Biome.MOUNTAIN: - return 4.018; - case Biome.BADLANDS: - return 17.790; - case Biome.CAVE: - return 14.240; - case Biome.DESERT: - return 1.143; - case Biome.ICE_CAVE: - return 0.000; - case Biome.MEADOW: - return 3.891; - case Biome.POWER_PLANT: - return 9.447; - case Biome.VOLCANO: - return 17.637; - case Biome.GRAVEYARD: - return 3.232; - case Biome.DOJO: - return 6.205; - case Biome.FACTORY: - return 4.985; - case Biome.RUINS: - return 0.000; - case Biome.WASTELAND: - return 6.336; - case Biome.ABYSS: - return 5.130; - case Biome.SPACE: - return 20.036; - case Biome.CONSTRUCTION_SITE: - return 1.222; - case Biome.JUNGLE: - return 0.000; - case Biome.FAIRY_CAVE: - return 4.542; - case Biome.TEMPLE: - return 2.547; - case Biome.ISLAND: - return 2.751; - case Biome.LABORATORY: - return 114.862; - case Biome.SLUM: - return 0.000; - case Biome.SNOWY_FOREST: - return 3.047; - default: - console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`); - return 0; + case Biome.TOWN: + return 7.288; + case Biome.PLAINS: + return 17.485; + case Biome.GRASS: + return 1.995; + case Biome.TALL_GRASS: + return 9.608; + case Biome.METROPOLIS: + return 141.470; + case Biome.FOREST: + return 4.294; + case Biome.SEA: + return 0.024; + case Biome.SWAMP: + return 4.461; + case Biome.BEACH: + return 3.462; + case Biome.LAKE: + return 7.215; + case Biome.SEABED: + return 2.600; + case Biome.MOUNTAIN: + return 4.018; + case Biome.BADLANDS: + return 17.790; + case Biome.CAVE: + return 14.240; + case Biome.DESERT: + return 1.143; + case Biome.ICE_CAVE: + return 0.000; + case Biome.MEADOW: + return 3.891; + case Biome.POWER_PLANT: + return 9.447; + case Biome.VOLCANO: + return 17.637; + case Biome.GRAVEYARD: + return 13.711; + case Biome.DOJO: + return 6.205; + case Biome.FACTORY: + return 4.985; + case Biome.RUINS: + return 0.000; + case Biome.WASTELAND: + return 6.336; + case Biome.ABYSS: + return 5.130; + case Biome.SPACE: + return 20.036; + case Biome.CONSTRUCTION_SITE: + return 1.222; + case Biome.JUNGLE: + return 0.000; + case Biome.FAIRY_CAVE: + return 4.542; + case Biome.TEMPLE: + return 2.547; + case Biome.ISLAND: + return 2.751; + case Biome.LABORATORY: + return 114.862; + case Biome.SLUM: + return 0.000; + case Biome.SNOWY_FOREST: + return 3.047; + default: + console.warn(`missing bgm loop-point for biome "${Biome[this.biomeType]}" (=${this.biomeType})`); + return 0; } } } @@ -828,32 +776,32 @@ export function getBiomeKey(biome: Biome): string { export function getBiomeHasProps(biomeType: Biome): boolean { switch (biomeType) { - case Biome.METROPOLIS: - case Biome.BEACH: - case Biome.LAKE: - case Biome.SEABED: - case Biome.MOUNTAIN: - case Biome.BADLANDS: - case Biome.CAVE: - case Biome.DESERT: - case Biome.ICE_CAVE: - case Biome.MEADOW: - case Biome.POWER_PLANT: - case Biome.VOLCANO: - case Biome.GRAVEYARD: - case Biome.FACTORY: - case Biome.RUINS: - case Biome.WASTELAND: - case Biome.ABYSS: - case Biome.CONSTRUCTION_SITE: - case Biome.JUNGLE: - case Biome.FAIRY_CAVE: - case Biome.TEMPLE: - case Biome.SNOWY_FOREST: - case Biome.ISLAND: - case Biome.LABORATORY: - case Biome.END: - return true; + case Biome.METROPOLIS: + case Biome.BEACH: + case Biome.LAKE: + case Biome.SEABED: + case Biome.MOUNTAIN: + case Biome.BADLANDS: + case Biome.CAVE: + case Biome.DESERT: + case Biome.ICE_CAVE: + case Biome.MEADOW: + case Biome.POWER_PLANT: + case Biome.VOLCANO: + case Biome.GRAVEYARD: + case Biome.FACTORY: + case Biome.RUINS: + case Biome.WASTELAND: + case Biome.ABYSS: + case Biome.CONSTRUCTION_SITE: + case Biome.JUNGLE: + case Biome.FAIRY_CAVE: + case Biome.TEMPLE: + case Biome.SNOWY_FOREST: + case Biome.ISLAND: + case Biome.LABORATORY: + case Biome.END: + return true; } return false; diff --git a/src/field/damage-number-handler.ts b/src/field/damage-number-handler.ts index ae0692da342..4ddcd2d3ee7 100644 --- a/src/field/damage-number-handler.ts +++ b/src/field/damage-number-handler.ts @@ -29,21 +29,21 @@ export default class DamageNumberHandler { let [ textColor, shadowColor ] : TextAndShadowArr = [ null, null ]; switch (result) { - case HitResult.SUPER_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f8d030", "#b8a038" ]; - break; - case HitResult.NOT_VERY_EFFECTIVE: - [ textColor, shadowColor ] = [ "#f08030", "#c03028" ]; - break; - case HitResult.ONE_HIT_KO: - [ textColor, shadowColor ] = [ "#a040a0", "#483850" ]; - break; - case HitResult.HEAL: - [ textColor, shadowColor ] = [ "#78c850", "#588040" ]; - break; - default: - [ textColor, shadowColor ] = [ "#ffffff", "#636363" ]; - break; + case HitResult.SUPER_EFFECTIVE: + [ textColor, shadowColor ] = [ "#f8d030", "#b8a038" ]; + break; + case HitResult.NOT_VERY_EFFECTIVE: + [ textColor, shadowColor ] = [ "#f08030", "#c03028" ]; + break; + case HitResult.ONE_HIT_KO: + [ textColor, shadowColor ] = [ "#a040a0", "#483850" ]; + break; + case HitResult.HEAL: + [ textColor, shadowColor ] = [ "#78c850", "#588040" ]; + break; + default: + [ textColor, shadowColor ] = [ "#ffffff", "#636363" ]; + break; } if (textColor) { diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 9aaadf29657..6c328fa25cc 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -3,7 +3,7 @@ import BattleScene, { AnySound } from "#app/battle-scene"; import { Variant, VariantSet, variantColorCache } from "#app/data/variant"; import { variantData } from "#app/data/variant"; import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "#app/ui/battle-info"; -import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr } from "#app/data/move"; +import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatStagesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatStageChangeAttr, RechargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr, MoveTarget, CombinedPledgeStabBoostAttr } from "#app/data/move"; import { default as PokemonSpecies, PokemonSpeciesForm, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm } from "#app/data/pokemon-species"; import { CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER, getStarterValueFriendshipCap, speciesStarterCosts } from "#app/data/balance/starters"; import { starterPassiveAbilities } from "#app/data/balance/passives"; @@ -12,7 +12,7 @@ import * as Utils from "#app/utils"; import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "#app/data/type"; import { getLevelTotalExp } from "#app/data/exp"; import { Stat, type PermanentStat, type BattleStat, type EffectiveStat, PERMANENT_STATS, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; -import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier } from "#app/modifier/modifier"; +import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, BaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempStatStageBoosterModifier, TempCritBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonIncrementingStatModifier, EvoTrackerModifier, PokemonMultiHitModifier } from "#app/modifier/modifier"; import { PokeballType } from "#app/data/pokeball"; import { Gender } from "#app/data/gender"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; @@ -22,7 +22,7 @@ import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "#app/data/balance/ import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, SubstituteTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag, AutotomizedTag, PowerTrickTag } from "../data/battler-tags"; import { WeatherType } from "#app/data/weather"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "#app/data/arena-tag"; -import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs } from "#app/data/ability"; +import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr, PostSetStatusAbAttr, applyPostSetStatusAbAttrs, InfiltratorAbAttr, AlliedFieldDamageReductionAbAttr, PostDamageAbAttr, applyPostDamageAbAttrs, PostDamageForceSwitchAbAttr } from "#app/data/ability"; import PokemonData from "#app/system/pokemon-data"; import { BattlerIndex } from "#app/battle"; import { Mode } from "#app/ui/ui"; @@ -62,7 +62,7 @@ import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-ph import { Challenges } from "#enums/challenges"; import { PokemonAnimType } from "#enums/pokemon-anim-type"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { SwitchType } from "#enums/switch-type"; import { SpeciesFormKey } from "#enums/species-form-key"; import { BASE_HIDDEN_ABILITY_CHANCE, BASE_SHINY_CHANCE, SHINY_EPIC_CHANCE, SHINY_VARIANT_CHANCE } from "#app/data/balance/rates"; @@ -93,7 +93,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public stats: integer[]; public ivs: integer[]; public nature: Nature; - public natureOverride: Nature | -1; public moveset: (PokemonMove | null)[]; public status: Status | null; public friendship: integer; @@ -114,7 +113,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: integer; - public fusionMysteryEncounterPokemonData: MysteryEncounterPokemonData | null; + public fusionCustomPokemonData: CustomPokemonData | null; private summonDataPrimer: PokemonSummonData | null; @@ -122,7 +121,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { public battleData: PokemonBattleData; public battleSummonData: PokemonBattleSummonData; public turnData: PokemonTurnData; - public mysteryEncounterPokemonData: MysteryEncounterPokemonData; + public customPokemonData: CustomPokemonData; /** Used by Mystery Encounters to execute pokemon-specific logic (such as stat boosts) at start of battle */ public mysteryEncounterBattleEffects?: (pokemon: Pokemon) => void; @@ -193,7 +192,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } this.nature = dataSource.nature || 0 as Nature; this.nickname = dataSource.nickname; - this.natureOverride = dataSource.natureOverride !== undefined ? dataSource.natureOverride : -1; this.moveset = dataSource.moveset; this.status = dataSource.status!; // TODO: is this bang correct? this.friendship = dataSource.friendship !== undefined ? dataSource.friendship : this.species.baseFriendship; @@ -212,9 +210,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionVariant = dataSource.fusionVariant || 0; this.fusionGender = dataSource.fusionGender; this.fusionLuck = dataSource.fusionLuck; - this.fusionMysteryEncounterPokemonData = dataSource.fusionMysteryEncounterPokemonData; + this.fusionCustomPokemonData = dataSource.fusionCustomPokemonData; this.usedTMs = dataSource.usedTMs ?? []; - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(dataSource.mysteryEncounterPokemonData); + this.customPokemonData = new CustomPokemonData(dataSource.customPokemonData); } else { this.id = Utils.randSeedInt(4294967296); this.ivs = ivs || Utils.getIvsFromId(this.id); @@ -235,7 +233,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.variant = this.shiny ? this.generateVariant() : 0; } - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(); + this.customPokemonData = new CustomPokemonData(); if (nature !== undefined) { this.setNature(nature); @@ -243,8 +241,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.generateNature(); } - this.natureOverride = -1; - this.friendship = species.baseFriendship; this.metLevel = level; this.metBiome = scene.currentBattle ? scene.arena.biomeType : -1; @@ -432,38 +428,26 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { resolve(); }; if (this.shiny) { - const populateVariantColors = (key: string, back: boolean = false): Promise => { + const populateVariantColors = (isBackSprite: boolean = false): Promise => { return new Promise(resolve => { - const battleSpritePath = this.getBattleSpriteAtlasPath(back, ignoreOverride).replace("variant/", "").replace(/_[1-3]$/, ""); + const battleSpritePath = this.getBattleSpriteAtlasPath(isBackSprite, ignoreOverride).replace("variant/", "").replace(/_[1-3]$/, ""); let config = variantData; - const useExpSprite = this.scene.experimentalSprites && this.scene.hasExpSprite(this.getBattleSpriteKey(back, ignoreOverride)); + const useExpSprite = this.scene.experimentalSprites && this.scene.hasExpSprite(this.getBattleSpriteKey(isBackSprite, ignoreOverride)); battleSpritePath.split("/").map(p => config ? config = config[p] : null); const variantSet: VariantSet = config as VariantSet; if (variantSet && variantSet[this.variant] === 1) { - if (variantColorCache.hasOwnProperty(key)) { - return resolve(); + const cacheKey = this.getBattleSpriteKey(isBackSprite); + if (!variantColorCache.hasOwnProperty(cacheKey)) { + this.populateVariantColorCache(cacheKey, useExpSprite, battleSpritePath); } - this.scene.cachedFetch(`./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`). - then(res => { - // Prevent the JSON from processing if it failed to load - if (!res.ok) { - console.error(`Could not load ${res.url}!`); - return; - } - return res.json(); - }).then(c => { - variantColorCache[key] = c; - resolve(); - }); - } else { - resolve(); } + resolve(); }); }; if (this.isPlayer()) { - Promise.all([ populateVariantColors(this.getBattleSpriteKey(false)), populateVariantColors(this.getBattleSpriteKey(true), true) ]).then(() => updateFusionPaletteAndResolve()); + Promise.all([ populateVariantColors(false), populateVariantColors(true) ]).then(() => updateFusionPaletteAndResolve()); } else { - populateVariantColors(this.getBattleSpriteKey(false)).then(() => updateFusionPaletteAndResolve()); + populateVariantColors(false).then(() => updateFusionPaletteAndResolve()); } } else { updateFusionPaletteAndResolve(); @@ -476,6 +460,45 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { }); } + /** + * Gracefully handle errors loading a variant sprite. Log if it fails and attempt to fall back on + * non-experimental sprites before giving up. + * + * @param cacheKey the cache key for the variant color sprite + * @param attemptedSpritePath the sprite path that failed to load + * @param useExpSprite was the attempted sprite experimental + * @param battleSpritePath the filename of the sprite + * @param optionalParams any additional params to log + */ + fallbackVariantColor(cacheKey: string, attemptedSpritePath: string, useExpSprite: boolean, battleSpritePath: string, ...optionalParams: any[]) { + console.warn(`Could not load ${attemptedSpritePath}!`, ...optionalParams); + if (useExpSprite) { + this.populateVariantColorCache(cacheKey, false, battleSpritePath); + } + } + + /** + * Attempt to process variant sprite. + * + * @param cacheKey the cache key for the variant color sprite + * @param useExpSprite should the experimental sprite be used + * @param battleSpritePath the filename of the sprite + */ + populateVariantColorCache(cacheKey: string, useExpSprite: boolean, battleSpritePath: string) { + const spritePath = `./images/pokemon/variant/${useExpSprite ? "exp/" : ""}${battleSpritePath}.json`; + this.scene.cachedFetch(spritePath).then(res => { + // Prevent the JSON from processing if it failed to load + if (!res.ok) { + return this.fallbackVariantColor(cacheKey, res.url, useExpSprite, battleSpritePath, res.status, res.statusText); + } + return res.json(); + }).catch(error => { + this.fallbackVariantColor(cacheKey, spritePath, useExpSprite, battleSpritePath, error); + }).then(c => { + variantColorCache[cacheKey] = c; + }); + } + getFormKey(): string { if (!this.species.forms.length || this.species.forms.length <= this.formIndex) { return ""; @@ -593,8 +616,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const formKey = this.getFormKey(); if (this.isMax() === true || formKey === "segin-starmobile" || formKey === "schedar-starmobile" || formKey === "navi-starmobile" || formKey === "ruchbah-starmobile" || formKey === "caph-starmobile") { return 1.5; - } else if (this.mysteryEncounterPokemonData.spriteScale > 0) { - return this.mysteryEncounterPokemonData.spriteScale; + } else if (this.customPokemonData.spriteScale > 0) { + return this.customPokemonData.spriteScale; } return 1; } @@ -680,12 +703,12 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { getFieldPositionOffset(): [ number, number ] { switch (this.fieldPosition) { - case FieldPosition.CENTER: - return [ 0, 0 ]; - case FieldPosition.LEFT: - return [ -32, -8 ]; - case FieldPosition.RIGHT: - return [ 32, 0 ]; + case FieldPosition.CENTER: + return [ 0, 0 ]; + case FieldPosition.LEFT: + return [ -32, -8 ]; + case FieldPosition.RIGHT: + return [ 32, 0 ]; } } @@ -917,39 +940,39 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, ignoreOppAbility, isCritical, simulated); switch (stat) { - case Stat.ATK: - if (this.getTag(BattlerTagType.SLOW_START)) { - ret >>= 1; - } - break; - case Stat.DEF: - if (this.isOfType(Type.ICE) && this.scene.arena.weather?.weatherType === WeatherType.SNOW) { - ret *= 1.5; - } - break; - case Stat.SPATK: - break; - case Stat.SPDEF: - if (this.isOfType(Type.ROCK) && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { - ret *= 1.5; - } - break; - case Stat.SPD: - const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { - ret *= 2; - } - if (this.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) { - ret >>= 2; - } + case Stat.ATK: + if (this.getTag(BattlerTagType.SLOW_START)) { + ret >>= 1; + } + break; + case Stat.DEF: + if (this.isOfType(Type.ICE) && this.scene.arena.weather?.weatherType === WeatherType.SNOW) { + ret *= 1.5; + } + break; + case Stat.SPATK: + break; + case Stat.SPDEF: + if (this.isOfType(Type.ROCK) && this.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) { + ret *= 1.5; + } + break; + case Stat.SPD: + const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + if (this.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) { + ret *= 2; + } + if (this.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, side)) { + ret >>= 2; + } - if (this.getTag(BattlerTagType.SLOW_START)) { - ret >>= 1; - } - if (this.status && this.status.effect === StatusEffect.PARALYSIS) { - ret >>= 1; - } - break; + if (this.getTag(BattlerTagType.SLOW_START)) { + ret >>= 1; + } + if (this.status && this.status.effect === StatusEffect.PARALYSIS) { + ret >>= 1; + } + break; } const highestStatBoost = this.findTag(t => t instanceof HighestStatBoostTag && (t as HighestStatBoostTag).stat === stat) as HighestStatBoostTag; @@ -1023,7 +1046,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } getNature(): Nature { - return this.natureOverride !== -1 ? this.natureOverride : this.nature; + return this.customPokemonData.nature !== -1 ? this.customPokemonData.nature : this.nature; } setNature(nature: Nature): void { @@ -1198,15 +1221,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (!types.length || !includeTeraType) { if (!ignoreOverride && this.summonData?.types && this.summonData.types.length > 0) { this.summonData.types.forEach(t => types.push(t)); - } else if (this.mysteryEncounterPokemonData.types && this.mysteryEncounterPokemonData.types.length > 0) { + } else if (this.customPokemonData.types && this.customPokemonData.types.length > 0) { // "Permanent" override for a Pokemon's normal types, currently only used by Mystery Encounters - types.push(this.mysteryEncounterPokemonData.types[0]); + types.push(this.customPokemonData.types[0]); // Fusing a Pokemon onto something with "permanently changed" types will still apply the fusion's types as normal const fusionSpeciesForm = this.getFusionSpeciesForm(ignoreOverride); if (fusionSpeciesForm) { // Check if the fusion Pokemon also had "permanently changed" types - const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types; + const fusionMETypes = this.fusionCustomPokemonData?.types; if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { types.push(fusionMETypes[1]); } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { @@ -1218,8 +1241,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - if (types.length === 1 && this.mysteryEncounterPokemonData.types.length >= 2) { - types.push(this.mysteryEncounterPokemonData.types[1]); + if (types.length === 1 && this.customPokemonData.types.length >= 2) { + types.push(this.customPokemonData.types[1]); } } else { const speciesForm = this.getSpeciesForm(ignoreOverride); @@ -1230,7 +1253,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (fusionSpeciesForm) { // Check if the fusion Pokemon also had "permanently changed" types // Otherwise, use standard fusion type logic - const fusionMETypes = this.fusionMysteryEncounterPokemonData?.types; + const fusionMETypes = this.fusionCustomPokemonData?.types; if (fusionMETypes && fusionMETypes.length >= 2 && fusionMETypes[1] !== types[0]) { types.push(fusionMETypes[1]); } else if (fusionMETypes && fusionMETypes.length === 1 && fusionMETypes[0] !== types[0]) { @@ -1262,6 +1285,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + // the type added to Pokemon from moves like Forest's Curse or Trick Or Treat + if (!ignoreOverride && this.summonData && this.summonData.addedType && !types.includes(this.summonData.addedType)) { + types.push(this.summonData.addedType); + } + + // If both types are the same (can happen in weird custom typing scenarios), reduce to single type + if (types.length > 1 && types[0] === types[1]) { + types.splice(0, 1); + } + return types; } @@ -1288,14 +1321,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return allAbilities[Overrides.OPP_ABILITY_OVERRIDE]; } if (this.isFusion()) { - if (!isNullOrUndefined(this.fusionMysteryEncounterPokemonData?.ability) && this.fusionMysteryEncounterPokemonData.ability !== -1) { - return allAbilities[this.fusionMysteryEncounterPokemonData.ability]; + if (!isNullOrUndefined(this.fusionCustomPokemonData?.ability) && this.fusionCustomPokemonData.ability !== -1) { + return allAbilities[this.fusionCustomPokemonData.ability]; } else { return allAbilities[this.getFusionSpeciesForm(ignoreOverride).getAbility(this.fusionAbilityIndex)]; } } - if (!isNullOrUndefined(this.mysteryEncounterPokemonData.ability) && this.mysteryEncounterPokemonData.ability !== -1) { - return allAbilities[this.mysteryEncounterPokemonData.ability]; + if (!isNullOrUndefined(this.customPokemonData.ability) && this.customPokemonData.ability !== -1) { + return allAbilities[this.customPokemonData.ability]; } let abilityId = this.getSpeciesForm(ignoreOverride).getAbility(this.abilityIndex); if (abilityId === Abilities.NONE) { @@ -1318,8 +1351,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (Overrides.OPP_PASSIVE_ABILITY_OVERRIDE && !this.isPlayer()) { return allAbilities[Overrides.OPP_PASSIVE_ABILITY_OVERRIDE]; } - if (!isNullOrUndefined(this.mysteryEncounterPokemonData.passive) && this.mysteryEncounterPokemonData.passive !== -1) { - return allAbilities[this.mysteryEncounterPokemonData.passive]; + if (!isNullOrUndefined(this.customPokemonData.passive) && this.customPokemonData.passive !== -1) { + return allAbilities[this.customPokemonData.passive]; } let starterSpeciesId = this.species.speciesId; @@ -2018,7 +2051,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.fusionVariant = 0; this.fusionGender = 0; this.fusionLuck = 0; - this.fusionMysteryEncounterPokemonData = null; + this.fusionCustomPokemonData = null; this.generateName(); this.calculateStats(); @@ -2119,7 +2152,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // Trainers get a weight bump to stat buffing moves movePool = movePool.map(m => [ m[0], m[1] * (allMoves[m[0]].getAttrs(StatStageChangeAttr).some(a => a.stages > 1 && a.selfTarget) ? 1.25 : 1) ]); // Trainers get a weight decrease to multiturn moves - movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].hasAttr(ChargeAttr) || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1) ]); + movePool = movePool.map(m => [ m[0], m[1] * (!!allMoves[m[0]].isChargingMove() || !!allMoves[m[0]].hasAttr(RechargeAttr) ? 0.7 : 1) ]); } // Weight towards higher power moves, by reducing the power of moves below the highest power. @@ -2187,7 +2220,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.moveset.push(new PokemonMove(movePool[index][0], 0, 0)); } - this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + // Trigger FormChange, except for enemy Pokemon during Mystery Encounters, to avoid crashes + if (this.isPlayer() || !this.scene.currentBattle?.isBattleMysteryEncounter() || !this.scene.currentBattle?.mysteryEncounter) { + this.scene.triggerPokemonFormChange(this, SpeciesFormChangeMoveLearnedTrigger); + } } trySelectMove(moveIndex: integer, ignorePp?: boolean): boolean { @@ -2285,6 +2321,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.levelExp = this.exp - getLevelTotalExp(this.level, this.species.growthRate); } + /** + * Compares if `this` and {@linkcode target} are on the same team. + * @param target the {@linkcode Pokemon} to compare against. + * @returns `true` if the two pokemon are allies, `false` otherwise + */ + public isOpponent(target: Pokemon): boolean { + return this.isPlayer() !== target.isPlayer(); + } + getOpponent(targetIndex: integer): Pokemon | null { const ret = this.getOpponents()[targetIndex]; if (ret.summonData) { @@ -2338,14 +2383,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { if (opponent) { if (isCritical) { switch (stat) { - case Stat.ATK: - case Stat.SPATK: - statStage.value = Math.max(statStage.value, 0); - break; - case Stat.DEF: - case Stat.SPDEF: - statStage.value = Math.min(statStage.value, 0); - break; + case Stat.ATK: + case Stat.SPATK: + statStage.value = Math.max(statStage.value, 0); + break; + case Stat.DEF: + case Stat.SPDEF: + statStage.value = Math.min(statStage.value, 0); + break; } } if (!ignoreOppAbility) { @@ -2605,7 +2650,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** Reduces damage if this Pokemon has a relevant screen (e.g. Light Screen for special attacks) */ const screenMultiplier = new Utils.NumberHolder(1); - this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, moveCategory, screenMultiplier); + this.scene.arena.applyTagsForSide(WeakenMoveScreenTag, defendingSide, simulated, source, moveCategory, screenMultiplier); /** * For each {@linkcode HitsTagAttr} the move has, doubles the damage of the move if: @@ -2654,9 +2699,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.applyModifiers(EnemyDamageReducerModifier, false, damage); } + /** Apply this Pokemon's post-calc defensive modifiers (e.g. Fur Coat) */ if (!ignoreAbility) { applyPreDefendAbAttrs(ReceivedMoveDamageMultiplierAbAttr, this, source, move, cancelled, simulated, damage); + + /** Additionally apply friend guard damage reduction if ally has it. */ + if (this.scene.currentBattle.double && this.getAlly()?.isActive(true)) { + applyPreDefendAbAttrs(AlliedFieldDamageReductionAbAttr, this.getAlly(), source, move, cancelled, simulated, damage); + } } // This attribute may modify damage arbitrarily, so be careful about changing its order of application. @@ -2767,7 +2818,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * We explicitly require to ignore the faint phase here, as we want to show the messages * about the critical hit and the super effective/not very effective messages before the faint phase. */ - const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true); + const damage = this.damageAndUpdate(isBlockedBySubstitute ? 0 : dmg, result as DamageResult, isCritical, isOneHitKo, isOneHitKo, true, source); if (damage > 0) { if (source.isPlayer()) { @@ -2776,10 +2827,19 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.scene.gameData.gameStats.highestDamage = damage; } } - source.turnData.damageDealt += damage; - source.turnData.currDamageDealt = damage; + source.turnData.totalDamageDealt += damage; + source.turnData.singleHitDamageDealt = damage; this.turnData.damageTaken += damage; this.battleData.hitCount++; + + // Multi-Lens and Parental Bond check for Wimp Out/Emergency Exit + if (this.hasAbilityWithAttr(PostDamageForceSwitchAbAttr)) { + const multiHitModifier = source.getHeldItems().find(m => m instanceof PokemonMultiHitModifier); + if (multiHitModifier || source.hasAbilityWithAttr(AddSecondStrikeAbAttr)) { + applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); + } + } + const attackResult = { move: move.id, result: result as DamageResult, damage: damage, critical: isCritical, sourceId: source.id, sourceBattlerIndex: source.getBattlerIndex() }; this.turnData.attacksReceived.unshift(attackResult); if (source.isPlayer() && !this.isPlayer()) { @@ -2795,15 +2855,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { // want to include is.Fainted() in case multi hit move ends early, still want to render message if (source.turnData.hitsLeft === 1 || this.isFainted()) { switch (result) { - case HitResult.SUPER_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); - break; - case HitResult.ONE_HIT_KO: - this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); - break; + case HitResult.SUPER_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultSuperEffective")); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.queueMessage(i18next.t("battle:hitResultNotVeryEffective")); + break; + case HitResult.ONE_HIT_KO: + this.scene.queueMessage(i18next.t("battle:hitResultOneHitKO")); + break; } } @@ -2867,7 +2927,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { this.destroySubstitute(); this.resetSummonData(); } - return damage; } @@ -2881,12 +2940,13 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { * @param ignoreFaintPhase boolean to ignore adding a FaintPhase, passsed to damage() * @returns integer of damage done */ - damageAndUpdate(damage: integer, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false): integer { + damageAndUpdate(damage: integer, result?: DamageResult, critical: boolean = false, ignoreSegments: boolean = false, preventEndure: boolean = false, ignoreFaintPhase: boolean = false, source?: Pokemon): integer { const damagePhase = new DamagePhase(this.scene, this.getBattlerIndex(), damage, result as DamageResult, critical); this.scene.unshiftPhase(damagePhase); damage = this.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); // Damage amount may have changed, but needed to be queued before calling damage function damagePhase.updateAmount(damage); + applyPostDamageAbAttrs(PostDamageAbAttr, this, damage, this.hasPassive(), false, [], source); return damage; } @@ -3347,61 +3407,60 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - const types = this.getTypes(true, true); - - const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; - if (sourcePokemon && sourcePokemon !== this && this.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) { + if (sourcePokemon && sourcePokemon !== this && this.isSafeguarded(sourcePokemon)) { return false; } - switch (effect) { - case StatusEffect.POISON: - case StatusEffect.TOXIC: - // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity - const poisonImmunity = types.map(defType => { - // Check if the Pokemon is not immune to Poison/Toxic - if (defType !== Type.POISON && defType !== Type.STEEL) { - return false; - } + const types = this.getTypes(true, true); - // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity - const cancelImmunity = new Utils.BooleanHolder(false); - if (sourcePokemon) { - applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType); - if (cancelImmunity.value) { + switch (effect) { + case StatusEffect.POISON: + case StatusEffect.TOXIC: + // Check if the Pokemon is immune to Poison/Toxic or if the source pokemon is canceling the immunity + const poisonImmunity = types.map(defType => { + // Check if the Pokemon is not immune to Poison/Toxic + if (defType !== Type.POISON && defType !== Type.STEEL) { + return false; + } + + // Check if the source Pokemon has an ability that cancels the Poison/Toxic immunity + const cancelImmunity = new Utils.BooleanHolder(false); + if (sourcePokemon) { + applyAbAttrs(IgnoreTypeStatusEffectImmunityAbAttr, sourcePokemon, cancelImmunity, false, effect, defType); + if (cancelImmunity.value) { + return false; + } + } + + return true; + }); + + if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { + if (poisonImmunity.includes(true)) { return false; } } - - return true; - }); - - if (this.isOfType(Type.POISON) || this.isOfType(Type.STEEL)) { - if (poisonImmunity.includes(true)) { + break; + case StatusEffect.PARALYSIS: + if (this.isOfType(Type.ELECTRIC)) { return false; } - } - break; - case StatusEffect.PARALYSIS: - if (this.isOfType(Type.ELECTRIC)) { - return false; - } - break; - case StatusEffect.SLEEP: - if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.ELECTRIC) { - return false; - } - break; - case StatusEffect.FREEZE: - if (this.isOfType(Type.ICE) || (this.scene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(this.scene.arena.weather.weatherType))) { - return false; - } - break; - case StatusEffect.BURN: - if (this.isOfType(Type.FIRE)) { - return false; - } - break; + break; + case StatusEffect.SLEEP: + if (this.isGrounded() && this.scene.arena.terrain?.terrainType === TerrainType.ELECTRIC) { + return false; + } + break; + case StatusEffect.FREEZE: + if (this.isOfType(Type.ICE) || (this.scene?.arena?.weather?.weatherType && [ WeatherType.SUNNY, WeatherType.HARSH_SUN ].includes(this.scene.arena.weather.weatherType))) { + return false; + } + break; + case StatusEffect.BURN: + if (this.isOfType(Type.FIRE)) { + return false; + } + break; } const cancelled = new Utils.BooleanHolder(false); @@ -3417,7 +3476,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { return true; } - trySetStatus(effect: StatusEffect | undefined, asPhase: boolean = false, sourcePokemon: Pokemon | null = null, cureTurn: integer | null = 0, sourceText: string | null = null): boolean { + trySetStatus(effect?: StatusEffect, asPhase: boolean = false, sourcePokemon: Pokemon | null = null, turnsRemaining: number = 0, sourceText: string | null = null): boolean { if (!this.canSetStatus(effect, asPhase, false, sourcePokemon)) { return false; } @@ -3431,15 +3490,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } if (asPhase) { - this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, cureTurn, sourceText, sourcePokemon)); + this.scene.unshiftPhase(new ObtainStatusEffectPhase(this.scene, this.getBattlerIndex(), effect, turnsRemaining, sourceText, sourcePokemon)); return true; } - let statusCureTurn: Utils.IntegerHolder; + let sleepTurnsRemaining: Utils.NumberHolder; if (effect === StatusEffect.SLEEP) { - statusCureTurn = new Utils.IntegerHolder(this.randSeedIntRange(2, 4)); - applyAbAttrs(ReduceStatusEffectDurationAbAttr, this, null, false, effect, statusCureTurn); + sleepTurnsRemaining = new Utils.NumberHolder(this.randSeedIntRange(2, 4)); this.setFrameRate(4); @@ -3459,9 +3517,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } - statusCureTurn = statusCureTurn!; // tell TS compiler it's defined + sleepTurnsRemaining = sleepTurnsRemaining!; // tell TS compiler it's defined effect = effect!; // If `effect` is undefined then `trySetStatus()` will have already returned early via the `canSetStatus()` call - this.status = new Status(effect, 0, statusCureTurn?.value); + this.status = new Status(effect, 0, sleepTurnsRemaining?.value); if (effect !== StatusEffect.FAINT) { this.scene.triggerPokemonFormChange(this, SpeciesFormChangeStatusEffectTrigger, true); @@ -3499,6 +3557,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } } + /** + * Checks if this Pokemon is protected by Safeguard + * @param attacker the {@linkcode Pokemon} inflicting status on this Pokemon + * @returns `true` if this Pokemon is protected by Safeguard; `false` otherwise. + */ + isSafeguarded(attacker: Pokemon): boolean { + const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; + if (this.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) { + const bypassed = new Utils.BooleanHolder(false); + if (attacker) { + applyAbAttrs(InfiltratorAbAttr, attacker, null, false, bypassed); + } + return !bypassed.value; + } + return false; + } + primeSummonData(summonDataPrimer: PokemonSummonData): void { this.summonDataPrimer = summonDataPrimer; } @@ -3971,16 +4046,20 @@ export class PlayerPokemon extends Pokemon { super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource); if (Overrides.STATUS_OVERRIDE) { - this.status = new Status(Overrides.STATUS_OVERRIDE); + this.status = new Status(Overrides.STATUS_OVERRIDE, 0, 4); } if (Overrides.SHINY_OVERRIDE) { this.shiny = true; this.initShinySparkle(); - if (Overrides.VARIANT_OVERRIDE) { - this.variant = Overrides.VARIANT_OVERRIDE; - } + } else if (Overrides.SHINY_OVERRIDE === false) { + this.shiny = false; } + + if (Overrides.VARIANT_OVERRIDE !== null && this.shiny) { + this.variant = Overrides.VARIANT_OVERRIDE; + } + if (!dataSource) { if (this.scene.gameMode.isDaily) { this.generateAndPopulateMoveset(); @@ -4082,7 +4161,11 @@ export class PlayerPokemon extends Pokemon { fusionStarterSpeciesId ? this.scene.gameData.starterData[fusionStarterSpeciesId] : null ].filter(d => !!d); const amount = new Utils.IntegerHolder(friendship); - const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER : 1) / (fusionStarterSpeciesId ? 2 : 1))); + let candyFriendshipMultiplier = CLASSIC_CANDY_FRIENDSHIP_MULTIPLIER; + if (this.scene.eventManager.isEventActive()) { + candyFriendshipMultiplier *= this.scene.eventManager.getFriendshipMultiplier(); + } + const starterAmount = new Utils.IntegerHolder(Math.floor(friendship * (this.scene.gameMode.isClassic && friendship > 0 ? candyFriendshipMultiplier : 1) / (fusionStarterSpeciesId ? 2 : 1))); if (amount.value > 0) { this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, amount); this.scene.applyModifier(PokemonFriendshipBoosterModifier, true, this, starterAmount); @@ -4250,7 +4333,6 @@ export class PlayerPokemon extends Pokemon { if (newEvolution.condition?.predicate(this)) { const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, undefined, this.shiny, this.variant, this.ivs, this.nature); - newPokemon.natureOverride = this.natureOverride; newPokemon.passive = this.passive; newPokemon.moveset = this.moveset.slice(); newPokemon.moveset = this.copyMoveset(); @@ -4292,12 +4374,33 @@ export class PlayerPokemon extends Pokemon { changeForm(formChange: SpeciesFormChange): Promise { return new Promise(resolve => { + const previousFormIndex = this.formIndex; this.formIndex = Math.max(this.species.forms.findIndex(f => f.formKey === formChange.formKey), 0); this.generateName(); const abilityCount = this.getSpeciesForm().getAbilityCount(); if (this.abilityIndex >= abilityCount) { // Shouldn't happen this.abilityIndex = abilityCount - 1; } + + // In cases where a form change updates the type of a Pokemon from its previous form (Arceus, Silvally, Castform, etc.), + // persist that type change in customPokemonData if necessary + const baseForm = this.species.forms[previousFormIndex]; + const baseFormTypes = [ baseForm.type1, baseForm.type2 ]; + if (this.customPokemonData.types.length > 0) { + if (this.getSpeciesForm().type1 !== baseFormTypes[0]) { + this.customPokemonData.types[0] = this.getSpeciesForm().type1; + } + + const type2 = this.getSpeciesForm().type2; + if (!isNullOrUndefined(type2) && type2 !== baseFormTypes[1]) { + if (this.customPokemonData.types.length > 1) { + this.customPokemonData.types[1] = type2; + } else { + this.customPokemonData.types.push(type2); + } + } + } + this.compatibleTms.splice(0, this.compatibleTms.length); this.generateCompatibleTms(); const updateAndResolve = () => { @@ -4334,7 +4437,7 @@ export class PlayerPokemon extends Pokemon { this.fusionVariant = pokemon.variant; this.fusionGender = pokemon.gender; this.fusionLuck = pokemon.luck; - this.fusionMysteryEncounterPokemonData = pokemon.mysteryEncounterPokemonData; + this.fusionCustomPokemonData = pokemon.customPokemonData; if ((pokemon.pauseEvolutions) || (this.pauseEvolutions)) { this.pauseEvolutions = true; } @@ -4379,7 +4482,7 @@ export class PlayerPokemon extends Pokemon { this.scene.removePartyMemberModifiers(fusedPartyMemberIndex); this.scene.getParty().splice(fusedPartyMemberIndex, 1)[0]; const newPartyMemberIndex = this.scene.getParty().indexOf(this); - pokemon.getMoveset(true).map(m => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m!.getMove().id))); // TODO: is the bang correct? + pokemon.getMoveset(true).map((m: PokemonMove) => this.scene.unshiftPhase(new LearnMovePhase(this.scene, newPartyMemberIndex, m.getMove().id))); pokemon.destroy(); this.updateFusionPalette(); resolve(); @@ -4400,8 +4503,12 @@ export class PlayerPokemon extends Pokemon { /** Returns a deep copy of this Pokemon's moveset array */ copyMoveset(): PokemonMove[] { const newMoveset : PokemonMove[] = []; - this.moveset.forEach(move => - newMoveset.push(new PokemonMove(move!.moveId, 0, move!.ppUp, move!.virtual))); // TODO: are those bangs correct? + this.moveset.forEach((move) => { + // TODO: refactor `moveset` to not accept `null`s + if (move) { + newMoveset.push(new PokemonMove(move.moveId, 0, move.ppUp, move.virtual, move.maxPpOverride)); + } + }); return newMoveset; } @@ -4426,7 +4533,7 @@ export class EnemyPokemon extends Pokemon { } if (Overrides.OPP_STATUS_OVERRIDE) { - this.status = new Status(Overrides.OPP_STATUS_OVERRIDE); + this.status = new Status(Overrides.OPP_STATUS_OVERRIDE, 0, 4); } if (Overrides.OPP_GENDER_OVERRIDE) { @@ -4435,9 +4542,11 @@ export class EnemyPokemon extends Pokemon { const speciesId = this.species.speciesId; - if (speciesId in Overrides.OPP_FORM_OVERRIDES + if ( + speciesId in Overrides.OPP_FORM_OVERRIDES && Overrides.OPP_FORM_OVERRIDES[speciesId] - && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]]) { + && this.species.forms[Overrides.OPP_FORM_OVERRIDES[speciesId]] + ) { this.formIndex = Overrides.OPP_FORM_OVERRIDES[speciesId] ?? 0; } @@ -4448,10 +4557,13 @@ export class EnemyPokemon extends Pokemon { if (Overrides.OPP_SHINY_OVERRIDE) { this.shiny = true; this.initShinySparkle(); + } else if (Overrides.OPP_SHINY_OVERRIDE === false) { + this.shiny = false; } + if (this.shiny) { this.variant = this.generateVariant(); - if (Overrides.OPP_VARIANT_OVERRIDE) { + if (Overrides.OPP_VARIANT_OVERRIDE !== null) { this.variant = Overrides.OPP_VARIANT_OVERRIDE; } } @@ -4501,35 +4613,35 @@ export class EnemyPokemon extends Pokemon { generateAndPopulateMoveset(formIndex?: integer): void { switch (true) { - case (this.species.speciesId === Species.SMEARGLE): - this.moveset = [ - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH), - new PokemonMove(Moves.SKETCH) - ]; - break; - case (this.species.speciesId === Species.ETERNATUS): - this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) - ? [ - new PokemonMove(Moves.DYNAMAX_CANNON), - new PokemonMove(Moves.CROSS_POISON), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.RECOVER, 0, -4) - ] - : [ - new PokemonMove(Moves.ETERNABEAM), - new PokemonMove(Moves.SLUDGE_BOMB), - new PokemonMove(Moves.FLAMETHROWER), - new PokemonMove(Moves.COSMIC_POWER) + case (this.species.speciesId === Species.SMEARGLE): + this.moveset = [ + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH), + new PokemonMove(Moves.SKETCH) ]; - if (this.scene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) { - this.moveset[2] = new PokemonMove(Moves.THUNDERBOLT); - } - break; - default: - super.generateAndPopulateMoveset(); - break; + break; + case (this.species.speciesId === Species.ETERNATUS): + this.moveset = (formIndex !== undefined ? formIndex : this.formIndex) + ? [ + new PokemonMove(Moves.DYNAMAX_CANNON), + new PokemonMove(Moves.CROSS_POISON), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.RECOVER, 0, -4) + ] + : [ + new PokemonMove(Moves.ETERNABEAM), + new PokemonMove(Moves.SLUDGE_BOMB), + new PokemonMove(Moves.FLAMETHROWER), + new PokemonMove(Moves.COSMIC_POWER) + ]; + if (this.scene.gameMode.hasChallenge(Challenges.INVERSE_BATTLE)) { + this.moveset[2] = new PokemonMove(Moves.THUNDERBOLT); + } + break; + default: + super.generateAndPopulateMoveset(); + break; } } @@ -4569,135 +4681,135 @@ export class EnemyPokemon extends Pokemon { } } switch (this.aiType) { - case AiType.RANDOM: // No enemy should spawn with this AI type in-game - const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? - return { move: moveId, targets: this.getNextTargets(moveId) }; - case AiType.SMART_RANDOM: - case AiType.SMART: + case AiType.RANDOM: // No enemy should spawn with this AI type in-game + const moveId = movePool[this.scene.randBattleSeedInt(movePool.length)]!.moveId; // TODO: is the bang correct? + return { move: moveId, targets: this.getNextTargets(moveId) }; + case AiType.SMART_RANDOM: + case AiType.SMART: /** * Search this Pokemon's move pool for moves that will KO an opposing target. * If there are any moves that can KO an opponent (i.e. a player Pokemon), * those moves are the only ones considered for selection on this turn. */ - const koMoves = movePool.filter(pkmnMove => { - if (!pkmnMove) { - return false; - } + const koMoves = movePool.filter(pkmnMove => { + if (!pkmnMove) { + return false; + } - const move = pkmnMove.getMove()!; - if (move.moveTarget === MoveTarget.ATTACKER) { - return false; - } + const move = pkmnMove.getMove()!; + if (move.moveTarget === MoveTarget.ATTACKER) { + return false; + } - const fieldPokemon = this.scene.getField(); - const moveTargets = getMoveTargets(this, move.id).targets - .map(ind => fieldPokemon[ind]) - .filter(p => this.isPlayer() !== p.isPlayer()); - // Only considers critical hits for crit-only moves or when this Pokemon is under the effect of Laser Focus - const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); + const fieldPokemon = this.scene.getField(); + const moveTargets = getMoveTargets(this, move.id).targets + .map(ind => fieldPokemon[ind]) + .filter(p => this.isPlayer() !== p.isPlayer()); + // Only considers critical hits for crit-only moves or when this Pokemon is under the effect of Laser Focus + const isCritical = move.hasAttr(CritOnlyAttr) || !!this.getTag(BattlerTagType.ALWAYS_CRIT); - return move.category !== MoveCategory.STATUS + return move.category !== MoveCategory.STATUS && moveTargets.some(p => { const doesNotFail = move.applyConditions(this, p, move) || [ Moves.SUCKER_PUNCH, Moves.UPPER_HAND, Moves.THUNDERCLAP ].includes(move.id); return doesNotFail && p.getAttackDamage(this, move, !p.battleData.abilityRevealed, false, isCritical).damage >= p.hp; }); - }, this); + }, this); - if (koMoves.length > 0) { - movePool = koMoves; - } + if (koMoves.length > 0) { + movePool = koMoves; + } - /** + /** * Move selection is based on the move's calculated "benefit score" against the * best possible target(s) (as determined by {@linkcode getNextTargets}). * For more information on how benefit scores are calculated, see `docs/enemy-ai.md`. */ - const moveScores = movePool.map(() => 0); - const moveTargets = Object.fromEntries(movePool.map(m => [ m!.moveId, this.getNextTargets(m!.moveId) ])); // TODO: are those bangs correct? - for (const m in movePool) { - const pokemonMove = movePool[m]!; // TODO: is the bang correct? - const move = pokemonMove.getMove(); + const moveScores = movePool.map(() => 0); + const moveTargets = Object.fromEntries(movePool.map(m => [ m!.moveId, this.getNextTargets(m!.moveId) ])); // TODO: are those bangs correct? + for (const m in movePool) { + const pokemonMove = movePool[m]!; // TODO: is the bang correct? + const move = pokemonMove.getMove(); - let moveScore = moveScores[m]; - const targetScores: integer[] = []; + let moveScore = moveScores[m]; + const targetScores: integer[] = []; - for (const mt of moveTargets[move.id]) { + for (const mt of moveTargets[move.id]) { // Prevent a target score from being calculated when the target is whoever attacks the user - if (mt === BattlerIndex.ATTACKER) { - break; - } + if (mt === BattlerIndex.ATTACKER) { + break; + } - const target = this.scene.getField()[mt]; - /** + const target = this.scene.getField()[mt]; + /** * The "target score" of a move is given by the move's user benefit score + the move's target benefit score. * If the target is an ally, the target benefit score is multiplied by -1. */ - 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; - } - /** + 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 this move is unimplemented, or the move is known to fail when used, set its * target score to -20 */ - 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) { + 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) { /** * Attack moves are given extra multipliers to their base benefit score based on * the move's type effectiveness against the target and whether the move is a STAB move. */ - const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); - if (target.isPlayer() !== this.isPlayer()) { - targetScore *= effectiveness; - if (this.isOfType(move.type)) { - targetScore *= 1.5; + const effectiveness = target.getMoveEffectiveness(this, move, !target.battleData?.abilityRevealed); + if (target.isPlayer() !== this.isPlayer()) { + targetScore *= effectiveness; + if (this.isOfType(move.type)) { + targetScore *= 1.5; + } + } else if (effectiveness) { + targetScore /= effectiveness; + if (this.isOfType(move.type)) { + targetScore /= 1.5; + } } - } else if (effectiveness) { - targetScore /= effectiveness; - if (this.isOfType(move.type)) { - targetScore /= 1.5; + /** If a move has a base benefit score of 0, its benefit score is assumed to be unimplemented at this point */ + if (!targetScore) { + targetScore = -20; } } - /** If a move has a base benefit score of 0, its benefit score is assumed to be unimplemented at this point */ - if (!targetScore) { - targetScore = -20; - } + targetScores.push(targetScore); } - targetScores.push(targetScore); + // When a move has multiple targets, its score is equal to the maximum target score across all targets + moveScore += Math.max(...targetScores); + + // could make smarter by checking opponent def/spdef + moveScores[m] = moveScore; } - // When a move has multiple targets, its score is equal to the maximum target score across all targets - moveScore += Math.max(...targetScores); - // could make smarter by checking opponent def/spdef - moveScores[m] = moveScore; - } + console.log(moveScores); - console.log(moveScores); - - // Sort the move pool in decreasing order of move score - const sortedMovePool = movePool.slice(0); - sortedMovePool.sort((a, b) => { - const scoreA = moveScores[movePool.indexOf(a)]; - const scoreB = moveScores[movePool.indexOf(b)]; - return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; - }); - let r = 0; - if (this.aiType === AiType.SMART_RANDOM) { + // Sort the move pool in decreasing order of move score + const sortedMovePool = movePool.slice(0); + sortedMovePool.sort((a, b) => { + const scoreA = moveScores[movePool.indexOf(a)]; + const scoreB = moveScores[movePool.indexOf(b)]; + return scoreA < scoreB ? 1 : scoreA > scoreB ? -1 : 0; + }); + let r = 0; + if (this.aiType === AiType.SMART_RANDOM) { // Has a 5/8 chance to select the best move, and a 3/8 chance to advance to the next best move (and repeat this roll) - while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) { - r++; - } - } else if (this.aiType === AiType.SMART) { + while (r < sortedMovePool.length - 1 && this.scene.randBattleSeedInt(8) >= 5) { + r++; + } + } else if (this.aiType === AiType.SMART) { // The chance to advance to the next best move increases when the compared moves' scores are closer to each other. - while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 + while (r < sortedMovePool.length - 1 && (moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) >= 0 && this.scene.randBattleSeedInt(100) < Math.round((moveScores[movePool.indexOf(sortedMovePool[r + 1])] / moveScores[movePool.indexOf(sortedMovePool[r])]) * 50)) { - r++; + r++; + } } - } - console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); // TODO: are those bangs correct? - return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; + console.log(movePool.map(m => m!.getName()), moveScores, r, sortedMovePool.map(m => m!.getName())); // TODO: are those bangs correct? + return { move: sortedMovePool[r]!.moveId, targets: moveTargets[sortedMovePool[r]!.moveId] }; } } @@ -4845,10 +4957,10 @@ export class EnemyPokemon extends Pokemon { } switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - if (!this.formIndex && this.bossSegmentIndex < 1) { - damage = Math.min(damage, this.hp - 1); - } + case BattleSpec.FINAL_BOSS: + if (!this.formIndex && this.bossSegmentIndex < 1) { + damage = Math.min(damage, this.hp - 1); + } } const ret = super.damage(damage, ignoreSegments, preventEndure, ignoreFaintPhase); @@ -5018,7 +5130,6 @@ export class PokemonSummonData { public tags: BattlerTag[] = []; public abilitySuppressed: boolean = false; public abilitiesApplied: Abilities[] = []; - public speciesForm: PokemonSpeciesForm | null; public fusionSpeciesForm: PokemonSpeciesForm; public ability: Abilities = Abilities.NONE; @@ -5029,6 +5140,7 @@ export class PokemonSummonData { public moveset: (PokemonMove | null)[]; // If not initialized this value will not be populated from save data. public types: Type[] = []; + public addedType: Type | null = null; } export class PokemonBattleData { @@ -5057,8 +5169,8 @@ export class PokemonTurnData { * - `0` = Move is finished */ public hitsLeft: number = -1; - public damageDealt: number = 0; - public currDamageDealt: number = 0; + public totalDamageDealt: number = 0; + public singleHitDamageDealt: number = 0; public damageTaken: number = 0; public attacksReceived: AttackMoveResult[] = []; public order: number; @@ -5066,6 +5178,8 @@ export class PokemonTurnData { public statStagesDecreased: boolean = false; public moveEffectiveness: TypeDamageMultiplier | null = null; public combiningPledge?: Moves; + public switchedInThisTurn: boolean = false; + public failedRunAway: boolean = false; } export enum AiType { @@ -5123,15 +5237,22 @@ export interface DamageCalculationResult { **/ export class PokemonMove { public moveId: Moves; - public ppUsed: integer; - public ppUp: integer; + public ppUsed: number; + public ppUp: number; public virtual: boolean; - constructor(moveId: Moves, ppUsed?: integer, ppUp?: integer, virtual?: boolean) { + /** + * If defined and nonzero, overrides the maximum PP of the move (e.g., due to move being copied by Transform). + * This also nullifies all effects of `ppUp`. + */ + public maxPpOverride?: number; + + constructor(moveId: Moves, ppUsed: number = 0, ppUp: number = 0, virtual: boolean = false, maxPpOverride?: number) { this.moveId = moveId; - this.ppUsed = ppUsed || 0; - this.ppUp = ppUp || 0; - this.virtual = !!virtual; + this.ppUsed = ppUsed; + this.ppUp = ppUp; + this.virtual = virtual; + this.maxPpOverride = maxPpOverride; } /** @@ -5168,7 +5289,7 @@ export class PokemonMove { } getMovePp(): integer { - return this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5); + return this.maxPpOverride || (this.getMove().pp + this.ppUp * Utils.toDmgValue(this.getMove().pp / 5)); } getPpRatio(): number { @@ -5185,6 +5306,6 @@ export class PokemonMove { * @return {PokemonMove} A valid pokemonmove object */ static loadMove(source: PokemonMove | any): PokemonMove { - return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual); + return new PokemonMove(source.moveId, source.ppUsed, source.ppUp, source.virtual, source.maxPpOverride); } } diff --git a/src/field/trainer.ts b/src/field/trainer.ts index 5110787452f..b77a156f401 100644 --- a/src/field/trainer.ts +++ b/src/field/trainer.ts @@ -65,16 +65,16 @@ export default class Trainer extends Phaser.GameObjects.Container { } switch (this.variant) { - case TrainerVariant.FEMALE: - if (!this.config.hasGenders) { - variant = TrainerVariant.DEFAULT; - } - break; - case TrainerVariant.DOUBLE: - if (!this.config.hasDouble) { - variant = TrainerVariant.DEFAULT; - } - break; + case TrainerVariant.FEMALE: + if (!this.config.hasGenders) { + variant = TrainerVariant.DEFAULT; + } + break; + case TrainerVariant.DOUBLE: + if (!this.config.hasDouble) { + variant = TrainerVariant.DEFAULT; + } + break; } console.log(Object.keys(trainerPartyTemplates)[Object.values(trainerPartyTemplates).indexOf(this.getPartyTemplate())]); @@ -229,21 +229,21 @@ export default class Trainer extends Phaser.GameObjects.Container { const strength = partyTemplate.getStrength(i); switch (strength) { - case PartyMemberStrength.WEAKER: - multiplier = 0.95; - break; - case PartyMemberStrength.WEAK: - multiplier = 1.0; - break; - case PartyMemberStrength.AVERAGE: - multiplier = 1.1; - break; - case PartyMemberStrength.STRONG: - multiplier = 1.2; - break; - case PartyMemberStrength.STRONGER: - multiplier = 1.25; - break; + case PartyMemberStrength.WEAKER: + multiplier = 0.95; + break; + case PartyMemberStrength.WEAK: + multiplier = 1.0; + break; + case PartyMemberStrength.AVERAGE: + multiplier = 1.1; + break; + case PartyMemberStrength.STRONG: + multiplier = 1.2; + break; + case PartyMemberStrength.STRONGER: + multiplier = 1.25; + break; } let levelOffset = 0; @@ -515,19 +515,19 @@ export default class Trainer extends Phaser.GameObjects.Container { getPartyMemberModifierChanceMultiplier(index: integer): number { switch (this.getPartyTemplate().getStrength(index)) { - case PartyMemberStrength.WEAKER: - return 0.75; - case PartyMemberStrength.WEAK: - return 0.675; - case PartyMemberStrength.AVERAGE: - return 0.5625; - case PartyMemberStrength.STRONG: - return 0.45; - case PartyMemberStrength.STRONGER: - return 0.375; - default: - console.warn("getPartyMemberModifierChanceMultiplier not defined. Using default 0"); - return 0; + case PartyMemberStrength.WEAKER: + return 0.75; + case PartyMemberStrength.WEAK: + return 0.675; + case PartyMemberStrength.AVERAGE: + return 0.5625; + case PartyMemberStrength.STRONG: + return 0.45; + case PartyMemberStrength.STRONGER: + return 0.375; + default: + console.warn("getPartyMemberModifierChanceMultiplier not defined. Using default 0"); + return 0; } } diff --git a/src/game-mode.ts b/src/game-mode.ts index 91e8933ea6e..8f1bb9356e6 100644 --- a/src/game-mode.ts +++ b/src/game-mode.ts @@ -92,10 +92,10 @@ export class GameMode implements GameModeConfig { return Overrides.STARTING_LEVEL_OVERRIDE; } switch (this.modeId) { - case GameModes.DAILY: - return 20; - default: - return 5; + case GameModes.DAILY: + return 20; + default: + return 5; } } @@ -117,19 +117,19 @@ export class GameMode implements GameModeConfig { */ getStartingBiome(scene: BattleScene): Biome { switch (this.modeId) { - case GameModes.DAILY: - return scene.generateRandomBiome(this.getWaveForDifficulty(1)); - default: - return Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN; + case GameModes.DAILY: + return scene.generateRandomBiome(this.getWaveForDifficulty(1)); + default: + return Overrides.STARTING_BIOME_OVERRIDE || Biome.TOWN; } } getWaveForDifficulty(waveIndex: integer, ignoreCurveChanges: boolean = false): integer { switch (this.modeId) { - case GameModes.DAILY: - return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); - default: - return waveIndex; + case GameModes.DAILY: + return waveIndex + 30 + (!ignoreCurveChanges ? Math.floor(waveIndex / 5) : 0); + default: + return waveIndex; } } @@ -186,10 +186,10 @@ export class GameMode implements GameModeConfig { isTrainerBoss(waveIndex: integer, biomeType: Biome, offsetGym: boolean): boolean { switch (this.modeId) { - case GameModes.DAILY: - return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); - default: - return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); + case GameModes.DAILY: + return waveIndex > 10 && waveIndex < 50 && !(waveIndex % 10); + default: + return (waveIndex % 30) === (offsetGym ? 0 : 20) && (biomeType !== Biome.END || this.isClassic || this.isWaveFinal(waveIndex)); } } @@ -211,14 +211,14 @@ export class GameMode implements GameModeConfig { */ isWaveFinal(waveIndex: integer, modeId: GameModes = this.modeId): boolean { switch (modeId) { - case GameModes.CLASSIC: - case GameModes.CHALLENGE: - return waveIndex === 200; - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - return !(waveIndex % 250); - case GameModes.DAILY: - return waveIndex === 50; + case GameModes.CLASSIC: + case GameModes.CHALLENGE: + return waveIndex === 200; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + return !(waveIndex % 250); + case GameModes.DAILY: + return waveIndex === 50; } } @@ -287,40 +287,40 @@ export class GameMode implements GameModeConfig { getClearScoreBonus(): integer { switch (this.modeId) { - case GameModes.CLASSIC: - case GameModes.CHALLENGE: - return 5000; - case GameModes.DAILY: - return 2500; - default: - return 0; + case GameModes.CLASSIC: + case GameModes.CHALLENGE: + return 5000; + case GameModes.DAILY: + return 2500; + default: + return 0; } } getEnemyModifierChance(isBoss: boolean): integer { switch (this.modeId) { - case GameModes.CLASSIC: - case GameModes.CHALLENGE: - case GameModes.DAILY: - return !isBoss ? 18 : 6; - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - return !isBoss ? 12 : 4; + case GameModes.CLASSIC: + case GameModes.CHALLENGE: + case GameModes.DAILY: + return !isBoss ? 18 : 6; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + return !isBoss ? 12 : 4; } } getName(): string { switch (this.modeId) { - case GameModes.CLASSIC: - return i18next.t("gameMode:classic"); - case GameModes.ENDLESS: - return i18next.t("gameMode:endless"); - case GameModes.SPLICED_ENDLESS: - return i18next.t("gameMode:endlessSpliced"); - case GameModes.DAILY: - return i18next.t("gameMode:dailyRun"); - case GameModes.CHALLENGE: - return i18next.t("gameMode:challenge"); + case GameModes.CLASSIC: + return i18next.t("gameMode:classic"); + case GameModes.ENDLESS: + return i18next.t("gameMode:endless"); + case GameModes.SPLICED_ENDLESS: + return i18next.t("gameMode:endlessSpliced"); + case GameModes.DAILY: + return i18next.t("gameMode:dailyRun"); + case GameModes.CHALLENGE: + return i18next.t("gameMode:challenge"); } } @@ -329,42 +329,42 @@ export class GameMode implements GameModeConfig { */ getMysteryEncounterLegalWaves(): [number, number] { switch (this.modeId) { - default: - return [ 0, 0 ]; - case GameModes.CLASSIC: - return CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES; - case GameModes.CHALLENGE: - return CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES; + default: + return [ 0, 0 ]; + case GameModes.CLASSIC: + return CLASSIC_MODE_MYSTERY_ENCOUNTER_WAVES; + case GameModes.CHALLENGE: + return CHALLENGE_MODE_MYSTERY_ENCOUNTER_WAVES; } } static getModeName(modeId: GameModes): string { switch (modeId) { - case GameModes.CLASSIC: - return i18next.t("gameMode:classic"); - case GameModes.ENDLESS: - return i18next.t("gameMode:endless"); - case GameModes.SPLICED_ENDLESS: - return i18next.t("gameMode:endlessSpliced"); - case GameModes.DAILY: - return i18next.t("gameMode:dailyRun"); - case GameModes.CHALLENGE: - return i18next.t("gameMode:challenge"); + case GameModes.CLASSIC: + return i18next.t("gameMode:classic"); + case GameModes.ENDLESS: + return i18next.t("gameMode:endless"); + case GameModes.SPLICED_ENDLESS: + return i18next.t("gameMode:endlessSpliced"); + case GameModes.DAILY: + return i18next.t("gameMode:dailyRun"); + case GameModes.CHALLENGE: + return i18next.t("gameMode:challenge"); } } } export function getGameMode(gameMode: GameModes): GameMode { switch (gameMode) { - case GameModes.CLASSIC: - return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, classicFixedBattles); - case GameModes.ENDLESS: - return new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }); - case GameModes.SPLICED_ENDLESS: - return new GameMode(GameModes.SPLICED_ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true, isSplicedOnly: true }); - case GameModes.DAILY: - return new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }); - case GameModes.CHALLENGE: - return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true, hasMysteryEncounters: true }, classicFixedBattles); + case GameModes.CLASSIC: + return new GameMode(GameModes.CLASSIC, { isClassic: true, hasTrainers: true, hasMysteryEncounters: true }, classicFixedBattles); + case GameModes.ENDLESS: + return new GameMode(GameModes.ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true }); + case GameModes.SPLICED_ENDLESS: + return new GameMode(GameModes.SPLICED_ENDLESS, { isEndless: true, hasShortBiomes: true, hasRandomBosses: true, isSplicedOnly: true }); + case GameModes.DAILY: + return new GameMode(GameModes.DAILY, { isDaily: true, hasTrainers: true, hasNoShop: true }); + case GameModes.CHALLENGE: + return new GameMode(GameModes.CHALLENGE, { isClassic: true, hasTrainers: true, isChallenge: true, hasMysteryEncounters: true }, classicFixedBattles); } } diff --git a/src/loading-scene.ts b/src/loading-scene.ts index d6512486d0e..1aed61b34ba 100644 --- a/src/loading-scene.ts +++ b/src/loading-scene.ts @@ -165,6 +165,8 @@ export class LoadingScene extends SceneBase { this.loadImage("discord", "ui"); this.loadImage("google", "ui"); this.loadImage("settings_icon", "ui"); + this.loadImage("link_icon", "ui"); + this.loadImage("unlink_icon", "ui"); this.loadImage("default_bg", "arenas"); // Load arena images @@ -242,11 +244,11 @@ export class LoadingScene extends SceneBase { this.loadAtlas("statuses", ""); this.loadAtlas("types", ""); } - const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN" ]; + const availableLangs = [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ]; if (lang && availableLangs.includes(lang)) { - this.loadImage("egg-update_" + lang, "events"); + this.loadImage("halloween2024-event-" + lang, "events"); } else { - this.loadImage("egg-update_en", "events"); + this.loadImage("halloween2024-event-en", "events"); } this.loadAtlas("statuses", ""); @@ -477,18 +479,18 @@ export class LoadingScene extends SceneBase { this.load.on(this.LOAD_EVENTS.FILE_COMPLETE, (key: string) => { assetText.setText(i18next.t("menu:loadingAsset", { assetName: key })); switch (key) { - case "loading_bg": - bg.setTexture("loading_bg"); - if (mobile) { - bg.setVisible(true); - } - break; - case "logo": - logo.setTexture("logo"); - if (mobile) { - logo.setVisible(true); - } - break; + case "loading_bg": + bg.setTexture("loading_bg"); + if (mobile) { + bg.setVisible(true); + } + break; + case "logo": + logo.setTexture("logo"); + if (mobile) { + logo.setVisible(true); + } + break; } }); diff --git a/src/main.ts b/src/main.ts index 92ee267bf65..993bd1018ae 100644 --- a/src/main.ts +++ b/src/main.ts @@ -44,7 +44,7 @@ document.fonts.load("16px emerald").then(() => document.fonts.load("10px pkmnems let game; -const startGame = async () => { +const startGame = async (manifest?: any) => { await initI18n(); const LoadingScene = (await import("./loading-scene")).LoadingScene; const BattleScene = (await import("./battle-scene")).default; @@ -94,13 +94,15 @@ const startGame = async () => { version: version }); game.sound.pauseOnBlur = false; + if (manifest) { + game["manifest"] = manifest; + } }; fetch("/manifest.json") .then(res => res.json()) .then(jsonResponse => { - startGame(); - game["manifest"] = jsonResponse.manifest; + startGame(jsonResponse.manifest); }).catch(() => { // Manifest not found (likely local build) startGame(); diff --git a/src/messages.ts b/src/messages.ts index 1cd6a5966b6..91f550918e5 100644 --- a/src/messages.ts +++ b/src/messages.ts @@ -13,21 +13,21 @@ export function getPokemonNameWithAffix(pokemon: Pokemon | undefined): string { } switch (pokemon.scene.currentBattle.battleSpec) { - case BattleSpec.DEFAULT: - return !pokemon.isPlayer() - ? pokemon.hasTrainer() - ? i18next.t("battle:foePokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) - : i18next.t("battle:wildPokemonWithAffix", { - pokemonName: pokemon.getNameToRender(), - }) - : pokemon.getNameToRender(); - case BattleSpec.FINAL_BOSS: - return !pokemon.isPlayer() - ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) - : pokemon.getNameToRender(); - default: - return pokemon.getNameToRender(); + case BattleSpec.DEFAULT: + return !pokemon.isPlayer() + ? pokemon.hasTrainer() + ? i18next.t("battle:foePokemonWithAffix", { + pokemonName: pokemon.getNameToRender(), + }) + : i18next.t("battle:wildPokemonWithAffix", { + pokemonName: pokemon.getNameToRender(), + }) + : pokemon.getNameToRender(); + case BattleSpec.FINAL_BOSS: + return !pokemon.isPlayer() + ? i18next.t("battle:foePokemonWithAffix", { pokemonName: pokemon.getNameToRender() }) + : pokemon.getNameToRender(); + default: + return pokemon.getNameToRender(); } } diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 32173a6fead..dfa46ce3667 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -10,14 +10,16 @@ import { getStatusEffectDescriptor, StatusEffect } from "#app/data/status-effect import { Type } from "#app/data/type"; import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; -import { AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier } from "#app/modifier/modifier"; +import { + AddPokeballModifier, AddVoucherModifier, AttackTypeBoosterModifier, BaseStatModifier, BerryModifier, BoostBugSpawnModifier, BypassSpeedChanceModifier, ContactHeldItemTransferChanceModifier, CritBoosterModifier, DamageMoneyRewardModifier, DoubleBattleChanceBoosterModifier, EnemyAttackStatusEffectChanceModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, EvolutionItemModifier, EvolutionStatBoosterModifier, EvoTrackerModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, GigantamaxAccessModifier, HealingBoosterModifier, HealShopCostModifier, HiddenAbilityRateBoosterModifier, HitHealModifier, IvScannerModifier, LevelIncrementBoosterModifier, LockModifierTiersModifier, MapModifier, MegaEvolutionAccessModifier, MoneyInterestModifier, MoneyMultiplierModifier, MoneyRewardModifier, MultipleParticipantExpBonusModifier, PokemonAllMovePpRestoreModifier, PokemonBaseStatFlatModifier, PokemonBaseStatTotalModifier, PokemonExpBoosterModifier, PokemonFormChangeItemModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonHpRestoreModifier, PokemonIncrementingStatModifier, PokemonInstantReviveModifier, PokemonLevelIncrementModifier, PokemonMoveAccuracyBoosterModifier, PokemonMultiHitModifier, PokemonNatureChangeModifier, PokemonNatureWeightModifier, PokemonPpRestoreModifier, PokemonPpUpModifier, PokemonStatusHealModifier, PreserveBerryModifier, RememberMoveModifier, ResetNegativeStatStageModifier, ShinyRateBoosterModifier, SpeciesCritBoosterModifier, SpeciesStatBoosterModifier, SurviveDamageModifier, SwitchEffectTransferModifier, TempCritBoosterModifier, TempStatStageBoosterModifier, TerastallizeAccessModifier, TerastallizeModifier, TmModifier, TurnHealModifier, TurnHeldItemTransferModifier, TurnStatusEffectModifier, type EnemyPersistentModifier, type Modifier, type PersistentModifier, TempExtraModifierModifier +} from "#app/modifier/modifier"; import { ModifierTier } from "#app/modifier/modifier-tier"; import Overrides from "#app/overrides"; import { Unlockables } from "#app/system/unlockables"; import { getVoucherTypeIcon, getVoucherTypeName, VoucherType } from "#app/system/voucher"; import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "#app/ui/party-ui-handler"; import { getModifierTierTextTint } from "#app/ui/text"; -import { formatMoney, getEnumKeys, getEnumValues, IntegerHolder, NumberHolder, padInt, randSeedInt, randSeedItem } from "#app/utils"; +import { formatMoney, getEnumKeys, getEnumValues, IntegerHolder, isNullOrUndefined, NumberHolder, padInt, randSeedInt, randSeedItem } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { BerryType } from "#enums/berry-type"; @@ -78,18 +80,18 @@ export class ModifierType { } let poolTypes: ModifierPoolType[]; switch (poolType) { - case ModifierPoolType.PLAYER: - poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; - break; - case ModifierPoolType.WILD: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; - break; - case ModifierPoolType.TRAINER: - poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; - break; - default: - poolTypes = [ poolType ]; - break; + case ModifierPoolType.PLAYER: + poolTypes = [ poolType, ModifierPoolType.TRAINER, ModifierPoolType.WILD ]; + break; + case ModifierPoolType.WILD: + poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.TRAINER ]; + break; + case ModifierPoolType.TRAINER: + poolTypes = [ poolType, ModifierPoolType.PLAYER, ModifierPoolType.WILD ]; + break; + default: + poolTypes = [ poolType ]; + break; } // Try multiple pool types in case of stolen items for (const type of poolTypes) { @@ -119,18 +121,41 @@ export class ModifierType { * Populates item tier for ModifierType instance * Tier is a necessary field for items that appear in player shop (determines the Pokeball visual they use) * To find the tier, this function performs a reverse lookup of the item type in modifier pools + * It checks the weight of the item and will use the first tier for which the weight is greater than 0 + * This is to allow items to be in multiple item pools depending on the conditions, for example for events + * If all tiers have a weight of 0 for the item, the first tier where the item was found is used * @param poolType Default 'ModifierPoolType.PLAYER'. Which pool to lookup item tier from + * @param party optional. Needed to check the weight of modifiers with conditional weight (see {@linkcode WeightedModifierTypeWeightFunc}) + * if not provided or empty, the weight check will be ignored + * @param rerollCount Default `0`. Used to check the weight of modifiers with conditional weight (see {@linkcode WeightedModifierTypeWeightFunc}) */ - withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER): ModifierType { + withTierFromPool(poolType: ModifierPoolType = ModifierPoolType.PLAYER, party?: PlayerPokemon[], rerollCount: number = 0): ModifierType { + let defaultTier: undefined | ModifierTier; for (const tier of Object.values(getModifierPoolForType(poolType))) { for (const modifier of tier) { if (this.id === modifier.modifierType.id) { - this.tier = modifier.modifierType.tier; - return this; + let weight: number; + if (modifier.weight instanceof Function) { + weight = party ? modifier.weight(party, rerollCount) : 0; + } else { + weight = modifier.weight; + } + if (weight > 0) { + this.tier = modifier.modifierType.tier; + return this; + } else if (isNullOrUndefined(defaultTier)) { + // If weight is 0, keep track of the first tier where the item was found + defaultTier = modifier.modifierType.tier; + } } } } + // Didn't find a pool with weight > 0, fallback to first tier where the item was found, if any + if (defaultTier) { + this.tier = defaultTier; + } + return this; } @@ -382,7 +407,7 @@ export class PokemonPpUpModifierType extends PokemonMoveModifierType { (_pokemon: PlayerPokemon) => { return null; }, (pokemonMove: PokemonMove) => { - if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3) { + if (pokemonMove.getMove().pp < 5 || pokemonMove.ppUp >= 3 || pokemonMove.maxPpOverride) { return PartyUiHandler.NoEffectMessage; } return null; @@ -500,45 +525,25 @@ export class BerryModifierType extends PokemonHeldItemModifierType implements Ge } } -function getAttackTypeBoosterItemName(type: Type) { - switch (type) { - case Type.NORMAL: - return "Silk Scarf"; - case Type.FIGHTING: - return "Black Belt"; - case Type.FLYING: - return "Sharp Beak"; - case Type.POISON: - return "Poison Barb"; - case Type.GROUND: - return "Soft Sand"; - case Type.ROCK: - return "Hard Stone"; - case Type.BUG: - return "Silver Powder"; - case Type.GHOST: - return "Spell Tag"; - case Type.STEEL: - return "Metal Coat"; - case Type.FIRE: - return "Charcoal"; - case Type.WATER: - return "Mystic Water"; - case Type.GRASS: - return "Miracle Seed"; - case Type.ELECTRIC: - return "Magnet"; - case Type.PSYCHIC: - return "Twisted Spoon"; - case Type.ICE: - return "Never-Melt Ice"; - case Type.DRAGON: - return "Dragon Fang"; - case Type.DARK: - return "Black Glasses"; - case Type.FAIRY: - return "Fairy Feather"; - } +enum AttackTypeBoosterItem { + SILK_SCARF, + BLACK_BELT, + SHARP_BEAK, + POISON_BARB, + SOFT_SAND, + HARD_STONE, + SILVER_POWDER, + SPELL_TAG, + METAL_COAT, + CHARCOAL, + MYSTIC_WATER, + MIRACLE_SEED, + MAGNET, + TWISTED_SPOON, + NEVER_MELT_ICE, + DRAGON_FANG, + BLACK_GLASSES, + FAIRY_FEATHER } export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType { @@ -546,7 +551,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i public boostPercent: integer; constructor(moveType: Type, boostPercent: integer) { - super("", `${getAttackTypeBoosterItemName(moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`, + super("", `${AttackTypeBoosterItem[moveType]?.toLowerCase()}`, (_type, args) => new AttackTypeBoosterModifier(this, (args[0] as Pokemon).id, moveType, boostPercent)); this.moveType = moveType; @@ -554,7 +559,7 @@ export class AttackTypeBoosterModifierType extends PokemonHeldItemModifierType i } get name(): string { - return i18next.t(`modifierType:AttackTypeBoosterItem.${getAttackTypeBoosterItemName(this.moveType)?.replace(/[ \-]/g, "_").toLowerCase()}`); + return i18next.t(`modifierType:AttackTypeBoosterItem.${AttackTypeBoosterItem[this.moveType]?.toLowerCase()}`); } getDescription(scene: BattleScene): string { @@ -1126,7 +1131,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator { } class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { - constructor(rare: boolean) { + constructor(isRareFormChangeItem: boolean) { super((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) { return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem); @@ -1149,15 +1154,15 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { foundN_SOLAR = false; formChangeItemTriggers.forEach((fc, i) => { switch (fc.item) { - case FormChangeItem.ULTRANECROZIUM_Z: - foundULTRA_Z = true; - break; - case FormChangeItem.N_LUNARIZER: - foundN_LUNA = true; - break; - case FormChangeItem.N_SOLARIZER: - foundN_SOLAR = true; - break; + case FormChangeItem.ULTRANECROZIUM_Z: + foundULTRA_Z = true; + break; + case FormChangeItem.N_LUNARIZER: + foundN_LUNA = true; + break; + case FormChangeItem.N_SOLARIZER: + foundN_SOLAR = true; + break; } }); if (foundULTRA_Z && foundN_LUNA && foundN_SOLAR) { @@ -1167,7 +1172,7 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator { } return formChangeItemTriggers; }).flat()) - ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === rare); + ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === isRareFormChangeItem); // convert it into a set to remove duplicate values, which can appear when the same species with a potential form change is in the party. if (!formChangeItemPool.length) { @@ -1299,13 +1304,12 @@ function lureWeightFunc(maxBattles: number, weight: number): WeightedModifierTyp return !(party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex === 199) && (lures.length === 0 || lures.filter(m => m.getMaxBattles() === maxBattles && m.getBattleCount() >= maxBattles * 0.6).length === 0) ? weight : 0; }; } - class WeightedModifierType { public modifierType: ModifierType; public weight: integer | WeightedModifierTypeWeightFunc; - public maxWeight: integer; + public maxWeight: integer | WeightedModifierTypeWeightFunc; - constructor(modifierTypeFunc: ModifierTypeFunc, weight: integer | WeightedModifierTypeWeightFunc, maxWeight?: integer) { + constructor(modifierTypeFunc: ModifierTypeFunc, weight: integer | WeightedModifierTypeWeightFunc, maxWeight?: integer | WeightedModifierTypeWeightFunc) { this.modifierType = modifierTypeFunc(); this.modifierType.id = Object.keys(modifierTypes).find(k => modifierTypes[k] === modifierTypeFunc)!; // TODO: is this bang correct? this.weight = weight; @@ -1561,6 +1565,7 @@ export const modifierTypes = { VOUCHER_PREMIUM: () => new AddVoucherModifierType(VoucherType.PREMIUM, 1), GOLDEN_POKEBALL: () => new ModifierType("modifierType:ModifierType.GOLDEN_POKEBALL", "pb_gold", (type, _args) => new ExtraModifierModifier(type), undefined, "se/pb_bounce_1"), + SILVER_POKEBALL: () => new ModifierType("modifierType:ModifierType.SILVER_POKEBALL", "pb_silver", (type, _args) => new TempExtraModifierModifier(type, 100), undefined, "se/pb_bounce_1"), ENEMY_DAMAGE_BOOSTER: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_BOOSTER", "wl_item_drop", (type, _args) => new EnemyDamageBoosterModifier(type, 5)), ENEMY_DAMAGE_REDUCTION: () => new ModifierType("modifierType:ModifierType.ENEMY_DAMAGE_REDUCTION", "wl_guard_spec", (type, _args) => new EnemyDamageReducerModifier(type, 2.5)), @@ -1577,13 +1582,13 @@ export const modifierTypes = { if (pregenArgs) { return new PokemonBaseStatTotalModifierType(pregenArgs[0] as number); } - return new PokemonBaseStatTotalModifierType(randSeedInt(20)); + return new PokemonBaseStatTotalModifierType(randSeedInt(20, 1)); }), MYSTERY_ENCOUNTER_OLD_GATEAU: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) { return new PokemonBaseStatFlatModifierType(pregenArgs[0] as number, pregenArgs[1] as Stat[]); } - return new PokemonBaseStatFlatModifierType(randSeedInt(20), [ Stat.HP, Stat.ATK, Stat.DEF ]); + return new PokemonBaseStatFlatModifierType(randSeedInt(20, 1), [ Stat.HP, Stat.ATK, Stat.DEF ]); }), MYSTERY_ENCOUNTER_BLACK_SLUDGE: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => { if (pregenArgs) { @@ -1691,7 +1696,10 @@ const modifierPool: ModifierPool = { 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.MAP, + (party: Pokemon[]) => party[0].scene.gameMode.isClassic && party[0].scene.currentBattle.waveIndex < 180 ? party[0].scene.eventManager.isEventActive() ? 2 : 1 : 0, + (party: Pokemon[]) => party[0].scene.eventManager.isEventActive() ? 2 : 1), + new WeightedModifierType(modifierTypes.SOOTHE_BELL, (party: Pokemon[]) => party[0].scene.eventManager.isEventActive() ? 3 : 0), new WeightedModifierType(modifierTypes.TM_GREAT, 3), new WeightedModifierType(modifierTypes.MEMORY_MUSHROOM, (party: Pokemon[]) => { if (!party.find(p => p.getLearnableLevelMoves().length)) { @@ -1759,7 +1767,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.CANDY_JAR, skipInLastClassicWaveOrDefault(5)), new WeightedModifierType(modifierTypes.ATTACK_TYPE_BOOSTER, 9), new WeightedModifierType(modifierTypes.TM_ULTRA, 11), - new WeightedModifierType(modifierTypes.RARER_CANDY, 4), + new WeightedModifierType(modifierTypes.RARER_CANDY, (party: Pokemon[]) => party[0].scene.eventManager.isEventActive() ? 6 : 4), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, skipInLastClassicWaveOrDefault(2)), new WeightedModifierType(modifierTypes.IV_SCANNER, skipInLastClassicWaveOrDefault(4)), new WeightedModifierType(modifierTypes.EXP_CHARM, skipInLastClassicWaveOrDefault(8)), @@ -1782,7 +1790,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.BATON, 2), new WeightedModifierType(modifierTypes.SOUL_DEW, 7), //new WeightedModifierType(modifierTypes.OVAL_CHARM, 6), - new WeightedModifierType(modifierTypes.SOOTHE_BELL, 4), + new WeightedModifierType(modifierTypes.SOOTHE_BELL, (party: Pokemon[]) => party[0].scene.eventManager.isEventActive() ? 0 : 4), new WeightedModifierType(modifierTypes.ABILITY_CHARM, skipInClassicAfterWave(189, 6)), new WeightedModifierType(modifierTypes.FOCUS_BAND, 5), new WeightedModifierType(modifierTypes.KINGS_ROCK, 3), @@ -1975,21 +1983,21 @@ let enemyBuffIgnoredPoolIndexes = {}; // eslint-disable-line @typescript-eslint/ export function getModifierPoolForType(poolType: ModifierPoolType): ModifierPool { let pool: ModifierPool; switch (poolType) { - case ModifierPoolType.PLAYER: - pool = modifierPool; - break; - case ModifierPoolType.WILD: - pool = wildModifierPool; - break; - case ModifierPoolType.TRAINER: - pool = trainerModifierPool; - break; - case ModifierPoolType.ENEMY_BUFF: - pool = enemyBuffModifierPool; - break; - case ModifierPoolType.DAILY_STARTER: - pool = dailyStarterModifierPool; - break; + case ModifierPoolType.PLAYER: + pool = modifierPool; + break; + case ModifierPoolType.WILD: + pool = wildModifierPool; + break; + case ModifierPoolType.TRAINER: + pool = trainerModifierPool; + break; + case ModifierPoolType.ENEMY_BUFF: + pool = enemyBuffModifierPool; + break; + case ModifierPoolType.DAILY_STARTER: + pool = dailyStarterModifierPool; + break; } return pool; } @@ -2060,23 +2068,23 @@ export function regenerateModifierPoolThresholds(party: Pokemon[], poolType: Mod console.table(modifierTableData); } switch (poolType) { - case ModifierPoolType.PLAYER: - modifierPoolThresholds = thresholds; - ignoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.WILD: - case ModifierPoolType.TRAINER: - enemyModifierPoolThresholds = thresholds; - enemyIgnoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.ENEMY_BUFF: - enemyBuffModifierPoolThresholds = thresholds; - enemyBuffIgnoredPoolIndexes = ignoredIndexes; - break; - case ModifierPoolType.DAILY_STARTER: - dailyStarterModifierPoolThresholds = thresholds; - ignoredDailyStarterPoolIndexes = ignoredIndexes; - break; + case ModifierPoolType.PLAYER: + modifierPoolThresholds = thresholds; + ignoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.WILD: + case ModifierPoolType.TRAINER: + enemyModifierPoolThresholds = thresholds; + enemyIgnoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.ENEMY_BUFF: + enemyBuffModifierPoolThresholds = thresholds; + enemyBuffIgnoredPoolIndexes = ignoredIndexes; + break; + case ModifierPoolType.DAILY_STARTER: + dailyStarterModifierPoolThresholds = thresholds; + ignoredDailyStarterPoolIndexes = ignoredIndexes; + break; } } @@ -2132,7 +2140,7 @@ export function getPlayerModifierTypeOptions(count: integer, party: PlayerPokemo // Populates item id and tier guaranteedMod = guaranteedMod .withIdFromFunc(modifierTypes[modifierId]) - .withTierFromPool(); + .withTierFromPool(ModifierPoolType.PLAYER, party); const modType = guaranteedMod instanceof ModifierTypeGenerator ? guaranteedMod.generateType(party) : guaranteedMod; if (modType) { @@ -2201,7 +2209,7 @@ export function overridePlayerModifierTypeOptions(options: ModifierTypeOption[], } if (modifierType) { - options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool(); + options[i].type = modifierType.withIdFromFunc(modifierFunc).withTierFromPool(ModifierPoolType.PLAYER, party); } } } @@ -2247,15 +2255,15 @@ export function getPlayerShopModifierTypeOptionsForWave(waveIndex: integer, base export function getEnemyBuffModifierForWave(tier: ModifierTier, enemyModifiers: PersistentModifier[], scene: BattleScene): EnemyPersistentModifier { let tierStackCount: number; switch (tier) { - case ModifierTier.ULTRA: - tierStackCount = 5; - break; - case ModifierTier.GREAT: - tierStackCount = 3; - break; - default: - tierStackCount = 1; - break; + case ModifierTier.ULTRA: + tierStackCount = 5; + break; + case ModifierTier.GREAT: + tierStackCount = 3; + break; + default: + tierStackCount = 1; + break; } const retryCount = 50; @@ -2321,21 +2329,21 @@ function getNewModifierTypeOption(party: Pokemon[], poolType: ModifierPoolType, const pool = getModifierPoolForType(poolType); let thresholds: object; switch (poolType) { - case ModifierPoolType.PLAYER: - thresholds = modifierPoolThresholds; - break; - case ModifierPoolType.WILD: - thresholds = enemyModifierPoolThresholds; - break; - case ModifierPoolType.TRAINER: - thresholds = enemyModifierPoolThresholds; - break; - case ModifierPoolType.ENEMY_BUFF: - thresholds = enemyBuffModifierPoolThresholds; - break; - case ModifierPoolType.DAILY_STARTER: - thresholds = dailyStarterModifierPoolThresholds; - break; + case ModifierPoolType.PLAYER: + thresholds = modifierPoolThresholds; + break; + case ModifierPoolType.WILD: + thresholds = enemyModifierPoolThresholds; + break; + case ModifierPoolType.TRAINER: + thresholds = enemyModifierPoolThresholds; + break; + case ModifierPoolType.ENEMY_BUFF: + thresholds = enemyBuffModifierPoolThresholds; + break; + case ModifierPoolType.DAILY_STARTER: + thresholds = dailyStarterModifierPoolThresholds; + break; } if (tier === undefined) { const tierValue = randSeedInt(1024); diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 35d1a304461..d34804ba040 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -404,6 +404,14 @@ export abstract class LapsingPersistentModifier extends PersistentModifier { this.battleCount = this.maxBattles; } + /** + * Updates an existing modifier with a new `maxBattles` and `battleCount`. + */ + setNewBattleCount(count: number): void { + this.maxBattles = count; + this.battleCount = count; + } + getMaxBattles(): number { return this.maxBattles; } @@ -960,7 +968,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { this.stackCount = pokemon ? pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier).length + + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length : this.stackCount; const text = scene.add.bitmapText(10, 15, "item-count", this.stackCount.toString(), 11); @@ -975,7 +983,7 @@ export class EvoTrackerModifier extends PokemonHeldItemModifier { getMaxHeldItemCount(pokemon: Pokemon): number { this.stackCount = pokemon.evoCounter + pokemon.getHeldItems().filter(m => m instanceof DamageMoneyRewardModifier).length - + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier).length; + + pokemon.scene.findModifiers(m => m instanceof MoneyMultiplierModifier || m instanceof ExtraModifierModifier || m instanceof TempExtraModifierModifier).length; return 999; } } @@ -1695,12 +1703,12 @@ export class TurnStatusEffectModifier extends PokemonHeldItemModifier { super(type, pokemonId, stackCount); switch (type.id) { - case "TOXIC_ORB": - this.effect = StatusEffect.TOXIC; - break; - case "FLAME_ORB": - this.effect = StatusEffect.BURN; - break; + case "TOXIC_ORB": + this.effect = StatusEffect.TOXIC; + break; + case "FLAME_ORB": + this.effect = StatusEffect.BURN; + break; } } @@ -1759,10 +1767,10 @@ export class HitHealModifier extends PokemonHeldItemModifier { * @returns `true` if the {@linkcode Pokemon} was healed */ override apply(pokemon: Pokemon): boolean { - if (pokemon.turnData.damageDealt && !pokemon.isFullHp()) { + if (pokemon.turnData.totalDamageDealt && !pokemon.isFullHp()) { const scene = pokemon.scene; scene.unshiftPhase(new PokemonHealPhase(scene, pokemon.getBattlerIndex(), - toDmgValue(pokemon.turnData.damageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); + toDmgValue(pokemon.turnData.totalDamageDealt / 8) * this.stackCount, i18next.t("modifier:hitHealApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }), true)); } return true; @@ -2158,7 +2166,7 @@ export class PokemonPpUpModifier extends ConsumablePokemonMoveModifier { override apply(playerPokemon: PlayerPokemon): boolean { const move = playerPokemon.getMoveset()[this.moveIndex]; - if (move) { + if (move && !move.maxPpOverride) { move.ppUp = Math.min(move.ppUp + this.upPoints, 3); } @@ -2181,7 +2189,7 @@ export class PokemonNatureChangeModifier extends ConsumablePokemonModifier { * @returns */ override apply(playerPokemon: PlayerPokemon): boolean { - playerPokemon.natureOverride = this.nature; + playerPokemon.customPokemonData.nature = this.nature; let speciesId = playerPokemon.species.speciesId; playerPokemon.scene.gameData.dexData[speciesId].natureAttr |= 1 << (this.nature + 1); @@ -2684,15 +2692,15 @@ export class PokemonMultiHitModifier extends PokemonHeldItemModifier { count.value *= (this.getStackCount() + 1); switch (this.getStackCount()) { - case 1: - power.value *= 0.4; - break; - case 2: - power.value *= 0.25; - break; - case 3: - power.value *= 0.175; - break; + case 1: + power.value *= 0.4; + break; + case 2: + power.value *= 0.25; + break; + case 3: + power.value *= 0.175; + break; } return true; @@ -3288,6 +3296,60 @@ export class ExtraModifierModifier extends PersistentModifier { } } +/** + * Modifier used for timed boosts to the player's shop item rewards. + * @extends LapsingPersistentModifier + * @see {@linkcode apply} + */ +export class TempExtraModifierModifier extends LapsingPersistentModifier { + constructor(type: ModifierType, maxBattles: number, battleCount?: number, stackCount?: number) { + super(type, maxBattles, battleCount, stackCount); + } + + /** + * Goes through existing modifiers for any that match Silver Pokeball, + * which will then add the max count of the new item to the existing count of the current item. + * If no existing Silver Pokeballs are found, will add a new one. + * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers + * @param _virtual N/A + * @param scene + * @returns true if the modifier was successfully added or applied, false otherwise + */ + add(modifiers: PersistentModifier[], _virtual: boolean, scene: BattleScene): boolean { + for (const modifier of modifiers) { + if (this.match(modifier)) { + const modifierInstance = modifier as TempExtraModifierModifier; + const newBattleCount = this.getMaxBattles() + modifierInstance.getBattleCount(); + + modifierInstance.setNewBattleCount(newBattleCount); + scene.playSound("se/restore"); + return true; + } + } + + modifiers.push(this); + return true; + } + + clone() { + return new TempExtraModifierModifier(this.type, this.getMaxBattles(), this.getBattleCount(), this.stackCount); + } + + match(modifier: Modifier): boolean { + return (modifier instanceof TempExtraModifierModifier); + } + + /** + * Increases the current rewards in the battle by the `stackCount`. + * @returns `true` if the shop reward number modifier applies successfully + * @param count {@linkcode NumberHolder} that holds the resulting shop item reward count + */ + apply(count: NumberHolder): boolean { + count.value += this.getStackCount(); + return true; + } +} + export abstract class EnemyPersistentModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: number) { super(type, stackCount); diff --git a/src/overrides.ts b/src/overrides.ts index 211d430a835..6760db79205 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -75,6 +75,8 @@ class DefaultOverrides { readonly ITEM_UNLOCK_OVERRIDE: Unlockables[] = []; /** Set to `true` to show all tutorials */ readonly BYPASS_TUTORIAL_SKIP_OVERRIDE: boolean = false; + /** Set to `true` to force Paralysis and Freeze to always activate, or `false` to force them to not activate */ + readonly STATUS_ACTIVATION_OVERRIDE: boolean | null = null; // ---------------- // PLAYER OVERRIDES @@ -113,8 +115,8 @@ class DefaultOverrides { readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly GENDER_OVERRIDE: Gender | null = null; readonly MOVESET_OVERRIDE: Moves | Array = []; - readonly SHINY_OVERRIDE: boolean = false; - readonly VARIANT_OVERRIDE: Variant = 0; + readonly SHINY_OVERRIDE: boolean | null = null; + readonly VARIANT_OVERRIDE: Variant | null = null; // -------------------------- // OPPONENT / ENEMY OVERRIDES @@ -134,8 +136,8 @@ class DefaultOverrides { readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly OPP_GENDER_OVERRIDE: Gender | null = null; readonly OPP_MOVESET_OVERRIDE: Moves | Array = []; - readonly OPP_SHINY_OVERRIDE: boolean = false; - readonly OPP_VARIANT_OVERRIDE: Variant = 0; + readonly OPP_SHINY_OVERRIDE: boolean | null = null; + readonly OPP_VARIANT_OVERRIDE: Variant | null = null; readonly OPP_IVS_OVERRIDE: number | number[] = []; readonly OPP_FORM_OVERRIDES: Partial> = {}; /** diff --git a/src/phases/attempt-run-phase.ts b/src/phases/attempt-run-phase.ts index e0dd7fa72fd..b4768dc9a26 100644 --- a/src/phases/attempt-run-phase.ts +++ b/src/phases/attempt-run-phase.ts @@ -10,6 +10,10 @@ import { NewBattlePhase } from "./new-battle-phase"; import { PokemonPhase } from "./pokemon-phase"; export class AttemptRunPhase extends PokemonPhase { + + /** For testing purposes: this is to force the pokemon to fail and escape */ + public forceFailEscape = false; + constructor(scene: BattleScene, fieldIndex: number) { super(scene, fieldIndex); } @@ -28,7 +32,7 @@ export class AttemptRunPhase extends PokemonPhase { applyAbAttrs(RunSuccessAbAttr, playerPokemon, null, false, escapeChance); - if (playerPokemon.randSeedInt(100) < escapeChance.value) { + if (playerPokemon.randSeedInt(100) < escapeChance.value && !this.forceFailEscape) { this.scene.playSound("se/flee"); this.scene.queueMessage(i18next.t("battle:runAwaySuccess"), null, true, 500); @@ -51,6 +55,7 @@ export class AttemptRunPhase extends PokemonPhase { this.scene.pushPhase(new BattleEndPhase(this.scene)); this.scene.pushPhase(new NewBattlePhase(this.scene)); } else { + playerPokemon.turnData.failedRunAway = true; this.scene.queueMessage(i18next.t("battle:runAwayCannotEscape"), null, true, 500); } diff --git a/src/phases/check-switch-phase.ts b/src/phases/check-switch-phase.ts index 8849d304435..5e459d0e6b5 100644 --- a/src/phases/check-switch-phase.ts +++ b/src/phases/check-switch-phase.ts @@ -51,7 +51,7 @@ export class CheckSwitchPhase extends BattlePhase { this.scene.ui.setMode(Mode.CONFIRM, () => { this.scene.ui.setMode(Mode.MESSAGE); this.scene.tryRemovePhase(p => p instanceof PostSummonPhase && p.player && p.fieldIndex === this.fieldIndex); - this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.SWITCH, this.fieldIndex, false, true)); + this.scene.unshiftPhase(new SwitchPhase(this.scene, SwitchType.INITIAL_SWITCH, this.fieldIndex, false, true)); this.end(); }, () => { this.scene.ui.setMode(Mode.MESSAGE); diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts index cf66631bd96..6d4d46c51c9 100644 --- a/src/phases/command-phase.ts +++ b/src/phases/command-phase.ts @@ -30,6 +30,15 @@ export class CommandPhase extends FieldPhase { start() { super.start(); + const commandUiHandler = this.scene.ui.handlers[Mode.COMMAND]; + if (commandUiHandler) { + if (this.scene.currentBattle.turn === 1 || commandUiHandler.getCursor() === Command.POKEMON) { + commandUiHandler.setCursor(Command.FIGHT); + } else { + commandUiHandler.setCursor(commandUiHandler.getCursor()); + } + } + if (this.fieldIndex) { // If we somehow are attempting to check the right pokemon but there's only one pokemon out // Switch back to the center pokemon. This can happen rarely in double battles with mid turn switching @@ -84,170 +93,170 @@ export class CommandPhase extends FieldPhase { let success: boolean; switch (command) { - case Command.FIGHT: - let useStruggle = false; - if (cursor === -1 || + case Command.FIGHT: + let useStruggle = false; + if (cursor === -1 || playerPokemon.trySelectMove(cursor, args[0] as boolean) || (useStruggle = cursor > -1 && !playerPokemon.getMoveset().filter(m => m?.isUsable(playerPokemon)).length)) { - const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor]!.moveId : Moves.NONE : Moves.STRUGGLE; // TODO: is the bang correct? - const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; - const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; - if (!moveId) { - turnCommand.targets = [ this.fieldIndex ]; - } - console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); - if (moveTargets.targets.length > 1 && moveTargets.multiple) { - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); - } - if (moveTargets.targets.length <= 1 || moveTargets.multiple) { + const moveId = !useStruggle ? cursor > -1 ? playerPokemon.getMoveset()[cursor]!.moveId : Moves.NONE : Moves.STRUGGLE; // TODO: is the bang correct? + const turnCommand: TurnCommand = { command: Command.FIGHT, cursor: cursor, move: { move: moveId, targets: [], ignorePP: args[0] }, args: args }; + const moveTargets: MoveTargetSet = args.length < 3 ? getMoveTargets(playerPokemon, moveId) : args[2]; + if (!moveId) { + turnCommand.targets = [ this.fieldIndex ]; + } + console.log(moveTargets, getPokemonNameWithAffix(playerPokemon)); + if (moveTargets.targets.length > 1 && moveTargets.multiple) { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } + if (moveTargets.targets.length <= 1 || moveTargets.multiple) { turnCommand.move!.targets = moveTargets.targets; //TODO: is the bang correct here? - } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { + } else if (playerPokemon.getTag(BattlerTagType.CHARGING) && playerPokemon.getMoveQueue().length >= 1) { turnCommand.move!.targets = playerPokemon.getMoveQueue()[0].targets; //TODO: is the bang correct here? - } else { - this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); - } - this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; - success = true; - } else if (cursor < playerPokemon.getMoveset().length) { - const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct? - this.scene.ui.setMode(Mode.MESSAGE); + } else { + this.scene.unshiftPhase(new SelectTargetPhase(this.scene, this.fieldIndex)); + } + this.scene.currentBattle.turnCommands[this.fieldIndex] = turnCommand; + success = true; + } else if (cursor < playerPokemon.getMoveset().length) { + const move = playerPokemon.getMoveset()[cursor]!; //TODO: is this bang correct? + this.scene.ui.setMode(Mode.MESSAGE); - // Decides between a Disabled, Not Implemented, or No PP translation message - const errorMessage = + // Decides between a Disabled, Not Implemented, or No PP translation message + const errorMessage = playerPokemon.isMoveRestricted(move.moveId, playerPokemon) ? playerPokemon.getRestrictingTag(move.moveId, playerPokemon)!.selectionDeniedText(playerPokemon, move.moveId) : move.getName().endsWith(" (N)") ? "battle:moveNotImplemented" : "battle:moveNoPP"; - const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator + const moveName = move.getName().replace(" (N)", ""); // Trims off the indicator - this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); - }, null, true); - } - break; - case Command.BALL: - const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1); - if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (this.scene.currentBattle.isBattleMysteryEncounter() && !this.scene.currentBattle.mysteryEncounter!.catchAllowed) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballMysteryEncounter"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); - if (targets.length > 1) { + this.scene.ui.showText(i18next.t(errorMessage, { moveName: moveName }), null, () => { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.FIGHT, this.fieldIndex); + }, null, true); + } + break; + case Command.BALL: + const notInDex = (this.scene.getEnemyField().filter(p => p.isActive(true)).some(p => !p.scene.gameData.dexData[p.species.speciesId].caughtAttr) && this.scene.gameData.getStarterCount(d => !!d.caughtAttr) < Object.keys(speciesStarterCosts).length - 1); + if (this.scene.arena.biomeType === Biome.END && (!this.scene.gameMode.isClassic || this.scene.gameMode.isFreshStartChallenge() || notInDex )) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { + this.scene.ui.showText(i18next.t("battle:noPokeballForce"), null, () => { this.scene.ui.showText("", 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); - } else if (cursor < 5) { - const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); - if (targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { + } else if (this.scene.currentBattle.battleType === BattleType.TRAINER) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballTrainer"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else if (this.scene.currentBattle.isBattleMysteryEncounter() && !this.scene.currentBattle.mysteryEncounter!.catchAllowed) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballMysteryEncounter"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + const targets = this.scene.getEnemyField().filter(p => p.isActive(true)).map(p => p.getBattlerIndex()); + if (targets.length > 1) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { + this.scene.ui.showText(i18next.t("battle:noPokeballMulti"), null, () => { this.scene.ui.showText("", 0); this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); - } else { - this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; + } else if (cursor < 5) { + const targetPokemon = this.scene.getEnemyField().find(p => p.isActive(true)); + if (targetPokemon?.isBoss() && targetPokemon?.bossSegmentIndex >= 1 && !targetPokemon?.hasAbility(Abilities.WONDER_GUARD, false, true) && cursor < PokeballType.MASTER_BALL) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noPokeballStrong"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else { + this.scene.currentBattle.turnCommands[this.fieldIndex] = { command: Command.BALL, cursor: cursor }; this.scene.currentBattle.turnCommands[this.fieldIndex]!.targets = targets; if (this.fieldIndex) { this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; } success = true; + } } } - } - break; - case Command.POKEMON: - case Command.RUN: - const isSwitch = command === Command.POKEMON; - const { currentBattle, arena } = this.scene; - const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed; - if (!isSwitch && (arena.biomeType === Biome.END || (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { - this.scene.ui.showText("", 0); + break; + case Command.POKEMON: + case Command.RUN: + const isSwitch = command === Command.POKEMON; + const { currentBattle, arena } = this.scene; + const mysteryEncounterFleeAllowed = currentBattle.mysteryEncounter?.fleeAllowed; + if (!isSwitch && (arena.biomeType === Biome.END || (!isNullOrUndefined(mysteryEncounterFleeAllowed) && !mysteryEncounterFleeAllowed))) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else if (!isSwitch && (currentBattle.battleType === BattleType.TRAINER || currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE)) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { - this.scene.ui.showText("", 0); - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - }, null, true); - } else { - const batonPass = isSwitch && args[0] as boolean; - const trappedAbMessages: string[] = []; - if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { - currentBattle.turnCommands[this.fieldIndex] = isSwitch - ? { command: Command.POKEMON, cursor: cursor, args: args } - : { command: Command.RUN }; - success = true; - if (!isSwitch && this.fieldIndex) { - currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; - } - } else if (trappedAbMessages.length > 0) { - if (!isSwitch) { - this.scene.ui.setMode(Mode.MESSAGE); - } - this.scene.ui.showText(trappedAbMessages[0], null, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeForce"), null, () => { this.scene.ui.showText("", 0); - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - } + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + }, null, true); + } else if (!isSwitch && (currentBattle.battleType === BattleType.TRAINER || currentBattle.mysteryEncounter?.encounterMode === MysteryEncounterMode.TRAINER_BATTLE)) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.showText(i18next.t("battle:noEscapeTrainer"), null, () => { + this.scene.ui.showText("", 0); + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); }, null, true); } else { - const trapTag = playerPokemon.getTag(TrappedTag); - - // trapTag should be defined at this point, but just in case... - if (!trapTag) { + const batonPass = isSwitch && args[0] as boolean; + const trappedAbMessages: string[] = []; + if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) { currentBattle.turnCommands[this.fieldIndex] = isSwitch ? { command: Command.POKEMON, cursor: cursor, args: args } : { command: Command.RUN }; - break; - } - - if (!isSwitch) { - this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); - this.scene.ui.setMode(Mode.MESSAGE); - } - this.scene.ui.showText( - i18next.t("battle:noEscapePokemon", { - pokemonName: trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId) ? getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)!) : "", - moveName: trapTag.getMoveName(), - escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") - }), - null, - () => { + success = true; + if (!isSwitch && this.fieldIndex) { + currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true; + } + } else if (trappedAbMessages.length > 0) { + if (!isSwitch) { + this.scene.ui.setMode(Mode.MESSAGE); + } + this.scene.ui.showText(trappedAbMessages[0], null, () => { this.scene.ui.showText("", 0); if (!isSwitch) { this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); } }, null, true); + } else { + const trapTag = playerPokemon.getTag(TrappedTag); + + // trapTag should be defined at this point, but just in case... + if (!trapTag) { + currentBattle.turnCommands[this.fieldIndex] = isSwitch + ? { command: Command.POKEMON, cursor: cursor, args: args } + : { command: Command.RUN }; + break; + } + + if (!isSwitch) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + this.scene.ui.setMode(Mode.MESSAGE); + } + this.scene.ui.showText( + i18next.t("battle:noEscapePokemon", { + pokemonName: trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId) ? getPokemonNameWithAffix(this.scene.getPokemonById(trapTag.sourceId)!) : "", + moveName: trapTag.getMoveName(), + escapeVerb: isSwitch ? i18next.t("battle:escapeVerbSwitch") : i18next.t("battle:escapeVerbFlee") + }), + null, + () => { + this.scene.ui.showText("", 0); + if (!isSwitch) { + this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex); + } + }, null, true); + } } - } - break; + break; } if (success!) { // TODO: is the bang correct? diff --git a/src/phases/damage-phase.ts b/src/phases/damage-phase.ts index 66b11512729..44e3dfd4182 100644 --- a/src/phases/damage-phase.ts +++ b/src/phases/damage-phase.ts @@ -41,16 +41,16 @@ export class DamagePhase extends PokemonPhase { applyDamage() { switch (this.damageResult) { - case HitResult.EFFECTIVE: - this.scene.playSound("se/hit"); - break; - case HitResult.SUPER_EFFECTIVE: - case HitResult.ONE_HIT_KO: - this.scene.playSound("se/hit_strong"); - break; - case HitResult.NOT_VERY_EFFECTIVE: - this.scene.playSound("se/hit_weak"); - break; + case HitResult.EFFECTIVE: + this.scene.playSound("se/hit"); + break; + case HitResult.SUPER_EFFECTIVE: + case HitResult.ONE_HIT_KO: + this.scene.playSound("se/hit_strong"); + break; + case HitResult.NOT_VERY_EFFECTIVE: + this.scene.playSound("se/hit_weak"); + break; } if (this.amount) { diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts index 3610ffed386..b7071c4cc6f 100644 --- a/src/phases/encounter-phase.ts +++ b/src/phases/encounter-phase.ts @@ -35,6 +35,7 @@ import { getEncounterText } from "#app/data/mystery-encounters/utils/encounter-d import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; import { getGoldenBugNetSpecies } from "#app/data/mystery-encounters/utils/encounter-pokemon-utils"; import { Biome } from "#enums/biome"; +import { WEIGHT_INCREMENT_ON_SPAWN_MISS } from "#app/data/mystery-encounters/mystery-encounters"; export class EncounterPhase extends BattlePhase { private loaded: boolean; @@ -68,7 +69,7 @@ export class EncounterPhase extends BattlePhase { this.scene.executeWithSeedOffset(() => { const currentSessionEncounterType = battle.mysteryEncounterType; battle.mysteryEncounter = this.scene.getMysteryEncounter(currentSessionEncounterType); - }, battle.waveIndex << 4); + }, battle.waveIndex * 16); } const mysteryEncounter = battle.mysteryEncounter; if (mysteryEncounter) { @@ -251,6 +252,13 @@ export class EncounterPhase extends BattlePhase { this.scene.updateModifiers(true); }*/ + const { battleType, waveIndex } = this.scene.currentBattle; + if (this.scene.isMysteryEncounterValidForWave(battleType, waveIndex) && !this.scene.currentBattle.isBattleMysteryEncounter()) { + // Increment ME spawn chance if an ME could have spawned but did not + // Only do this AFTER session has been saved to avoid duplicating increments + this.scene.mysteryEncounterSaveData.encounterSpawnChance += WEIGHT_INCREMENT_ON_SPAWN_MISS; + } + for (const pokemon of this.scene.getParty()) { if (pokemon) { pokemon.resetBattleData(); @@ -494,31 +502,31 @@ export class EncounterPhase extends BattlePhase { tryOverrideForBattleSpec(): boolean { switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - const enemy = this.scene.getEnemyPokemon(); - this.scene.ui.showText(this.getEncounterMessage(), null, () => { - const localizationKey = "battleSpecDialogue:encounter"; - if (this.scene.ui.shouldSkipDialogue(localizationKey)) { + case BattleSpec.FINAL_BOSS: + const enemy = this.scene.getEnemyPokemon(); + this.scene.ui.showText(this.getEncounterMessage(), null, () => { + const localizationKey = "battleSpecDialogue:encounter"; + if (this.scene.ui.shouldSkipDialogue(localizationKey)) { // Logging mirrors logging found in dialogue-ui-handler - console.log(`Dialogue ${localizationKey} skipped`); - this.doEncounterCommon(false); - } else { - const count = 5643853 + this.scene.gameData.gameStats.classicSessionsPlayed; - // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. - const ordinalUsed = !i18next.exists(localizationKey, { fallbackLng: []}) || i18next.resolvedLanguage === "en" ? i18next.t("battleSpecDialogue:key", { count: count, ordinal: true }) : ""; - const cycleCount = count.toLocaleString() + ordinalUsed; - const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; - const genderStr = PlayerGender[genderIndex].toLowerCase(); - const encounterDialogue = i18next.t(localizationKey, { context: genderStr, cycleCount: cycleCount }); - if (!this.scene.gameData.getSeenDialogues()[localizationKey]) { - this.scene.gameData.saveSeenDialogue(localizationKey); - } - this.scene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + console.log(`Dialogue ${localizationKey} skipped`); this.doEncounterCommon(false); - }); - } - }, 1500, true); - return true; + } else { + const count = 5643853 + this.scene.gameData.gameStats.classicSessionsPlayed; + // The line below checks if an English ordinal is necessary or not based on whether an entry for encounterLocalizationKey exists in the language or not. + const ordinalUsed = !i18next.exists(localizationKey, { fallbackLng: []}) || i18next.resolvedLanguage === "en" ? i18next.t("battleSpecDialogue:key", { count: count, ordinal: true }) : ""; + const cycleCount = count.toLocaleString() + ordinalUsed; + const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET; + const genderStr = PlayerGender[genderIndex].toLowerCase(); + const encounterDialogue = i18next.t(localizationKey, { context: genderStr, cycleCount: cycleCount }); + if (!this.scene.gameData.getSeenDialogues()[localizationKey]) { + this.scene.gameData.saveSeenDialogue(localizationKey); + } + this.scene.ui.showDialogue(encounterDialogue, enemy?.species.name, null, () => { + this.doEncounterCommon(false); + }); + } + }, 1500, true); + return true; } return false; } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 95105337f60..8eb84beded5 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -65,6 +65,15 @@ export class FaintPhase extends PokemonPhase { } } + /** In case the current pokemon was just switched in, make sure it is counted as participating in the combat */ + this.scene.getPlayerField().forEach((pokemon, i) => { + if (pokemon?.isActive(true)) { + if (pokemon.isPlayer()) { + this.scene.currentBattle.addParticipant(pokemon as PlayerPokemon); + } + } + }); + if (!this.tryOverrideForBattleSpec()) { this.doFaint(); } @@ -179,19 +188,19 @@ export class FaintPhase extends PokemonPhase { tryOverrideForBattleSpec(): boolean { switch (this.scene.currentBattle.battleSpec) { - case BattleSpec.FINAL_BOSS: - if (!this.player) { - const enemy = this.getPokemon(); - if (enemy.formIndex) { - this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); - } else { + case BattleSpec.FINAL_BOSS: + if (!this.player) { + const enemy = this.getPokemon(); + if (enemy.formIndex) { + this.scene.ui.showDialogue(battleSpecDialogue[BattleSpec.FINAL_BOSS].secondStageWin, enemy.species.name, null, () => this.doFaint()); + } else { // Final boss' HP threshold has been bypassed; cancel faint and force check for 2nd phase - enemy.hp++; - this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); - this.end(); + enemy.hp++; + this.scene.unshiftPhase(new DamagePhase(this.scene, enemy.getBattlerIndex(), 0, HitResult.OTHER)); + this.end(); + } + return true; } - return true; - } } return false; diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index eb7cfbb65ef..fefda384092 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -170,13 +170,16 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { pokemon.setMove(index, this.moveId); initMoveAnim(this.scene, this.moveId).then(() => { loadMoveAnimAssets(this.scene, [ this.moveId ], true); - this.scene.playSound("level_up_fanfare"); // Sound loaded into game as is }); this.scene.ui.setMode(this.messageMode); const learnMoveText = i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); - textMessage = textMessage ? textMessage + "$" + learnMoveText : learnMoveText; - await this.scene.ui.showTextPromise(textMessage, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true); - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); - this.end(); + if (textMessage) { + await this.scene.ui.showTextPromise(textMessage); + } + this.scene.playSound("level_up_fanfare"); // Sound loaded into game as is + this.scene.ui.showText(learnMoveText, null, () => { + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + }, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true); } } diff --git a/src/phases/move-charge-phase.ts b/src/phases/move-charge-phase.ts new file mode 100644 index 00000000000..d1dc340b81b --- /dev/null +++ b/src/phases/move-charge-phase.ts @@ -0,0 +1,84 @@ +import BattleScene from "#app/battle-scene"; +import { BattlerIndex } from "#app/battle"; +import { MoveChargeAnim } from "#app/data/battle-anims"; +import { applyMoveChargeAttrs, MoveEffectAttr, InstantChargeAttr } from "#app/data/move"; +import Pokemon, { MoveResult, PokemonMove } from "#app/field/pokemon"; +import { BooleanHolder } from "#app/utils"; +import { MovePhase } from "#app/phases/move-phase"; +import { PokemonPhase } from "#app/phases/pokemon-phase"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { MoveEndPhase } from "#app/phases/move-end-phase"; + +/** + * Phase for the "charging turn" of two-turn moves (e.g. Dig). + * @extends {@linkcode PokemonPhase} + */ +export class MoveChargePhase extends PokemonPhase { + /** The move instance that this phase applies */ + public move: PokemonMove; + /** The field index targeted by the move (Charging moves assume single target) */ + public targetIndex: BattlerIndex; + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, targetIndex: BattlerIndex, move: PokemonMove) { + super(scene, battlerIndex); + this.move = move; + this.targetIndex = targetIndex; + } + + public override start() { + super.start(); + + const user = this.getUserPokemon(); + const target = this.getTargetPokemon(); + const move = this.move.getMove(); + + // If the target is somehow not defined, or the move is somehow not a ChargingMove, + // immediately end this phase. + if (!target || !(move.isChargingMove())) { + console.warn("Invalid parameters for MoveChargePhase"); + return super.end(); + } + + new MoveChargeAnim(move.chargeAnim, move.id, user).play(this.scene, false, () => { + move.showChargeText(user, target); + + applyMoveChargeAttrs(MoveEffectAttr, user, target, move).then(() => { + user.addTag(BattlerTagType.CHARGING, 1, move.id, user.id); + this.end(); + }); + }); + } + + /** Checks the move's instant charge conditions, then ends this phase. */ + public override end() { + const user = this.getUserPokemon(); + const move = this.move.getMove(); + + if (move.isChargingMove()) { + const instantCharge = new BooleanHolder(false); + + applyMoveChargeAttrs(InstantChargeAttr, user, null, move, instantCharge); + + if (instantCharge.value) { + // this MoveEndPhase will be duplicated by the queued MovePhase if not removed + this.scene.tryRemovePhase((phase) => phase instanceof MoveEndPhase && phase.getPokemon() === user); + // queue a new MovePhase for this move's attack phase + this.scene.unshiftPhase(new MovePhase(this.scene, user, [ this.targetIndex ], this.move, false)); + } else { + user.getMoveQueue().push({ move: move.id, targets: [ this.targetIndex ]}); + } + + // Add this move's charging phase to the user's move history + user.pushMoveHistory({ move: this.move.moveId, targets: [ this.targetIndex ], result: MoveResult.OTHER }); + } + super.end(); + } + + public getUserPokemon(): Pokemon { + return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; + } + + public getTargetPokemon(): Pokemon | undefined { + return this.scene.getField(true).find((p) => this.targetIndex === p.getBattlerIndex()); + } +} diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index dc880f85e23..8b4b462380c 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -1,20 +1,62 @@ -import BattleScene from "#app/battle-scene"; import { BattlerIndex } from "#app/battle"; -import { applyPreAttackAbAttrs, AddSecondStrikeAbAttr, IgnoreMoveEffectsAbAttr, applyPostDefendAbAttrs, PostDefendAbAttr, applyPostAttackAbAttrs, PostAttackAbAttr, MaxMultiHitAbAttr, AlwaysHitAbAttr, TypeImmunityAbAttr } from "#app/data/ability"; +import BattleScene from "#app/battle-scene"; +import { + AddSecondStrikeAbAttr, + AlwaysHitAbAttr, + applyPostAttackAbAttrs, + applyPostDefendAbAttrs, + applyPreAttackAbAttrs, + IgnoreMoveEffectsAbAttr, + MaxMultiHitAbAttr, + PostAttackAbAttr, + PostDefendAbAttr, + TypeImmunityAbAttr, +} from "#app/data/ability"; import { ArenaTagSide, ConditionalProtectTag } from "#app/data/arena-tag"; import { MoveAnim } from "#app/data/battle-anims"; -import { BattlerTagLapseType, DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag } from "#app/data/battler-tags"; -import { MoveTarget, applyMoveAttrs, OverrideMoveEffectAttr, MultiHitAttr, AttackMove, FixedDamageAttr, VariableTargetAttr, MissEffectAttr, MoveFlags, applyFilteredMoveAttrs, MoveAttr, MoveEffectAttr, OneHitKOAttr, MoveEffectTrigger, ChargeAttr, MoveCategory, NoEffectAttr, HitsTagAttr, ToxicAccuracyAttr } from "#app/data/move"; +import { + BattlerTagLapseType, + DamageProtectedTag, + ProtectedTag, + SemiInvulnerableTag, + SubstituteTag, +} from "#app/data/battler-tags"; +import { + applyFilteredMoveAttrs, + applyMoveAttrs, + AttackMove, + FixedDamageAttr, + HitsTagAttr, + MissEffectAttr, + MoveAttr, + MoveCategory, + MoveEffectAttr, + MoveEffectTrigger, + MoveFlags, + MoveTarget, + MultiHitAttr, + NoEffectAttr, + OneHitKOAttr, + OverrideMoveEffectAttr, + ToxicAccuracyAttr, + VariableTargetAttr, +} from "#app/data/move"; import { SpeciesFormChangePostMoveTrigger } from "#app/data/pokemon-forms"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; -import { Moves } from "#app/enums/moves"; -import Pokemon, { PokemonMove, MoveResult, HitResult } from "#app/field/pokemon"; -import { getPokemonNameWithAffix } from "#app/messages"; -import { PokemonMultiHitModifier, FlinchChanceModifier, EnemyAttackStatusEffectChanceModifier, ContactHeldItemTransferChanceModifier, HitHealModifier } from "#app/modifier/modifier"; -import i18next from "i18next"; -import * as Utils from "#app/utils"; -import { PokemonPhase } from "./pokemon-phase"; import { Type } from "#app/data/type"; +import Pokemon, { HitResult, MoveResult, PokemonMove } from "#app/field/pokemon"; +import { getPokemonNameWithAffix } from "#app/messages"; +import { + ContactHeldItemTransferChanceModifier, + EnemyAttackStatusEffectChanceModifier, + FlinchChanceModifier, + HitHealModifier, + PokemonMultiHitModifier, +} from "#app/modifier/modifier"; +import { BooleanHolder, executeIf, NumberHolder } from "#app/utils"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import i18next from "i18next"; +import { PokemonPhase } from "./pokemon-phase"; export class MoveEffectPhase extends PokemonPhase { public move: PokemonMove; @@ -24,10 +66,10 @@ export class MoveEffectPhase extends PokemonPhase { super(scene, battlerIndex); this.move = move; /** - * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies - * with no party members available to switch in, then the right Pokemon takes the index - * of the left Pokemon and gets hit unless this is checked. - */ + * In double battles, if the right Pokemon selects a spread move and the left Pokemon dies + * with no party members available to switch in, then the right Pokemon takes the index + * of the left Pokemon and gets hit unless this is checked. + */ if (targets.includes(battlerIndex) && this.move.getMove().moveTarget === MoveTarget.ALL_NEAR_OTHERS) { const i = targets.indexOf(battlerIndex); targets.splice(i, i + 1); @@ -35,7 +77,7 @@ export class MoveEffectPhase extends PokemonPhase { this.targets = targets; } - start() { + public override start(): void { super.start(); /** The Pokemon using this phase's invoked move */ @@ -49,15 +91,15 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Does an effect from this move override other effects on this turn? - * e.g. Charging moves (Fly, etc.) on their first turn of use. - */ - const overridden = new Utils.BooleanHolder(false); + * Does an effect from this move override other effects on this turn? + * e.g. Charging moves (Fly, etc.) on their first turn of use. + */ + const overridden = new BooleanHolder(false); /** The {@linkcode Move} object from {@linkcode allMoves} invoked by this phase */ const move = this.move.getMove(); // Assume single target for override - applyMoveAttrs(OverrideMoveEffectAttr, user, this.getTarget() ?? null, move, overridden, this.move.virtual).then(() => { + applyMoveAttrs(OverrideMoveEffectAttr, user, this.getFirstTarget() ?? null, move, overridden, this.move.virtual).then(() => { // If other effects were overriden, stop this phase before they can be applied if (overridden.value) { return this.end(); @@ -66,19 +108,19 @@ export class MoveEffectPhase extends PokemonPhase { user.lapseTags(BattlerTagLapseType.MOVE_EFFECT); /** - * If this phase is for the first hit of the invoked move, - * resolve the move's total hit count. This block combines the - * effects of the move itself, Parental Bond, and Multi-Lens to do so. - */ + * If this phase is for the first hit of the invoked move, + * resolve the move's total hit count. This block combines the + * effects of the move itself, Parental Bond, and Multi-Lens to do so. + */ if (user.turnData.hitsLeft === -1) { - const hitCount = new Utils.IntegerHolder(1); + const hitCount = new NumberHolder(1); // Assume single target for multi hit - applyMoveAttrs(MultiHitAttr, user, this.getTarget() ?? null, move, hitCount); + applyMoveAttrs(MultiHitAttr, user, this.getFirstTarget() ?? null, move, hitCount); // If Parental Bond is applicable, double the hit count - applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, targets.length, hitCount, new Utils.IntegerHolder(0)); + applyPreAttackAbAttrs(AddSecondStrikeAbAttr, user, null, move, false, targets.length, hitCount, new NumberHolder(0)); // If Multi-Lens is applicable, multiply the hit count by 1 + the number of Multi-Lenses held by the user if (move instanceof AttackMove && !move.hasAttr(FixedDamageAttr)) { - this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new Utils.IntegerHolder(0)); + this.scene.applyModifiers(PokemonMultiHitModifier, user.isPlayer(), user, hitCount, new NumberHolder(0)); } // Set the user's relevant turnData fields to reflect the final hit count user.turnData.hitCount = hitCount.value; @@ -86,33 +128,33 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Log to be entered into the user's move history once the move result is resolved. - * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully - * used in the sense of "Does it have an effect on the user?". - */ + * Log to be entered into the user's move history once the move result is resolved. + * Note that `result` (a {@linkcode MoveResult}) logs whether the move was successfully + * used in the sense of "Does it have an effect on the user?". + */ const moveHistoryEntry = { move: this.move.moveId, targets: this.targets, result: MoveResult.PENDING, virtual: this.move.virtual }; /** - * Stores results of hit checks of the invoked move against all targets, organized by battler index. - * @see {@linkcode hitCheck} - */ + * Stores results of hit checks of the invoked move against all targets, organized by battler index. + * @see {@linkcode hitCheck} + */ const targetHitChecks = Object.fromEntries(targets.map(p => [ p.getBattlerIndex(), this.hitCheck(p) ])); const hasActiveTargets = targets.some(t => t.isActive(true)); /** Check if the target is immune via ability to the attacking move, and NOT in semi invulnerable state */ - const isImmune = targets[0].hasAbilityWithAttr(TypeImmunityAbAttr) && (targets[0].getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !targets[0].getTag(SemiInvulnerableTag); + const isImmune = targets[0].hasAbilityWithAttr(TypeImmunityAbAttr) + && (targets[0].getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) + && !targets[0].getTag(SemiInvulnerableTag); /** - * If no targets are left for the move to hit (FAIL), or the invoked move is single-target - * (and not random target) and failed the hit check against its target (MISS), log the move - * as FAILed or MISSed (depending on the conditions above) and end this phase. - */ - + * If no targets are left for the move to hit (FAIL), or the invoked move is single-target + * (and not random target) and failed the hit check against its target (MISS), log the move + * as FAILed or MISSed (depending on the conditions above) and end this phase. + */ if (!hasActiveTargets || (!move.hasAttr(VariableTargetAttr) && !move.isMultiTarget() && !targetHitChecks[this.targets[0]] && !targets[0].getTag(ProtectedTag) && !isImmune)) { this.stopMultiHit(); if (hasActiveTargets) { - this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getTarget() ? getPokemonNameWithAffix(this.getTarget()!) : "" })); + this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: this.getFirstTarget() ? getPokemonNameWithAffix(this.getFirstTarget()!) : "" })); moveHistoryEntry.result = MoveResult.MISS; applyMoveAttrs(MissEffectAttr, user, null, move); } else { @@ -128,35 +170,45 @@ export class MoveEffectPhase extends PokemonPhase { const playOnEmptyField = this.scene.currentBattle?.mysteryEncounter?.hasBattleAnimationsWithoutTargets ?? false; // Move animation only needs one target - new MoveAnim(move.id as Moves, user, this.getTarget()!.getBattlerIndex()!, playOnEmptyField).play(this.scene, move.hitsSubstitute(user, this.getTarget()!), () => { + new MoveAnim(move.id as Moves, user, this.getFirstTarget()!.getBattlerIndex()!, playOnEmptyField).play(this.scene, move.hitsSubstitute(user, this.getFirstTarget()!), () => { /** Has the move successfully hit a target (for damage) yet? */ let hasHit: boolean = false; for (const target of targets) { + // Prevent ENEMY_SIDE targeted moves from occurring twice in double battles + if (move.moveTarget === MoveTarget.ENEMY_SIDE && target !== targets[targets.length - 1]) { + continue; + } /** The {@linkcode ArenaTagSide} to which the target belongs */ const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; /** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */ - const hasConditionalProtectApplied = new Utils.BooleanHolder(false); + const hasConditionalProtectApplied = new BooleanHolder(false); /** Does the applied conditional protection bypass Protect-ignoring effects? */ - const bypassIgnoreProtect = new Utils.BooleanHolder(false); + const bypassIgnoreProtect = new BooleanHolder(false); /** If the move is not targeting a Pokemon on the user's side, try to apply conditional protection effects */ if (!this.move.getMove().isAllyTarget()) { this.scene.arena.applyTagsForSide(ConditionalProtectTag, targetSide, false, hasConditionalProtectApplied, user, target, move.id, bypassIgnoreProtect); } /** Is the target protected by Protect, etc. or a relevant conditional protection effect? */ - const isProtected = (bypassIgnoreProtect.value || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) - && (hasConditionalProtectApplied.value || (!target.findTags(t => t instanceof DamageProtectedTag).length && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) - || (this.move.getMove().category !== MoveCategory.STATUS && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); + const isProtected = ( + bypassIgnoreProtect.value + || !this.move.getMove().checkFlag(MoveFlags.IGNORE_PROTECT, user, target)) + && (hasConditionalProtectApplied.value + || (!target.findTags(t => t instanceof DamageProtectedTag).length + && target.findTags(t => t instanceof ProtectedTag).find(t => target.lapseTag(t.tagType))) + || (this.move.getMove().category !== MoveCategory.STATUS + && target.findTags(t => t instanceof DamageProtectedTag).find(t => target.lapseTag(t.tagType)))); /** Is the pokemon immune due to an ablility, and also not in a semi invulnerable state? */ - const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) - && !target.getTag(SemiInvulnerableTag); + const isImmune = target.hasAbilityWithAttr(TypeImmunityAbAttr) + && (target.getAbility()?.getAttrs(TypeImmunityAbAttr)?.[0]?.getImmuneType() === user.getMoveType(move)) + && !target.getTag(SemiInvulnerableTag); /** - * If the move missed a target, stop all future hits against that target - * and move on to the next target (if there is one). - */ + * If the move missed a target, stop all future hits against that target + * and move on to the next target (if there is one). + */ if (!isImmune && !isProtected && !targetHitChecks[target.getBattlerIndex()]) { this.stopMultiHit(target); this.scene.queueMessage(i18next.t("battle:attackMissed", { pokemonNameWithAffix: getPokemonNameWithAffix(target) })); @@ -177,23 +229,23 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Since all fail/miss checks have applied, the move is considered successfully applied. - * It's worth noting that if the move has no effect or is protected against, this assignment - * is overwritten and the move is logged as a FAIL. - */ + * Since all fail/miss checks have applied, the move is considered successfully applied. + * It's worth noting that if the move has no effect or is protected against, this assignment + * is overwritten and the move is logged as a FAIL. + */ moveHistoryEntry.result = MoveResult.SUCCESS; /** - * Stores the result of applying the invoked move to the target. - * If the target is protected, the result is always `NO_EFFECT`. - * Otherwise, the hit result is based on type effectiveness, immunities, - * and other factors that may negate the attack or status application. - * - * Internally, the call to {@linkcode Pokemon.apply} is where damage is calculated - * (for attack moves) and the target's HP is updated. However, this isn't - * made visible to the user until the resulting {@linkcode DamagePhase} - * is invoked. - */ + * Stores the result of applying the invoked move to the target. + * If the target is protected, the result is always `NO_EFFECT`. + * Otherwise, the hit result is based on type effectiveness, immunities, + * and other factors that may negate the attack or status application. + * + * Internally, the call to {@linkcode Pokemon.apply} is where damage is calculated + * (for attack moves) and the target's HP is updated. However, this isn't + * made visible to the user until the resulting {@linkcode DamagePhase} + * is invoked. + */ const hitResult = !isProtected ? target.apply(user, move) : HitResult.NO_EFFECT; /** Does {@linkcode hitResult} indicate that damage was dealt to the target? */ @@ -211,113 +263,72 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * If the move has no effect on the target (i.e. the target is protected or immune), - * change the logged move result to FAIL. - */ + * If the move has no effect on the target (i.e. the target is protected or immune), + * change the logged move result to FAIL. + */ if (hitResult === HitResult.NO_EFFECT) { moveHistoryEntry.result = MoveResult.FAIL; } /** Does this phase represent the invoked move's last strike? */ - const lastHit = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()); + const lastHit = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()); /** - * If the user can change forms by using the invoked move, - * it only changes forms after the move's last hit - * (see Relic Song's interaction with Parental Bond when used by Meloetta). - */ + * If the user can change forms by using the invoked move, + * it only changes forms after the move's last hit + * (see Relic Song's interaction with Parental Bond when used by Meloetta). + */ if (lastHit) { this.scene.triggerPokemonFormChange(user, SpeciesFormChangePostMoveTrigger); } /** - * Create a Promise that applys *all* effects from the invoked move's MoveEffectAttrs. - * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger - * type requires different conditions to be met with respect to the move's hit result. - */ - applyAttrs.push(new Promise(resolve => { - // Apply all effects with PRE_MOVE triggers (if the target isn't immune to the move) - applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.PRE_APPLY && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit) && hitResult !== HitResult.NO_EFFECT, - user, target, move).then(() => { - // All other effects require the move to not have failed or have been cancelled to trigger - if (hitResult !== HitResult.FAIL) { - /** Are the move's effects tied to the first turn of a charge move? */ - const chargeEffect = !!move.getAttrs(ChargeAttr).find(ca => ca.usedChargeEffect(user, this.getTarget() ?? null, move)); - /** - * If the invoked move's effects are meant to trigger during the move's "charge turn," - * ignore all effects after this point. - * Otherwise, apply all self-targeted POST_APPLY effects. - */ - Utils.executeIf(!chargeEffect, () => applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_APPLY - && attr.selfTarget && (!attr.firstHitOnly || firstHit) && (!attr.lastHitOnly || lastHit), user, target, move)).then(() => { - // All effects past this point require the move to have hit the target - if (hitResult !== HitResult.NO_EFFECT) { - // Apply all non-self-targeted POST_APPLY effects - 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 the move hit, and the target doesn't have Shield Dust, - * apply the chance to flinch the target gained from King's Rock - */ - if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !move.hitsSubstitute(user, target)) { - 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); - } - } - // If the move was not protected against, apply all HIT effects - 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(() => { - // Apply the target's post-defend ability effects (as long as the target is active or can otherwise apply them) - return Utils.executeIf(!target.isFainted() || target.canApplyAbility(), () => applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult).then(() => { - // Only apply the following effects if the move was not deflected by a substitute - if (move.hitsSubstitute(user, target)) { - return resolve(); - } + * Create a Promise that applys *all* effects from the invoked move's MoveEffectAttrs. + * These are ordered by trigger type (see {@linkcode MoveEffectTrigger}), and each trigger + * type requires different conditions to be met with respect to the move's hit result. + */ + const k = new Promise((resolve) => { + //Start promise chain and apply PRE_APPLY move attributes + let promiseChain: Promise = applyFilteredMoveAttrs((attr: MoveAttr) => + attr instanceof MoveEffectAttr + && attr.trigger === MoveEffectTrigger.PRE_APPLY + && (!attr.firstHitOnly || firstHit) + && (!attr.lastHitOnly || lastHit) + && hitResult !== HitResult.NO_EFFECT, user, target, move); - // If the invoked move is an enemy attack, apply the enemy's status effect-inflicting tokens - if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { - user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); - } - target.lapseTag(BattlerTagType.BEAK_BLAST_CHARGING); - if (move.category === MoveCategory.PHYSICAL && user.isPlayer() !== target.isPlayer()) { - target.lapseTag(BattlerTagType.SHELL_TRAP); - } - })).then(() => { - // Apply the user's post-attack ability effects - applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult).then(() => { - /** - * If the invoked move is an attack, apply the user's chance to - * steal an item from the target granted by Grip Claw - */ - if (this.move.getMove() instanceof AttackMove) { - this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); - } - resolve(); - }); - }); - }) - ).then(() => resolve()); - }); - } else { - applyMoveAttrs(NoEffectAttr, user, null, move).then(() => resolve()); - } - }); - } else { - resolve(); - } - }); - })); + /** Don't complete if the move failed */ + if (hitResult === HitResult.FAIL) { + return resolve(); + } + + /** Apply Move/Ability Effects in correct order */ + promiseChain = promiseChain + .then(this.applySelfTargetEffects(user, target, firstHit, lastHit)); + + if (hitResult !== HitResult.NO_EFFECT) { + promiseChain + .then(this.applyPostApplyEffects(user, target, firstHit, lastHit)) + .then(this.applyHeldItemFlinchCheck(user, target, dealsDamage)) + .then(this.applySuccessfulAttackEffects(user, target, firstHit, lastHit, !!isProtected, hitResult, firstTarget)) + .then(() => resolve()); + } else { + promiseChain + .then(() => applyMoveAttrs(NoEffectAttr, user, null, move)) + .then(resolve); + } + }); + + applyAttrs.push(k); } + // Apply the move's POST_TARGET effects on the move's last hit, after all targeted effects have resolved - const postTarget = (user.turnData.hitsLeft === 1 || !this.getTarget()?.isActive()) ? + const postTarget = (user.turnData.hitsLeft === 1 || !this.getFirstTarget()?.isActive()) ? applyFilteredMoveAttrs((attr: MoveAttr) => attr instanceof MoveEffectAttr && attr.trigger === MoveEffectTrigger.POST_TARGET, user, null, move) : null; - if (!!postTarget) { + if (postTarget) { if (applyAttrs.length) { // If there is a pending asynchronous move effect, do this after - applyAttrs[applyAttrs.length - 1]?.then(() => postTarget); + applyAttrs[applyAttrs.length - 1].then(() => postTarget); } else { // Otherwise, push a new asynchronous move effect applyAttrs.push(postTarget); } @@ -332,7 +343,7 @@ export class MoveEffectPhase extends PokemonPhase { */ targets.forEach(target => { const substitute = target.getTag(SubstituteTag); - if (!!substitute && substitute.hp <= 0) { + if (substitute && substitute.hp <= 0) { target.lapseTag(BattlerTagType.SUBSTITUTE); } }); @@ -342,17 +353,17 @@ export class MoveEffectPhase extends PokemonPhase { }); } - end() { + public override end(): void { const user = this.getUserPokemon(); /** - * If this phase isn't for the invoked move's last strike, - * unshift another MoveEffectPhase for the next strike. - * Otherwise, queue a message indicating the number of times the move has struck - * (if the move has struck more than once), then apply the heal from Shell Bell - * to the user. - */ + * If this phase isn't for the invoked move's last strike, + * unshift another MoveEffectPhase for the next strike. + * Otherwise, queue a message indicating the number of times the move has struck + * (if the move has struck more than once), then apply the heal from Shell Bell + * to the user. + */ if (user) { - if (user.turnData.hitsLeft && --user.turnData.hitsLeft >= 1 && this.getTarget()?.isActive()) { + if (user.turnData.hitsLeft && --user.turnData.hitsLeft >= 1 && this.getFirstTarget()?.isActive()) { this.scene.unshiftPhase(this.getNewHitPhase()); } else { // Queue message for number of hits made by multi-move @@ -372,11 +383,135 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Resolves whether this phase's invoked move hits or misses the given target - * @param target {@linkcode Pokemon} the Pokemon targeted by the invoked move - * @returns `true` if the move does not miss the target; `false` otherwise - */ - hitCheck(target: Pokemon): boolean { + * Apply self-targeted effects that trigger `POST_APPLY` + * + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @returns a function intended to be passed into a `then()` call. + */ + protected applySelfTargetEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { + return () => applyFilteredMoveAttrs((attr: MoveAttr) => + attr instanceof MoveEffectAttr + && attr.trigger === MoveEffectTrigger.POST_APPLY + && attr.selfTarget + && (!attr.firstHitOnly || firstHit) + && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()); + } + + /** + * Applies non-self-targeted effects that trigger `POST_APPLY` + * (i.e. Smelling Salts curing Paralysis, and the forced switch from U-Turn, Dragon Tail, etc) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @returns a function intended to be passed into a `then()` call. + */ + protected applyPostApplyEffects(user: Pokemon, target: Pokemon, firstHit: boolean, lastHit: boolean): () => Promise { + return () => applyFilteredMoveAttrs((attr: MoveAttr) => + attr instanceof MoveEffectAttr + && attr.trigger === MoveEffectTrigger.POST_APPLY + && !attr.selfTarget + && (!attr.firstHitOnly || firstHit) + && (!attr.lastHitOnly || lastHit), user, target, this.move.getMove()); + } + + /** + * Applies effects that trigger on HIT + * (i.e. Final Gambit, Power-Up Punch, Drain Punch) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} + * @returns a function intended to be passed into a `then()` call. + */ + protected applyOnHitEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, firstTarget: boolean): Promise { + return applyFilteredMoveAttrs((attr: MoveAttr) => + attr instanceof MoveEffectAttr + && attr.trigger === MoveEffectTrigger.HIT + && (!attr.firstHitOnly || firstHit) + && (!attr.lastHitOnly || lastHit) + && (!attr.firstTargetOnly || firstTarget), user, target, this.move.getMove()); + } + + /** + * Applies reactive effects that occur when a Pokémon is hit. + * (i.e. Effect Spore, Disguise, Liquid Ooze, Beak Blast) + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param hitResult - The {@linkcode HitResult} of the attempted move + * @returns a `Promise` intended to be passed into a `then()` call. + */ + protected applyOnGetHitAbEffects(user: Pokemon, target: Pokemon, hitResult: HitResult): Promise { + return executeIf(!target.isFainted() || target.canApplyAbility(), () => + applyPostDefendAbAttrs(PostDefendAbAttr, target, user, this.move.getMove(), hitResult) + .then(() => { + + if (!this.move.getMove().hitsSubstitute(user, target)) { + if (!user.isPlayer() && this.move.getMove() instanceof AttackMove) { + user.scene.applyShuffledModifiers(this.scene, EnemyAttackStatusEffectChanceModifier, false, target); + } + + target.lapseTags(BattlerTagLapseType.AFTER_HIT); + } + + }) + ); + } + + /** + * Applies all effects and attributes that require a move to connect with a target, + * namely reactive effects like Weak Armor, on-hit effects like that of Power-Up Punch, and item stealing effects + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param firstHit - `true` if this is the first hit in a multi-hit attack + * @param lastHit - `true` if this is the last hit in a multi-hit attack + * @param isProtected - `true` if the target is protected by effects such as Protect + * @param hitResult - The {@linkcode HitResult} of the attempted move + * @param firstTarget - `true` if {@linkcode target} is the first target hit by this strike of {@linkcode move} + * @returns a function intended to be passed into a `then()` call. + */ + protected applySuccessfulAttackEffects(user: Pokemon, target: Pokemon, firstHit : boolean, lastHit: boolean, isProtected : boolean, hitResult: HitResult, firstTarget: boolean) : () => Promise { + return () => executeIf(!isProtected, () => + this.applyOnHitEffects(user, target, firstHit, lastHit, firstTarget).then(() => + this.applyOnGetHitAbEffects(user, target, hitResult)).then(() => + applyPostAttackAbAttrs(PostAttackAbAttr, user, target, this.move.getMove(), hitResult)).then(() => { // Item Stealing Effects + + if (this.move.getMove() instanceof AttackMove) { + this.scene.applyModifiers(ContactHeldItemTransferChanceModifier, this.player, user, target); + } + }) + ); + } + + /** + * Handles checking for and applying Flinches + * @param user - The {@linkcode Pokemon} using this phase's invoked move + * @param target - {@linkcode Pokemon} the current target of this phase's invoked move + * @param dealsDamage - `true` if the attempted move successfully dealt damage + * @returns a function intended to be passed into a `then()` call. + */ + protected applyHeldItemFlinchCheck(user: Pokemon, target: Pokemon, dealsDamage: boolean) : () => void { + return () => { + if (dealsDamage && !target.hasAbilityWithAttr(IgnoreMoveEffectsAbAttr) && !this.move.getMove().hitsSubstitute(user, target)) { + const flinched = new BooleanHolder(false); + user.scene.applyModifiers(FlinchChanceModifier, user.isPlayer(), user, flinched); + if (flinched.value) { + target.addTag(BattlerTagType.FLINCHED, undefined, this.move.moveId, user.id); + } + } + }; + } + + /** + * Resolves whether this phase's invoked move hits the given target + * @param target - The {@linkcode Pokemon} targeted by the invoked move + * @returns `true` if the move hits the target + */ + public hitCheck(target: Pokemon): boolean { // Moves targeting the user and entry hazards can't miss if ([ MoveTarget.USER, MoveTarget.ENEMY_SIDE ].includes(this.move.getMove().moveTarget)) { return true; @@ -430,29 +565,29 @@ export class MoveEffectPhase extends PokemonPhase { return rand < (moveAccuracy * accuracyMultiplier); } - /** Returns the {@linkcode Pokemon} using this phase's invoked move */ - getUserPokemon(): Pokemon | undefined { + /** @returns The {@linkcode Pokemon} using this phase's invoked move */ + public getUserPokemon(): Pokemon | undefined { if (this.battlerIndex > BattlerIndex.ENEMY_2) { return this.scene.getPokemonById(this.battlerIndex) ?? undefined; } return (this.player ? this.scene.getPlayerField() : this.scene.getEnemyField())[this.fieldIndex]; } - /** Returns an array of all {@linkcode Pokemon} targeted by this phase's invoked move */ - getTargets(): Pokemon[] { + /** @returns An array of all {@linkcode Pokemon} targeted by this phase's invoked move */ + public getTargets(): Pokemon[] { return this.scene.getField(true).filter(p => this.targets.indexOf(p.getBattlerIndex()) > -1); } - /** Returns the first target of this phase's invoked move */ - getTarget(): Pokemon | undefined { + /** @returns The first target of this phase's invoked move */ + public getFirstTarget(): Pokemon | undefined { return this.getTargets()[0]; } /** - * Removes the given {@linkcode Pokemon} from this phase's target list - * @param target {@linkcode Pokemon} the Pokemon to be removed - */ - removeTarget(target: Pokemon): void { + * Removes the given {@linkcode Pokemon} from this phase's target list + * @param target - The {@linkcode Pokemon} to be removed + */ + protected 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); @@ -460,27 +595,29 @@ export class MoveEffectPhase extends PokemonPhase { } /** - * Prevents subsequent strikes of this phase's invoked move from occurring - * @param target {@linkcode Pokemon} if defined, only stop subsequent - * strikes against this Pokemon - */ - stopMultiHit(target?: Pokemon): void { - /** If given a specific target, remove the target from subsequent strikes */ + * Prevents subsequent strikes of this phase's invoked move from occurring + * @param target {@linkcode Pokemon} if defined, only stop subsequent + * strikes against this Pokemon + */ + public 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. - */ + const user = this.getUserPokemon(); + if (!user) { + return; + } + // 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; // TODO: is the bang correct here? - this.getUserPokemon()!.turnData.hitsLeft = 1; // TODO: is the bang correct here? + user.turnData.hitCount = 1; + user.turnData.hitsLeft = 1; } } - /** Returns a new MoveEffectPhase with the same properties as this phase */ - getNewHitPhase() { + /** @returns A new `MoveEffectPhase` with the same properties as this phase */ + protected getNewHitPhase(): MoveEffectPhase { return new MoveEffectPhase(this.scene, this.battlerIndex, this.targets, this.move); } } diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts index f50cfbd78ac..5c6c339ffa5 100644 --- a/src/phases/move-phase.ts +++ b/src/phases/move-phase.ts @@ -1,16 +1,17 @@ import { BattlerIndex } from "#app/battle"; import BattleScene from "#app/battle-scene"; -import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability"; +import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr, ReduceStatusEffectDurationAbAttr } from "#app/data/ability"; import { CommonAnim } from "#app/data/battle-anims"; import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags"; -import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move"; +import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, CopyMoveAttr, frenzyMissFunc, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move"; import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms"; import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect"; import { Type } from "#app/data/type"; import { getTerrainBlockMessage } from "#app/data/weather"; import { MoveUsedEvent } from "#app/events/battle-scene"; -import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon"; +import Pokemon, { MoveResult, PokemonMove } from "#app/field/pokemon"; import { getPokemonNameWithAffix } from "#app/messages"; +import Overrides from "#app/overrides"; import { BattlePhase } from "#app/phases/battle-phase"; import { CommonAnimPhase } from "#app/phases/common-anim-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; @@ -22,6 +23,7 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { StatusEffect } from "#enums/status-effect"; import i18next from "i18next"; +import { MoveChargePhase } from "#app/phases/move-charge-phase"; export class MovePhase extends BattlePhase { protected _pokemon: Pokemon; @@ -134,6 +136,8 @@ export class MovePhase extends BattlePhase { if (this.cancelled || this.failed) { this.handlePreMoveFailures(); + } else if (this.move.getMove().isChargingMove() && !this.pokemon.getTag(BattlerTagType.CHARGING)) { + this.chargeMove(); } else { this.useMove(); } @@ -167,26 +171,32 @@ export class MovePhase extends BattlePhase { let healed = false; switch (this.pokemon.status.effect) { - case StatusEffect.PARALYSIS: - if (!this.pokemon.randSeedInt(4)) { - activated = true; - this.cancelled = true; - } - break; - case StatusEffect.SLEEP: - applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); - healed = this.pokemon.status.turnCount === this.pokemon.status.cureTurn; - activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); - this.cancelled = activated; - break; - case StatusEffect.FREEZE: - healed = !!this.move.getMove().findAttr(attr => attr instanceof HealStatusEffectAttr && attr.selfTarget && attr.isOfEffect(StatusEffect.FREEZE)) || !this.pokemon.randSeedInt(5); - activated = !healed; - this.cancelled = activated; - break; + case StatusEffect.PARALYSIS: + activated = (!this.pokemon.randSeedInt(4) || Overrides.STATUS_ACTIVATION_OVERRIDE === true) && Overrides.STATUS_ACTIVATION_OVERRIDE !== false; + break; + case StatusEffect.SLEEP: + applyMoveAttrs(BypassSleepAttr, this.pokemon, null, this.move.getMove()); + const turnsRemaining = new NumberHolder(this.pokemon.status.sleepTurnsRemaining ?? 0); + applyAbAttrs(ReduceStatusEffectDurationAbAttr, this.pokemon, null, false, this.pokemon.status.effect, turnsRemaining); + this.pokemon.status.sleepTurnsRemaining = turnsRemaining.value; + healed = this.pokemon.status.sleepTurnsRemaining <= 0; + activated = !healed && !this.pokemon.getTag(BattlerTagType.BYPASS_SLEEP); + break; + case StatusEffect.FREEZE: + healed = + !!this.move.getMove().findAttr((attr) => + attr instanceof HealStatusEffectAttr + && attr.selfTarget + && attr.isOfEffect(StatusEffect.FREEZE)) + || (!this.pokemon.randSeedInt(5) && Overrides.STATUS_ACTIVATION_OVERRIDE !== true) + || Overrides.STATUS_ACTIVATION_OVERRIDE === false; + + activated = !healed; + break; } if (activated) { + this.cancel(); 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))); } else if (healed) { @@ -219,12 +229,15 @@ export class MovePhase extends BattlePhase { this.showMoveText(); - // TODO: Clean up implementation of two-turn moves. if (moveQueue.length > 0) { // Using .shift here clears out two turn moves once they've been used this.ignorePp = moveQueue.shift()?.ignorePP ?? false; } + if (this.pokemon.getTag(BattlerTagType.CHARGING)?.sourceMove === this.move.moveId) { + this.pokemon.lapseTag(BattlerTagType.CHARGING); + } + // "commit" to using the move, deducting PP. if (!this.ignorePp) { const ppUsed = 1 + this.getPpIncreaseFromPressure(targets); @@ -288,6 +301,9 @@ export class MovePhase extends BattlePhase { } this.showFailedText(failedText); + + // Remove the user from its semi-invulnerable state (if applicable) + this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); } // Handle Dancer, which triggers immediately after a move is used (rather than waiting on `this.end()`). @@ -299,6 +315,35 @@ export class MovePhase extends BattlePhase { } } + /** Queues a {@linkcode MoveChargePhase} for this phase's invoked move. */ + protected chargeMove() { + const move = this.move.getMove(); + const targets = this.getActiveTargetPokemon(); + + if (move.applyConditions(this.pokemon, targets[0], move)) { + // Protean and Libero apply on the charging turn of charge moves + applyPreAttackAbAttrs(PokemonTypeChangeAbAttr, this.pokemon, null, this.move.getMove()); + + this.showMoveText(); + this.scene.unshiftPhase(new MoveChargePhase(this.scene, this.pokemon.getBattlerIndex(), this.targets[0], this.move)); + } else { + this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); + + let failedText: string | undefined; + const failureMessage = move.getFailedText(this.pokemon, targets[0], move, new BooleanHolder(false)); + + if (failureMessage) { + failedText = failureMessage; + } + + this.showMoveText(); + this.showFailedText(failedText); + + // Remove the user from its semi-invulnerable state (if applicable) + this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); + } + } + /** * Queues a {@linkcode MoveEndPhase} if the move wasn't a {@linkcode followUp} and {@linkcode canMove()} returns `true`, * then ends the phase. @@ -412,8 +457,6 @@ export class MovePhase extends BattlePhase { * - Lapses `AFTER_MOVE` tags: * - This handles the effects of {@link Moves.SUBSTITUTE Substitute} * - Removes the second turn of charge moves - * - * TODO: handle charge moves more gracefully */ protected handlePreMoveFailures(): void { if (this.cancelled || this.failed) { @@ -427,6 +470,10 @@ export class MovePhase extends BattlePhase { this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), ppUsed)); } + if (this.cancelled && this.pokemon.summonData?.tags?.find(t => t.tagType === BattlerTagType.FRENZY)) { + frenzyMissFunc(this.pokemon, this.move.getMove()); + } + this.pokemon.pushMoveHistory({ move: Moves.NONE, result: MoveResult.FAIL }); this.pokemon.lapseTags(BattlerTagLapseType.MOVE_EFFECT); @@ -445,18 +492,7 @@ export class MovePhase extends BattlePhase { return; } - if (this.move.getMove().hasAttr(ChargeAttr)) { - const lastMove = this.pokemon.getLastXMoves() as TurnMove[]; - if (!lastMove.length || lastMove[0].move !== this.move.getMove().id || lastMove[0].result !== MoveResult.OTHER) { - this.scene.queueMessage(i18next.t("battle:useMove", { - pokemonNameWithAffix: getPokemonNameWithAffix(this.pokemon), - moveName: this.move.getName() - }), 500); - return; - } - } - - if (this.pokemon.getTag(BattlerTagType.RECHARGING || BattlerTagType.INTERRUPTED)) { + if (this.pokemon.getTag(BattlerTagType.RECHARGING) || this.pokemon.getTag(BattlerTagType.INTERRUPTED)) { return; } diff --git a/src/phases/mystery-encounter-phases.ts b/src/phases/mystery-encounter-phases.ts index 0166b2d6abd..49e78fa5369 100644 --- a/src/phases/mystery-encounter-phases.ts +++ b/src/phases/mystery-encounter-phases.ts @@ -402,7 +402,7 @@ export class MysteryEncounterBattlePhase extends Phase { } } - const availablePartyMembers = scene.getParty().filter(p => !p.isFainted()); + const availablePartyMembers = scene.getParty().filter(p => p.isAllowedInBattle()); if (!availablePartyMembers[0].isOnField()) { scene.pushPhase(new SummonPhase(scene, 0)); diff --git a/src/phases/obtain-status-effect-phase.ts b/src/phases/obtain-status-effect-phase.ts index c396fa7ba59..01384b932cb 100644 --- a/src/phases/obtain-status-effect-phase.ts +++ b/src/phases/obtain-status-effect-phase.ts @@ -8,26 +8,26 @@ import { getPokemonNameWithAffix } from "#app/messages"; import { PokemonPhase } from "./pokemon-phase"; export class ObtainStatusEffectPhase extends PokemonPhase { - private statusEffect?: StatusEffect | undefined; - private cureTurn?: integer | null; + private statusEffect?: StatusEffect; + private turnsRemaining?: number; private sourceText?: string | null; private sourcePokemon?: Pokemon | null; - constructor(scene: BattleScene, battlerIndex: BattlerIndex, statusEffect?: StatusEffect, cureTurn?: integer | null, sourceText?: string | null, sourcePokemon?: Pokemon | null) { + constructor(scene: BattleScene, battlerIndex: BattlerIndex, statusEffect?: StatusEffect, turnsRemaining?: number, sourceText?: string | null, sourcePokemon?: Pokemon | null) { super(scene, battlerIndex); this.statusEffect = statusEffect; - this.cureTurn = cureTurn; + this.turnsRemaining = turnsRemaining; this.sourceText = sourceText; - this.sourcePokemon = sourcePokemon; // For tracking which Pokemon caused the status effect + this.sourcePokemon = sourcePokemon; } start() { const pokemon = this.getPokemon(); if (pokemon && !pokemon.status) { if (pokemon.trySetStatus(this.statusEffect, false, this.sourcePokemon)) { - if (this.cureTurn) { - pokemon.status!.cureTurn = this.cureTurn; // TODO: is this bang correct? + if (this.turnsRemaining) { + pokemon.status!.sleepTurnsRemaining = this.turnsRemaining; } pokemon.updateInfo(true); new CommonBattleAnim(CommonAnim.POISON + (this.statusEffect! - 1), pokemon).play(this.scene, false, () => { diff --git a/src/phases/pokemon-anim-phase.ts b/src/phases/pokemon-anim-phase.ts index 6f1bfe8bc18..26ae11d1026 100644 --- a/src/phases/pokemon-anim-phase.ts +++ b/src/phases/pokemon-anim-phase.ts @@ -25,20 +25,20 @@ export class PokemonAnimPhase extends BattlePhase { super.start(); switch (this.key) { - case PokemonAnimType.SUBSTITUTE_ADD: - this.doSubstituteAddAnim(); - break; - case PokemonAnimType.SUBSTITUTE_PRE_MOVE: - this.doSubstitutePreMoveAnim(); - break; - case PokemonAnimType.SUBSTITUTE_POST_MOVE: - this.doSubstitutePostMoveAnim(); - break; - case PokemonAnimType.SUBSTITUTE_REMOVE: - this.doSubstituteRemoveAnim(); - break; - default: - this.end(); + case PokemonAnimType.SUBSTITUTE_ADD: + this.doSubstituteAddAnim(); + break; + case PokemonAnimType.SUBSTITUTE_PRE_MOVE: + this.doSubstitutePreMoveAnim(); + break; + case PokemonAnimType.SUBSTITUTE_POST_MOVE: + this.doSubstitutePostMoveAnim(); + break; + case PokemonAnimType.SUBSTITUTE_REMOVE: + this.doSubstituteRemoveAnim(); + break; + default: + this.end(); } } diff --git a/src/phases/post-summon-phase.ts b/src/phases/post-summon-phase.ts index 617bb8b1cfe..3db98d9926c 100644 --- a/src/phases/post-summon-phase.ts +++ b/src/phases/post-summon-phase.ts @@ -18,7 +18,7 @@ export class PostSummonPhase extends PokemonPhase { const pokemon = this.getPokemon(); if (pokemon.status?.effect === StatusEffect.TOXIC) { - pokemon.status.turnCount = 0; + pokemon.status.toxicTurnCount = 0; } this.scene.arena.applyTags(ArenaTrapTag, false, pokemon); diff --git a/src/phases/post-turn-status-effect-phase.ts b/src/phases/post-turn-status-effect-phase.ts index 285bbddde88..08e4d7cb952 100644 --- a/src/phases/post-turn-status-effect-phase.ts +++ b/src/phases/post-turn-status-effect-phase.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import { BattlerIndex } from "#app/battle"; -import { applyAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; +import { applyAbAttrs, applyPostDamageAbAttrs, BlockNonDirectDamageAbAttr, BlockStatusDamageAbAttr, PostDamageAbAttr, ReduceBurnDamageAbAttr } from "#app/data/ability"; import { CommonBattleAnim, CommonAnim } from "#app/data/battle-anims"; import { getStatusEffectActivationText } from "#app/data/status-effect"; import { BattleSpec } from "#app/enums/battle-spec"; @@ -26,21 +26,22 @@ export class PostTurnStatusEffectPhase extends PokemonPhase { this.scene.queueMessage(getStatusEffectActivationText(pokemon.status.effect, getPokemonNameWithAffix(pokemon))); const damage = new Utils.NumberHolder(0); switch (pokemon.status.effect) { - case StatusEffect.POISON: - damage.value = Math.max(pokemon.getMaxHp() >> 3, 1); - break; - case StatusEffect.TOXIC: - damage.value = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.turnCount), 1); - break; - case StatusEffect.BURN: - damage.value = Math.max(pokemon.getMaxHp() >> 4, 1); - applyAbAttrs(ReduceBurnDamageAbAttr, pokemon, null, false, damage); - break; + case StatusEffect.POISON: + damage.value = Math.max(pokemon.getMaxHp() >> 3, 1); + break; + case StatusEffect.TOXIC: + damage.value = Math.max(Math.floor((pokemon.getMaxHp() / 16) * pokemon.status.toxicTurnCount), 1); + break; + case StatusEffect.BURN: + damage.value = Math.max(pokemon.getMaxHp() >> 4, 1); + applyAbAttrs(ReduceBurnDamageAbAttr, pokemon, null, false, damage); + break; } if (damage.value) { // Set preventEndure flag to avoid pokemon surviving thanks to focus band, sturdy, endure ... this.scene.damageNumberHandler.add(this.getPokemon(), pokemon.damage(damage.value, false, true)); pokemon.updateInfo(); + applyPostDamageAbAttrs(PostDamageAbAttr, pokemon, damage.value, pokemon.hasPassive(), false, []); } new CommonBattleAnim(CommonAnim.POISON + (pokemon.status.effect - 1), pokemon).play(this.scene, false, () => this.end()); } else { diff --git a/src/phases/select-modifier-phase.ts b/src/phases/select-modifier-phase.ts index f9b3e978923..e5a60692bb4 100644 --- a/src/phases/select-modifier-phase.ts +++ b/src/phases/select-modifier-phase.ts @@ -1,7 +1,7 @@ import BattleScene from "#app/battle-scene"; import { ModifierTier } from "#app/modifier/modifier-tier"; import { regenerateModifierPoolThresholds, ModifierTypeOption, ModifierType, getPlayerShopModifierTypeOptionsForWave, PokemonModifierType, FusePokemonModifierType, PokemonMoveModifierType, TmModifierType, RememberMoveModifierType, PokemonPpRestoreModifierType, PokemonPpUpModifierType, ModifierPoolType, getPlayerModifierTypeOptions } from "#app/modifier/modifier-type"; -import { ExtraModifierModifier, HealShopCostModifier, Modifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { ExtraModifierModifier, HealShopCostModifier, Modifier, PokemonHeldItemModifier, TempExtraModifierModifier } from "#app/modifier/modifier"; import ModifierSelectUiHandler, { SHOP_OPTIONS_ROW_LIMIT } from "#app/ui/modifier-select-ui-handler"; import PartyUiHandler, { PartyUiMode, PartyOption } from "#app/ui/party-ui-handler"; import { Mode } from "#app/ui/ui"; @@ -45,6 +45,7 @@ export class SelectModifierPhase extends BattlePhase { const modifierCount = new Utils.IntegerHolder(3); if (this.isPlayer()) { this.scene.applyModifiers(ExtraModifierModifier, true, modifierCount); + this.scene.applyModifiers(TempExtraModifierModifier, true, modifierCount); } // If custom modifiers are specified, overrides default item count @@ -77,78 +78,78 @@ export class SelectModifierPhase extends BattlePhase { let cost: integer; const rerollCost = this.getRerollCost(this.scene.lockModifierTiers); switch (rowCursor) { - case 0: - switch (cursor) { case 0: - if (rerollCost < 0 || this.scene.money < rerollCost) { - this.scene.ui.playError(); - return false; - } else { - this.scene.reroll = true; - this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[])); - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); - if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { - this.scene.money -= rerollCost; - this.scene.updateMoneyText(); - this.scene.animateMoneyChanged(false); - } - this.scene.playSound("se/buy"); - } - break; - case 1: - 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 + switch (cursor) { + case 0: + if (rerollCost < 0 || this.scene.money < rerollCost) { + this.scene.ui.playError(); + return false; + } else { + this.scene.reroll = true; + this.scene.unshiftPhase(new SelectModifierPhase(this.scene, this.rerollCount + 1, this.typeOptions.map(o => o.type?.tier).filter(t => t !== undefined) as ModifierTier[])); + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE).then(() => super.end()); + if (!Overrides.WAIVE_ROLL_FEE_OVERRIDE) { + this.scene.money -= rerollCost; + this.scene.updateMoneyText(); + this.scene.animateMoneyChanged(false); + } + this.scene.playSound("se/buy"); + } + break; + case 1: + 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.isTransferable && m.pokemonId === party[fromSlotIndex].id) as PokemonHeldItemModifier[]; - const itemModifier = itemModifiers[itemIndex]; - this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); - } else { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); - } - }, PartyUiHandler.FilterItemMaxStacks); - break; - case 2: - this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { - this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); - }); - break; - case 3: - if (rerollCost < 0) { - // Reroll lock button is also disabled when reroll is disabled - this.scene.ui.playError(); - return false; + const itemModifier = itemModifiers[itemIndex]; + this.scene.tryTransferHeldItemModifier(itemModifier, party[toSlotIndex], true, itemQuantity); + } else { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); + } + }, PartyUiHandler.FilterItemMaxStacks); + break; + case 2: + this.scene.ui.setModeWithoutClear(Mode.PARTY, PartyUiMode.CHECK, -1, () => { + this.scene.ui.setMode(Mode.MODIFIER_SELECT, this.isPlayer(), this.typeOptions, modifierSelectCallback, this.getRerollCost(this.scene.lockModifierTiers)); + }); + break; + case 3: + if (rerollCost < 0) { + // Reroll lock button is also disabled when reroll is disabled + this.scene.ui.playError(); + return false; + } + this.scene.lockModifierTiers = !this.scene.lockModifierTiers; + const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; + uiHandler.setRerollCost(this.getRerollCost(this.scene.lockModifierTiers)); + uiHandler.updateLockRaritiesText(); + uiHandler.updateRerollCostText(); + return false; } - this.scene.lockModifierTiers = !this.scene.lockModifierTiers; - const uiHandler = this.scene.ui.getHandler() as ModifierSelectUiHandler; - uiHandler.setRerollCost(this.getRerollCost(this.scene.lockModifierTiers)); - uiHandler.updateLockRaritiesText(); - uiHandler.updateRerollCostText(); - return false; - } - return true; - case 1: - if (this.typeOptions.length === 0) { - this.scene.ui.clearText(); - this.scene.ui.setMode(Mode.MESSAGE); - super.end(); return true; - } - if (this.typeOptions[cursor].type) { - modifierType = this.typeOptions[cursor].type; - } - break; - default: - const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); - const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; - if (shopOption.type) { - modifierType = shopOption.type; - } - // Apply Black Sludge to healing item cost - const healingItemCost = new NumberHolder(shopOption.cost); - this.scene.applyModifier(HealShopCostModifier, true, healingItemCost); - cost = healingItemCost.value; - break; + case 1: + if (this.typeOptions.length === 0) { + this.scene.ui.clearText(); + this.scene.ui.setMode(Mode.MESSAGE); + super.end(); + return true; + } + if (this.typeOptions[cursor].type) { + modifierType = this.typeOptions[cursor].type; + } + break; + default: + const shopOptions = getPlayerShopModifierTypeOptionsForWave(this.scene.currentBattle.waveIndex, this.scene.getWaveMoneyAmount(1)); + const shopOption = shopOptions[rowCursor > 2 || shopOptions.length <= SHOP_OPTIONS_ROW_LIMIT ? cursor : cursor + SHOP_OPTIONS_ROW_LIMIT]; + if (shopOption.type) { + modifierType = shopOption.type; + } + // Apply Black Sludge to healing item cost + const healingItemCost = new NumberHolder(shopOption.cost); + this.scene.applyModifier(HealShopCostModifier, true, healingItemCost); + cost = healingItemCost.value; + break; } if (cost! && (this.scene.money < cost) && !Overrides.WAIVE_ROLL_FEE_OVERRIDE) { // TODO: is the bang on cost correct? @@ -274,7 +275,13 @@ export class SelectModifierPhase extends BattlePhase { // Otherwise, continue with custom multiplier multiplier = this.customModifierSettings.rerollMultiplier; } - return Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * Math.pow(2, this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + + const baseMultiplier = Math.min(Math.ceil(this.scene.currentBattle.waveIndex / 10) * baseValue * (2 ** this.rerollCount) * multiplier, Number.MAX_SAFE_INTEGER); + + // Apply Black Sludge to reroll cost + const modifiedRerollCost = new NumberHolder(baseMultiplier); + this.scene.applyModifier(HealShopCostModifier, true, modifiedRerollCost); + return modifiedRerollCost.value; } getPoolType(): ModifierPoolType { diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts index 4c13b883445..ce6ebea2442 100644 --- a/src/phases/stat-stage-change-phase.ts +++ b/src/phases/stat-stage-change-phase.ts @@ -64,7 +64,8 @@ export class StatStageChangePhase extends PokemonPhase { const cancelled = new BooleanHolder(false); if (!this.selfTarget && stages.value < 0) { - this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, false, cancelled); + // TODO: add a reference to the source of the stat change to fix Infiltrator interaction + this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, false, null, cancelled); } if (!cancelled.value && !this.selfTarget && stages.value < 0) { diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts index 07761b10d6e..c7e7bbe011e 100644 --- a/src/phases/switch-summon-phase.ts +++ b/src/phases/switch-summon-phase.ts @@ -64,9 +64,8 @@ export class SwitchSummonPhase extends SummonPhase { } const pokemon = this.getPokemon(); - - if (this.switchType === SwitchType.SWITCH) { - (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); + (this.player ? this.scene.getEnemyField() : this.scene.getPlayerField()).forEach(enemyPokemon => enemyPokemon.removeTagsBySourceId(pokemon.id)); + if (this.switchType === SwitchType.SWITCH || this.switchType === SwitchType.INITIAL_SWITCH) { const substitute = pokemon.getTag(SubstituteTag); if (substitute) { this.scene.tweens.add({ @@ -185,6 +184,11 @@ export class SwitchSummonPhase extends SummonPhase { } } + if (this.switchType !== SwitchType.INITIAL_SWITCH) { + pokemon.resetTurnData(); + pokemon.turnData.switchedInThisTurn = true; + } + this.lastPokemon?.resetSummonData(); this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeActiveTrigger, true); diff --git a/src/phases/trainer-victory-phase.ts b/src/phases/trainer-victory-phase.ts index fd48b91b1a1..dc1b962f47e 100644 --- a/src/phases/trainer-victory-phase.ts +++ b/src/phases/trainer-victory-phase.ts @@ -27,6 +27,12 @@ export class TrainerVictoryPhase extends BattlePhase { this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, modifierRewardFunc)); } + if (this.scene.eventManager.isEventActive()) { + for (const rewardFunc of this.scene.currentBattle.trainer?.config.eventRewardFuncs!) { + this.scene.unshiftPhase(new ModifierRewardPhase(this.scene, rewardFunc)); + } + } + const trainerType = this.scene.currentBattle.trainer?.config.trainerType!; // TODO: is this bang correct? if (vouchers.hasOwnProperty(TrainerType[trainerType])) { if (!this.scene.validateVoucher(vouchers[TrainerType[trainerType]]) && this.scene.currentBattle.trainer?.config.isBoss) { diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts index 25c079007fd..dc3ee3f660a 100644 --- a/src/phases/turn-start-phase.ts +++ b/src/phases/turn-start-phase.ts @@ -152,64 +152,64 @@ export class TurnStartPhase extends FieldPhase { } switch (turnCommand?.command) { - case Command.FIGHT: - const queuedMove = turnCommand.move; - pokemon.turnData.order = orderIndex++; - if (!queuedMove) { - continue; - } - const move = pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || new PokemonMove(queuedMove.move); - if (move.getMove().hasAttr(MoveHeaderAttr)) { - this.scene.unshiftPhase(new MoveHeaderPhase(this.scene, pokemon, move)); - } - if (pokemon.isPlayer()) { - if (turnCommand.cursor === -1) { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move));//TODO: is the bang correct here? - } else { - const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP);//TODO: is the bang correct here? - this.scene.pushPhase(playerPhase); + case Command.FIGHT: + const queuedMove = turnCommand.move; + pokemon.turnData.order = orderIndex++; + if (!queuedMove) { + continue; } - } else { - this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP));//TODO: is the bang correct here? - } - break; - case Command.BALL: - this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? - break; - case Command.POKEMON: - const switchType = turnCommand.args?.[0] ? SwitchType.BATON_PASS : SwitchType.SWITCH; - this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer())); - break; - case Command.RUN: - let runningPokemon = pokemon; - if (this.scene.currentBattle.double) { - const playerActivePokemon = field.filter(pokemon => { - if (!!pokemon) { - return pokemon.isPlayer() && pokemon.isActive(); + const move = pokemon.getMoveset().find(m => m?.moveId === queuedMove.move && m?.ppUsed < m?.getMovePp()) || new PokemonMove(queuedMove.move); + if (move.getMove().hasAttr(MoveHeaderAttr)) { + this.scene.unshiftPhase(new MoveHeaderPhase(this.scene, pokemon, move)); + } + if (pokemon.isPlayer()) { + if (turnCommand.cursor === -1) { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move));//TODO: is the bang correct here? } else { - return; + const playerPhase = new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP);//TODO: is the bang correct here? + this.scene.pushPhase(playerPhase); } - }); - // if only one pokemon is alive, use that one - if (playerActivePokemon.length > 1) { - // find which active pokemon has faster speed - const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; - // check if either active pokemon has the ability "Run Away" - const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); - runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; + } else { + this.scene.pushPhase(new MovePhase(this.scene, pokemon, turnCommand.targets || turnCommand.move!.targets, move, false, queuedMove.ignorePP));//TODO: is the bang correct here? } - } - this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); - break; + break; + case Command.BALL: + this.scene.unshiftPhase(new AttemptCapturePhase(this.scene, turnCommand.targets![0] % 2, turnCommand.cursor!));//TODO: is the bang correct here? + break; + case Command.POKEMON: + const switchType = turnCommand.args?.[0] ? SwitchType.BATON_PASS : SwitchType.SWITCH; + this.scene.unshiftPhase(new SwitchSummonPhase(this.scene, switchType, pokemon.getFieldIndex(), turnCommand.cursor!, true, pokemon.isPlayer())); + break; + case Command.RUN: + let runningPokemon = pokemon; + if (this.scene.currentBattle.double) { + const playerActivePokemon = field.filter(pokemon => { + if (!!pokemon) { + return pokemon.isPlayer() && pokemon.isActive(); + } else { + return; + } + }); + // if only one pokemon is alive, use that one + if (playerActivePokemon.length > 1) { + // find which active pokemon has faster speed + const fasterPokemon = playerActivePokemon[0].getStat(Stat.SPD) > playerActivePokemon[1].getStat(Stat.SPD) ? playerActivePokemon[0] : playerActivePokemon[1]; + // check if either active pokemon has the ability "Run Away" + const hasRunAway = playerActivePokemon.find(p => p.hasAbility(Abilities.RUN_AWAY)); + runningPokemon = hasRunAway !== undefined ? hasRunAway : fasterPokemon; + } + } + this.scene.unshiftPhase(new AttemptRunPhase(this.scene, runningPokemon.getFieldIndex())); + break; } } this.scene.pushPhase(new WeatherEffectPhase(this.scene)); + this.scene.pushPhase(new BerryPhase(this.scene)); /** Add a new phase to check who should be taking status damage */ this.scene.pushPhase(new CheckStatusEffectPhase(this.scene, moveOrder)); - this.scene.pushPhase(new BerryPhase(this.scene)); this.scene.pushPhase(new TurnEndPhase(this.scene)); /** diff --git a/src/phases/victory-phase.ts b/src/phases/victory-phase.ts index e900ff97fc6..1faa31655df 100644 --- a/src/phases/victory-phase.ts +++ b/src/phases/victory-phase.ts @@ -25,12 +25,17 @@ export class VictoryPhase extends PokemonPhase { start() { super.start(); - this.scene.gameData.gameStats.pokemonDefeated++; + const isMysteryEncounter = this.scene.currentBattle.isBattleMysteryEncounter(); + + // update Pokemon defeated count except for MEs that disable it + if (!isMysteryEncounter || !this.scene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { + this.scene.gameData.gameStats.pokemonDefeated++; + } const expValue = this.getPokemon().getExpValue(); this.scene.applyPartyExp(expValue, true); - if (this.scene.currentBattle.isBattleMysteryEncounter()) { + if (isMysteryEncounter) { handleMysteryEncounterVictory(this.scene, false, this.isExpOnly); return this.end(); } diff --git a/src/plugins/i18n.ts b/src/plugins/i18n.ts index 2f646bad07e..6a7a36dbca5 100644 --- a/src/plugins/i18n.ts +++ b/src/plugins/i18n.ts @@ -153,7 +153,7 @@ export async function initI18n(): Promise { i18next.use(new KoreanPostpositionProcessor()); await i18next.init({ fallbackLng: "en", - supportedLngs: [ "en", "es", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES", "he" ], + supportedLngs: [ "en", "es-ES", "fr", "it", "de", "zh-CN", "zh-TW", "pt-BR", "ko", "ja", "ca-ES", "he" ], backend: { loadPath(lng: string, [ ns ]: string[]) { let fileName: string; @@ -164,7 +164,7 @@ export async function initI18n(): Promise { } else { fileName = camelCaseToKebabCase(ns); } - return `/locales/${lng}/${fileName}.json?v=${pkg.version}`; + return `./locales/${lng}/${fileName}.json?v=${pkg.version}`; }, }, defaultNS: "menu", diff --git a/src/system/achv.ts b/src/system/achv.ts index 7329dd41fd5..366813328e2 100644 --- a/src/system/achv.ts +++ b/src/system/achv.ts @@ -156,133 +156,133 @@ export function getAchievementDescription(localizationKey: string): string { const genderStr = PlayerGender[genderIndex].toLowerCase(); switch (localizationKey) { - case "10K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US") }); - case "100K_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US") }); - case "1M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US") }); - case "10M_MONEY": - return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US") }); - case "250_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US") }); - case "1000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US") }); - case "2500_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US") }); - case "10000_DMG": - return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US") }); - case "250_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._250_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); - case "1000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._1000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); - case "2500_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._2500_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); - case "10000_HEAL": - return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._10000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); - case "LV_100": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_100.level }); - case "LV_250": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_250.level }); - case "LV_1000": - return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_1000.level }); - case "10_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US") }); - case "25_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US") }); - case "50_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US") }); - case "75_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US") }); - case "100_RIBBONS": - return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US") }); - case "TRANSFER_MAX_STAT_STAGE": - return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { context: genderStr }); - case "MAX_FRIENDSHIP": - return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr }); - case "MEGA_EVOLVE": - return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); - case "GIGANTAMAX": - return i18next.t("achv:GIGANTAMAX.description", { context: genderStr }); - case "TERASTALLIZE": - return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); - case "STELLAR_TERASTALLIZE": - return i18next.t("achv:STELLAR_TERASTALLIZE.description", { context: genderStr }); - case "SPLICE": - return i18next.t("achv:SPLICE.description", { context: genderStr }); - case "MINI_BLACK_HOLE": - return i18next.t("achv:MINI_BLACK_HOLE.description", { context: genderStr }); - case "CATCH_MYTHICAL": - return i18next.t("achv:CATCH_MYTHICAL.description", { context: genderStr }); - case "CATCH_SUB_LEGENDARY": - return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { context: genderStr }); - case "CATCH_LEGENDARY": - return i18next.t("achv:CATCH_LEGENDARY.description", { context: genderStr }); - case "SEE_SHINY": - return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); - case "SHINY_PARTY": - return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); - case "HATCH_MYTHICAL": - return i18next.t("achv:HATCH_MYTHICAL.description", { context: genderStr }); - case "HATCH_SUB_LEGENDARY": - return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { context: genderStr }); - case "HATCH_LEGENDARY": - return i18next.t("achv:HATCH_LEGENDARY.description", { context: genderStr }); - case "HATCH_SHINY": - return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); - case "HIDDEN_ABILITY": - return i18next.t("achv:HIDDEN_ABILITY.description", { context: genderStr }); - case "PERFECT_IVS": - return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); - case "CLASSIC_VICTORY": - return i18next.t("achv:CLASSIC_VICTORY.description", { context: genderStr }); - case "UNEVOLVED_CLASSIC_VICTORY": - return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { context: genderStr }); - case "MONO_GEN_ONE": - return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); - case "MONO_GEN_TWO": - return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); - case "MONO_GEN_THREE": - return i18next.t("achv:MONO_GEN_THREE.description", { context: genderStr }); - case "MONO_GEN_FOUR": - return i18next.t("achv:MONO_GEN_FOUR.description", { context: genderStr }); - case "MONO_GEN_FIVE": - return i18next.t("achv:MONO_GEN_FIVE.description", { context: genderStr }); - case "MONO_GEN_SIX": - return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); - case "MONO_GEN_SEVEN": - return i18next.t("achv:MONO_GEN_SEVEN.description", { context: genderStr }); - case "MONO_GEN_EIGHT": - return i18next.t("achv:MONO_GEN_EIGHT.description", { context: genderStr }); - case "MONO_GEN_NINE": - return i18next.t("achv:MONO_GEN_NINE.description", { context: genderStr }); - case "MONO_NORMAL": - case "MONO_FIGHTING": - case "MONO_FLYING": - case "MONO_POISON": - case "MONO_GROUND": - case "MONO_ROCK": - case "MONO_BUG": - case "MONO_GHOST": - case "MONO_STEEL": - case "MONO_FIRE": - case "MONO_WATER": - case "MONO_GRASS": - case "MONO_ELECTRIC": - case "MONO_PSYCHIC": - case "MONO_ICE": - case "MONO_DRAGON": - case "MONO_DARK": - case "MONO_FAIRY": - return i18next.t("achv:MonoType.description", { context: genderStr, "type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`) }); - case "FRESH_START": - return i18next.t("achv:FRESH_START.description", { context: genderStr }); - case "INVERSE_BATTLE": - return i18next.t("achv:INVERSE_BATTLE.description", { context: genderStr }); - case "BREEDERS_IN_SPACE": - return i18next.t("achv:BREEDERS_IN_SPACE.description", { context: genderStr }); - default: - return ""; + case "10K_MONEY": + return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10K_MONEY.moneyAmount.toLocaleString("en-US") }); + case "100K_MONEY": + return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._100K_MONEY.moneyAmount.toLocaleString("en-US") }); + case "1M_MONEY": + return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._1M_MONEY.moneyAmount.toLocaleString("en-US") }); + case "10M_MONEY": + return i18next.t("achv:MoneyAchv.description", { context: genderStr, "moneyAmount": achvs._10M_MONEY.moneyAmount.toLocaleString("en-US") }); + case "250_DMG": + return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._250_DMG.damageAmount.toLocaleString("en-US") }); + case "1000_DMG": + return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._1000_DMG.damageAmount.toLocaleString("en-US") }); + case "2500_DMG": + return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._2500_DMG.damageAmount.toLocaleString("en-US") }); + case "10000_DMG": + return i18next.t("achv:DamageAchv.description", { context: genderStr, "damageAmount": achvs._10000_DMG.damageAmount.toLocaleString("en-US") }); + case "250_HEAL": + return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._250_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + case "1000_HEAL": + return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._1000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + case "2500_HEAL": + return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._2500_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + case "10000_HEAL": + return i18next.t("achv:HealAchv.description", { context: genderStr, "healAmount": achvs._10000_HEAL.healAmount.toLocaleString("en-US"), "HP": i18next.t(getShortenedStatKey(Stat.HP)) }); + case "LV_100": + return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_100.level }); + case "LV_250": + return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_250.level }); + case "LV_1000": + return i18next.t("achv:LevelAchv.description", { context: genderStr, "level": achvs.LV_1000.level }); + case "10_RIBBONS": + return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._10_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + case "25_RIBBONS": + return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._25_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + case "50_RIBBONS": + return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._50_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + case "75_RIBBONS": + return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._75_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + case "100_RIBBONS": + return i18next.t("achv:RibbonAchv.description", { context: genderStr, "ribbonAmount": achvs._100_RIBBONS.ribbonAmount.toLocaleString("en-US") }); + case "TRANSFER_MAX_STAT_STAGE": + return i18next.t("achv:TRANSFER_MAX_STAT_STAGE.description", { context: genderStr }); + case "MAX_FRIENDSHIP": + return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr }); + case "MEGA_EVOLVE": + return i18next.t("achv:MEGA_EVOLVE.description", { context: genderStr }); + case "GIGANTAMAX": + return i18next.t("achv:GIGANTAMAX.description", { context: genderStr }); + case "TERASTALLIZE": + return i18next.t("achv:TERASTALLIZE.description", { context: genderStr }); + case "STELLAR_TERASTALLIZE": + return i18next.t("achv:STELLAR_TERASTALLIZE.description", { context: genderStr }); + case "SPLICE": + return i18next.t("achv:SPLICE.description", { context: genderStr }); + case "MINI_BLACK_HOLE": + return i18next.t("achv:MINI_BLACK_HOLE.description", { context: genderStr }); + case "CATCH_MYTHICAL": + return i18next.t("achv:CATCH_MYTHICAL.description", { context: genderStr }); + case "CATCH_SUB_LEGENDARY": + return i18next.t("achv:CATCH_SUB_LEGENDARY.description", { context: genderStr }); + case "CATCH_LEGENDARY": + return i18next.t("achv:CATCH_LEGENDARY.description", { context: genderStr }); + case "SEE_SHINY": + return i18next.t("achv:SEE_SHINY.description", { context: genderStr }); + case "SHINY_PARTY": + return i18next.t("achv:SHINY_PARTY.description", { context: genderStr }); + case "HATCH_MYTHICAL": + return i18next.t("achv:HATCH_MYTHICAL.description", { context: genderStr }); + case "HATCH_SUB_LEGENDARY": + return i18next.t("achv:HATCH_SUB_LEGENDARY.description", { context: genderStr }); + case "HATCH_LEGENDARY": + return i18next.t("achv:HATCH_LEGENDARY.description", { context: genderStr }); + case "HATCH_SHINY": + return i18next.t("achv:HATCH_SHINY.description", { context: genderStr }); + case "HIDDEN_ABILITY": + return i18next.t("achv:HIDDEN_ABILITY.description", { context: genderStr }); + case "PERFECT_IVS": + return i18next.t("achv:PERFECT_IVS.description", { context: genderStr }); + case "CLASSIC_VICTORY": + return i18next.t("achv:CLASSIC_VICTORY.description", { context: genderStr }); + case "UNEVOLVED_CLASSIC_VICTORY": + return i18next.t("achv:UNEVOLVED_CLASSIC_VICTORY.description", { context: genderStr }); + case "MONO_GEN_ONE": + return i18next.t("achv:MONO_GEN_ONE.description", { context: genderStr }); + case "MONO_GEN_TWO": + return i18next.t("achv:MONO_GEN_TWO.description", { context: genderStr }); + case "MONO_GEN_THREE": + return i18next.t("achv:MONO_GEN_THREE.description", { context: genderStr }); + case "MONO_GEN_FOUR": + return i18next.t("achv:MONO_GEN_FOUR.description", { context: genderStr }); + case "MONO_GEN_FIVE": + return i18next.t("achv:MONO_GEN_FIVE.description", { context: genderStr }); + case "MONO_GEN_SIX": + return i18next.t("achv:MONO_GEN_SIX.description", { context: genderStr }); + case "MONO_GEN_SEVEN": + return i18next.t("achv:MONO_GEN_SEVEN.description", { context: genderStr }); + case "MONO_GEN_EIGHT": + return i18next.t("achv:MONO_GEN_EIGHT.description", { context: genderStr }); + case "MONO_GEN_NINE": + return i18next.t("achv:MONO_GEN_NINE.description", { context: genderStr }); + case "MONO_NORMAL": + case "MONO_FIGHTING": + case "MONO_FLYING": + case "MONO_POISON": + case "MONO_GROUND": + case "MONO_ROCK": + case "MONO_BUG": + case "MONO_GHOST": + case "MONO_STEEL": + case "MONO_FIRE": + case "MONO_WATER": + case "MONO_GRASS": + case "MONO_ELECTRIC": + case "MONO_PSYCHIC": + case "MONO_ICE": + case "MONO_DRAGON": + case "MONO_DARK": + case "MONO_FAIRY": + return i18next.t("achv:MonoType.description", { context: genderStr, "type": i18next.t(`pokemonInfo:Type.${localizationKey.slice(5)}`) }); + case "FRESH_START": + return i18next.t("achv:FRESH_START.description", { context: genderStr }); + case "INVERSE_BATTLE": + return i18next.t("achv:INVERSE_BATTLE.description", { context: genderStr }); + case "BREEDERS_IN_SPACE": + return i18next.t("achv:BREEDERS_IN_SPACE.description", { context: genderStr }); + default: + return ""; } } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 41746957d49..c00159a7fd7 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -67,22 +67,22 @@ const saveKey = "x0i2O7WRiANTqPmZ"; // Temporary; secure encryption is not yet n export function getDataTypeKey(dataType: GameDataType, slotId: integer = 0): string { switch (dataType) { - case GameDataType.SYSTEM: - return "data"; - case GameDataType.SESSION: - let ret = "sessionData"; - if (slotId) { - ret += slotId; - } - return ret; - case GameDataType.SETTINGS: - return "settings"; - case GameDataType.TUTORIALS: - return "tutorials"; - case GameDataType.SEEN_DIALOGUES: - return "seenDialogues"; - case GameDataType.RUN_HISTORY: - return "runHistoryData"; + case GameDataType.SYSTEM: + return "data"; + case GameDataType.SESSION: + let ret = "sessionData"; + if (slotId) { + ret += slotId; + } + return ret; + case GameDataType.SETTINGS: + return "settings"; + case GameDataType.TUTORIALS: + return "tutorials"; + case GameDataType.SEEN_DIALOGUES: + return "seenDialogues"; + case GameDataType.RUN_HISTORY: + return "runHistoryData"; } } @@ -1374,9 +1374,9 @@ export class GameData { const dataKey: string = `${getDataTypeKey(dataType, slotId)}_${loggedInUser?.username}`; const handleData = (dataStr: string) => { switch (dataType) { - case GameDataType.SYSTEM: - dataStr = this.convertSystemDataStr(dataStr, true); - break; + case GameDataType.SYSTEM: + dataStr = this.convertSystemDataStr(dataStr, true); + break; } const encryptedData = AES.encrypt(dataStr, saveKey); const blob = new Blob([ encryptedData.toString() ], { type: "text/json" }); @@ -1434,28 +1434,28 @@ export class GameData { try { dataName = GameDataType[dataType].toLowerCase(); switch (dataType) { - case GameDataType.SYSTEM: - dataStr = this.convertSystemDataStr(dataStr); - const systemData = this.parseSystemData(dataStr); - valid = !!systemData.dexData && !!systemData.timestamp; - break; - case GameDataType.SESSION: - const sessionData = this.parseSessionData(dataStr); - valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; - break; - case GameDataType.RUN_HISTORY: - const data = JSON.parse(dataStr); - const keys = Object.keys(data); - dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); - keys.forEach((key) => { - const entryKeys = Object.keys(data[key]); - valid = [ "isFavorite", "isVictory", "entry" ].every(v => entryKeys.includes(v)) && entryKeys.length === 3; - }); - break; - case GameDataType.SETTINGS: - case GameDataType.TUTORIALS: - valid = true; - break; + case GameDataType.SYSTEM: + dataStr = this.convertSystemDataStr(dataStr); + const systemData = this.parseSystemData(dataStr); + valid = !!systemData.dexData && !!systemData.timestamp; + break; + case GameDataType.SESSION: + const sessionData = this.parseSessionData(dataStr); + valid = !!sessionData.party && !!sessionData.enemyParty && !!sessionData.timestamp; + break; + case GameDataType.RUN_HISTORY: + const data = JSON.parse(dataStr); + const keys = Object.keys(data); + dataName = i18next.t("menuUiHandler:RUN_HISTORY").toLowerCase(); + keys.forEach((key) => { + const entryKeys = Object.keys(data[key]); + valid = [ "isFavorite", "isVictory", "entry" ].every(v => entryKeys.includes(v)) && entryKeys.length === 3; + }); + break; + case GameDataType.SETTINGS: + case GameDataType.TUTORIALS: + valid = true; + break; } } catch (ex) { console.error(ex); @@ -1569,6 +1569,10 @@ export class GameData { } setPokemonSeen(pokemon: Pokemon, incrementCount: boolean = true, trainer: boolean = false): void { + // Some Mystery Encounters block updates to these stats + if (this.scene.currentBattle?.isBattleMysteryEncounter() && this.scene.currentBattle.mysteryEncounter?.preventGameStatsUpdates) { + return; + } const dexEntry = this.dexData[pokemon.species.speciesId]; dexEntry.seenAttr |= pokemon.getDexAttr(); if (incrementCount) { diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts index 8240b6bcf84..485c1d90c1d 100644 --- a/src/system/pokemon-data.ts +++ b/src/system/pokemon-data.ts @@ -12,7 +12,7 @@ import { loadBattlerTag } from "../data/battler-tags"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; export default class PokemonData { public id: integer; @@ -33,7 +33,6 @@ export default class PokemonData { public stats: integer[]; public ivs: integer[]; public nature: Nature; - public natureOverride: Nature | -1; public moveset: (PokemonMove | null)[]; public status: Status | null; public friendship: integer; @@ -54,14 +53,20 @@ export default class PokemonData { public fusionVariant: Variant; public fusionGender: Gender; public fusionLuck: integer; - public fusionMysteryEncounterPokemonData: MysteryEncounterPokemonData; public boss: boolean; public bossSegments?: integer; public summonData: PokemonSummonData; + /** Data that can customize a Pokemon in non-standard ways from its Species */ - public mysteryEncounterPokemonData: MysteryEncounterPokemonData; + public customPokemonData: CustomPokemonData; + public fusionCustomPokemonData: CustomPokemonData; + + // Deprecated attributes, needed for now to allow SessionData migration (see PR#4619 comments) + public natureOverride: Nature | -1; + public mysteryEncounterPokemonData: CustomPokemonData | null; + public fusionMysteryEncounterPokemonData: CustomPokemonData | null; constructor(source: Pokemon | any, forHistory: boolean = false) { const sourcePokemon = source instanceof Pokemon ? source : null; @@ -87,7 +92,6 @@ export default class PokemonData { this.stats = source.stats; this.ivs = source.ivs; this.nature = source.nature !== undefined ? source.nature : 0 as Nature; - this.natureOverride = source.natureOverride !== undefined ? source.natureOverride : -1; this.friendship = source.friendship !== undefined ? source.friendship : getPokemonSpecies(this.species).baseFriendship; this.metLevel = source.metLevel || 5; this.metBiome = source.metBiome !== undefined ? source.metBiome : -1; @@ -107,9 +111,15 @@ export default class PokemonData { this.fusionVariant = source.fusionVariant; this.fusionGender = source.fusionGender; this.fusionLuck = source.fusionLuck !== undefined ? source.fusionLuck : (source.fusionShiny ? source.fusionVariant + 1 : 0); + this.fusionCustomPokemonData = new CustomPokemonData(source.fusionCustomPokemonData); this.usedTMs = source.usedTMs ?? []; - this.mysteryEncounterPokemonData = new MysteryEncounterPokemonData(source.mysteryEncounterPokemonData); + this.customPokemonData = new CustomPokemonData(source.customPokemonData); + + // Deprecated, but needed for session data migration + this.natureOverride = source.natureOverride; + this.mysteryEncounterPokemonData = source.mysteryEncounterPokemonData ? new CustomPokemonData(source.mysteryEncounterPokemonData) : null; + this.fusionMysteryEncounterPokemonData = source.fusionMysteryEncounterPokemonData ? new CustomPokemonData(source.fusionMysteryEncounterPokemonData) : null; if (!forHistory) { this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss); @@ -125,10 +135,10 @@ export default class PokemonData { } } } else { - this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp)); + this.moveset = (source.moveset || [ new PokemonMove(Moves.TACKLE), new PokemonMove(Moves.GROWL) ]).filter(m => m).map((m: any) => new PokemonMove(m.moveId, m.ppUsed, m.ppUp, m.virtual, m.maxPpOverride)); if (!forHistory) { this.status = source.status - ? new Status(source.status.effect, source.status.turnCount, source.status.cureTurn) + ? new Status(source.status.effect, source.status.toxicTurnCount, source.status.sleepTurnsRemaining) : null; } diff --git a/src/system/settings/settings-gamepad.ts b/src/system/settings/settings-gamepad.ts index c96ec36f9a5..322b2baac9e 100644 --- a/src/system/settings/settings-gamepad.ts +++ b/src/system/settings/settings-gamepad.ts @@ -82,66 +82,66 @@ export const settingGamepadBlackList = [ export function setSettingGamepad(scene: BattleScene, setting: SettingGamepad, value: integer): boolean { switch (setting) { - case SettingGamepad.Gamepad_Support: + case SettingGamepad.Gamepad_Support: // if we change the value of the gamepad support, we call a method in the inputController to // activate or deactivate the controller listener - scene.inputController.setGamepadSupport(settingGamepadOptions[setting][value] !== "Disabled"); - break; - case SettingGamepad.Button_Action: - case SettingGamepad.Button_Cancel: - case SettingGamepad.Button_Menu: - case SettingGamepad.Button_Stats: - case SettingGamepad.Button_Cycle_Shiny: - case SettingGamepad.Button_Cycle_Form: - case SettingGamepad.Button_Cycle_Gender: - case SettingGamepad.Button_Cycle_Ability: - case SettingGamepad.Button_Cycle_Nature: - case SettingGamepad.Button_Cycle_Variant: - case SettingGamepad.Button_Speed_Up: - case SettingGamepad.Button_Slow_Down: - case SettingGamepad.Button_Submit: - if (value) { - if (scene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); - return success; - }; - scene.ui.setOverlayMode(Mode.GAMEPAD_BINDING, { - target: setting, - cancelHandler: cancelHandler, - }); + scene.inputController.setGamepadSupport(settingGamepadOptions[setting][value] !== "Disabled"); + break; + case SettingGamepad.Button_Action: + case SettingGamepad.Button_Cancel: + case SettingGamepad.Button_Menu: + case SettingGamepad.Button_Stats: + case SettingGamepad.Button_Cycle_Shiny: + case SettingGamepad.Button_Cycle_Form: + case SettingGamepad.Button_Cycle_Gender: + case SettingGamepad.Button_Cycle_Ability: + case SettingGamepad.Button_Cycle_Nature: + case SettingGamepad.Button_Cycle_Variant: + case SettingGamepad.Button_Speed_Up: + case SettingGamepad.Button_Slow_Down: + case SettingGamepad.Button_Submit: + if (value) { + if (scene.ui) { + const cancelHandler = (success: boolean = false) : boolean => { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); + return success; + }; + scene.ui.setOverlayMode(Mode.GAMEPAD_BINDING, { + target: setting, + cancelHandler: cancelHandler, + }); + } } - } - break; - case SettingGamepad.Controller: - if (value) { - const gp = scene.inputController.getGamepadsName(); - if (scene.ui && gp) { - const cancelHandler = () => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor(Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), 0, true); - (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); + break; + case SettingGamepad.Controller: + if (value) { + const gp = scene.inputController.getGamepadsName(); + if (scene.ui && gp) { + const cancelHandler = () => { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsGamepadUiHandler).setOptionCursor(Object.values(SettingGamepad).indexOf(SettingGamepad.Controller), 0, true); + (scene.ui.getHandler() as SettingsGamepadUiHandler).updateBindings(); + return false; + }; + const changeGamepadHandler = (gamepad: string) => { + scene.inputController.setChosenGamepad(gamepad); + cancelHandler(); + return true; + }; + scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: [ ...gp.map((g: string) => ({ + label: truncateString(g, 30), // Truncate the gamepad name for display + handler: () => changeGamepadHandler(g) + })), { + label: "Cancel", + handler: cancelHandler, + }] + }); return false; - }; - const changeGamepadHandler = (gamepad: string) => { - scene.inputController.setChosenGamepad(gamepad); - cancelHandler(); - return true; - }; - scene.ui.setOverlayMode(Mode.OPTION_SELECT, { - options: [ ...gp.map((g: string) => ({ - label: truncateString(g, 30), // Truncate the gamepad name for display - handler: () => changeGamepadHandler(g) - })), { - label: "Cancel", - handler: cancelHandler, - }] - }); - return false; + } } - } - break; + break; } return true; diff --git a/src/system/settings/settings-keyboard.ts b/src/system/settings/settings-keyboard.ts index d7cb994aca8..97990f61c86 100644 --- a/src/system/settings/settings-keyboard.ts +++ b/src/system/settings/settings-keyboard.ts @@ -135,53 +135,53 @@ export const settingKeyboardBlackList = [ export function setSettingKeyboard(scene: BattleScene, setting: SettingKeyboard, value: integer): boolean { switch (setting) { - case SettingKeyboard.Button_Up: - case SettingKeyboard.Button_Down: - case SettingKeyboard.Button_Left: - case SettingKeyboard.Button_Right: - case SettingKeyboard.Button_Action: - case SettingKeyboard.Button_Cancel: - case SettingKeyboard.Button_Menu: - case SettingKeyboard.Button_Stats: - case SettingKeyboard.Button_Cycle_Shiny: - case SettingKeyboard.Button_Cycle_Form: - case SettingKeyboard.Button_Cycle_Gender: - case SettingKeyboard.Button_Cycle_Ability: - case SettingKeyboard.Button_Cycle_Nature: - case SettingKeyboard.Button_Cycle_Variant: - case SettingKeyboard.Button_Speed_Up: - case SettingKeyboard.Button_Slow_Down: - case SettingKeyboard.Alt_Button_Up: - case SettingKeyboard.Alt_Button_Down: - case SettingKeyboard.Alt_Button_Left: - case SettingKeyboard.Alt_Button_Right: - case SettingKeyboard.Alt_Button_Action: - case SettingKeyboard.Alt_Button_Cancel: - case SettingKeyboard.Alt_Button_Menu: - case SettingKeyboard.Alt_Button_Stats: - case SettingKeyboard.Alt_Button_Cycle_Shiny: - case SettingKeyboard.Alt_Button_Cycle_Form: - case SettingKeyboard.Alt_Button_Cycle_Gender: - case SettingKeyboard.Alt_Button_Cycle_Ability: - case SettingKeyboard.Alt_Button_Cycle_Nature: - case SettingKeyboard.Alt_Button_Cycle_Variant: - case SettingKeyboard.Alt_Button_Speed_Up: - case SettingKeyboard.Alt_Button_Slow_Down: - case SettingKeyboard.Alt_Button_Submit: - if (value) { - if (scene.ui) { - const cancelHandler = (success: boolean = false) : boolean => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); - return success; - }; - scene.ui.setOverlayMode(Mode.KEYBOARD_BINDING, { - target: setting, - cancelHandler: cancelHandler, - }); + case SettingKeyboard.Button_Up: + case SettingKeyboard.Button_Down: + case SettingKeyboard.Button_Left: + case SettingKeyboard.Button_Right: + case SettingKeyboard.Button_Action: + case SettingKeyboard.Button_Cancel: + case SettingKeyboard.Button_Menu: + case SettingKeyboard.Button_Stats: + case SettingKeyboard.Button_Cycle_Shiny: + case SettingKeyboard.Button_Cycle_Form: + case SettingKeyboard.Button_Cycle_Gender: + case SettingKeyboard.Button_Cycle_Ability: + case SettingKeyboard.Button_Cycle_Nature: + case SettingKeyboard.Button_Cycle_Variant: + case SettingKeyboard.Button_Speed_Up: + case SettingKeyboard.Button_Slow_Down: + case SettingKeyboard.Alt_Button_Up: + case SettingKeyboard.Alt_Button_Down: + case SettingKeyboard.Alt_Button_Left: + case SettingKeyboard.Alt_Button_Right: + case SettingKeyboard.Alt_Button_Action: + case SettingKeyboard.Alt_Button_Cancel: + case SettingKeyboard.Alt_Button_Menu: + case SettingKeyboard.Alt_Button_Stats: + case SettingKeyboard.Alt_Button_Cycle_Shiny: + case SettingKeyboard.Alt_Button_Cycle_Form: + case SettingKeyboard.Alt_Button_Cycle_Gender: + case SettingKeyboard.Alt_Button_Cycle_Ability: + case SettingKeyboard.Alt_Button_Cycle_Nature: + case SettingKeyboard.Alt_Button_Cycle_Variant: + case SettingKeyboard.Alt_Button_Speed_Up: + case SettingKeyboard.Alt_Button_Slow_Down: + case SettingKeyboard.Alt_Button_Submit: + if (value) { + if (scene.ui) { + const cancelHandler = (success: boolean = false) : boolean => { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsKeyboardUiHandler).updateBindings(); + return success; + }; + scene.ui.setOverlayMode(Mode.KEYBOARD_BINDING, { + target: setting, + cancelHandler: cancelHandler, + }); + } } - } - break; + break; // case SettingKeyboard.Default_Layout: // if (value && scene.ui) { // const cancelHandler = () => { diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts index 490ec7e183c..5fc7c37d6f5 100644 --- a/src/system/settings/settings.ts +++ b/src/system/settings/settings.ts @@ -76,16 +76,16 @@ const SHOP_CURSOR_TARGET_OPTIONS: SettingOption[] = [ const shopCursorTargetIndexMap = SHOP_CURSOR_TARGET_OPTIONS.map(option => { switch (option.value) { - case "Rewards": - return ShopCursorTarget.REWARDS; - case "Shop": - return ShopCursorTarget.SHOP; - case "Reroll": - return ShopCursorTarget.REROLL; - case "Check Team": - return ShopCursorTarget.CHECK_TEAM; - default: - throw new Error(`Unknown value: ${option.value}`); + case "Rewards": + return ShopCursorTarget.REWARDS; + case "Shop": + return ShopCursorTarget.SHOP; + case "Reroll": + return ShopCursorTarget.REROLL; + case "Check Team": + return ShopCursorTarget.CHECK_TEAM; + default: + throw new Error(`Unknown value: ${option.value}`); } }); @@ -699,230 +699,230 @@ export function setSetting(scene: BattleScene, setting: string, value: integer): return false; } switch (Setting[index].key) { - case SettingKeys.Game_Speed: - scene.gameSpeed = parseFloat(Setting[index].options[value].value.replace("x", "")); - break; - case SettingKeys.Master_Volume: - 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].value) * 0.01 : 0; - scene.updateSoundVolume(); - break; - case SettingKeys.Field_Volume: - scene.fieldVolume = 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].value) * 0.01 : 0; - scene.updateSoundVolume(); - break; - case SettingKeys.UI_Volume: - scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; - break; - case SettingKeys.Music_Preference: - scene.musicPreference = value; - break; - case SettingKeys.Damage_Numbers: - scene.damageNumbersMode = value; - break; - case SettingKeys.UI_Theme: - scene.uiTheme = value; - break; - case SettingKeys.Window_Type: - updateWindowType(scene, parseInt(Setting[index].options[value].value)); - break; - case SettingKeys.Tutorials: - scene.enableTutorials = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Move_Info: - scene.enableMoveInfo = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Enable_Retries: - scene.enableRetries = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Hide_IVs: - scene.hideIvs = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Skip_Seen_Dialogues: - scene.skipSeenDialogues = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Egg_Skip: - scene.eggSkipPreference = value; - 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) { + case SettingKeys.Game_Speed: + scene.gameSpeed = parseFloat(Setting[index].options[value].value.replace("x", "")); 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].value) { - case "Normal": - scene.moneyFormat = MoneyFormat.NORMAL; + case SettingKeys.Master_Volume: + scene.masterVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + scene.updateSoundVolume(); break; - case "Abbreviated": - scene.moneyFormat = MoneyFormat.ABBREVIATED; + case SettingKeys.BGM_Volume: + scene.bgmVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + scene.updateSoundVolume(); break; - } - scene.updateMoneyText(false); - break; - case SettingKeys.Sprite_Set: - scene.experimentalSprites = !!value; - if (value) { - scene.initExpSprites(); - } - break; - case SettingKeys.Move_Animations: - scene.moveAnimations = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Show_Moveset_Flyout: - scene.showMovesetFlyout = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Show_Arena_Flyout: - scene.showArenaFlyout = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Show_Time_Of_Day_Widget: - scene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Time_Of_Day_Animation: - 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].value === "On"; - break; - case SettingKeys.Shop_Cursor_Target: - const selectedValue = shopCursorTargetIndexMap[value]; - scene.shopCursorTarget = selectedValue; - break; - case SettingKeys.EXP_Gains_Speed: - scene.expGainsSpeed = value; - break; - case SettingKeys.EXP_Party_Display: - scene.expParty = value; - break; - case SettingKeys.HP_Bar_Speed: - scene.hpBarSpeed = value; - break; - case SettingKeys.Fusion_Palette_Swaps: - scene.fusionPaletteSwaps = !!value; - break; - case SettingKeys.Player_Gender: - if (scene.gameData) { - 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 { - return false; - } - break; - case SettingKeys.Touch_Controls: - 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].value !== "Disabled" && hasTouchscreen(); - break; - case SettingKeys.Type_Hints: - scene.typeHints = Setting[index].options[value].value === "On"; - break; - case SettingKeys.Language: - if (value) { - if (scene.ui) { - const cancelHandler = () => { - scene.ui.revertMode(); - (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(0, 0, true); - }; - const changeLocaleHandler = (locale: string): boolean => { - try { - i18next.changeLanguage(locale); - localStorage.setItem("prLang", locale); - cancelHandler(); - // Reload the whole game to apply the new locale since also some constants are translated - window.location.reload(); - return true; - } catch (error) { - console.error("Error changing locale:", error); - return false; - } - }; - scene.ui.setOverlayMode(Mode.OPTION_SELECT, { - options: [ - { - label: "English", - handler: () => changeLocaleHandler("en") - }, - { - label: "Español", - handler: () => changeLocaleHandler("es") - }, - { - label: "Italiano", - handler: () => changeLocaleHandler("it") - }, - { - label: "Français", - handler: () => changeLocaleHandler("fr") - }, - { - label: "Deutsch", - handler: () => changeLocaleHandler("de") - }, - { - label: "Português (BR)", - handler: () => changeLocaleHandler("pt-BR") - }, - { - label: "简体中文", - handler: () => changeLocaleHandler("zh-CN") - }, - { - label: "繁體中文", - handler: () => changeLocaleHandler("zh-TW") - }, - { - label: "한국어", - handler: () => changeLocaleHandler("ko") - }, - { - label: "日本語", - handler: () => changeLocaleHandler("ja") - }, - // { - // label: "Català", - // handler: () => changeLocaleHandler("ca-ES") - // }, - { - label: "עברית", - handler: () => changeLocaleHandler("he") - }, - { - label: i18next.t("settings:back"), - handler: () => cancelHandler() - } - ], - maxOptions: 7 - }); + case SettingKeys.Field_Volume: + scene.fieldVolume = 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].value) * 0.01 : 0; + scene.updateSoundVolume(); + break; + case SettingKeys.UI_Volume: + scene.uiVolume = value ? parseInt(Setting[index].options[value].value) * 0.01 : 0; + break; + case SettingKeys.Music_Preference: + scene.musicPreference = value; + break; + case SettingKeys.Damage_Numbers: + scene.damageNumbersMode = value; + break; + case SettingKeys.UI_Theme: + scene.uiTheme = value; + break; + case SettingKeys.Window_Type: + updateWindowType(scene, parseInt(Setting[index].options[value].value)); + break; + case SettingKeys.Tutorials: + scene.enableTutorials = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Move_Info: + scene.enableMoveInfo = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Enable_Retries: + scene.enableRetries = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Hide_IVs: + scene.hideIvs = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Skip_Seen_Dialogues: + scene.skipSeenDialogues = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Egg_Skip: + scene.eggSkipPreference = value; + 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].value) { + case "Normal": + scene.moneyFormat = MoneyFormat.NORMAL; + break; + case "Abbreviated": + scene.moneyFormat = MoneyFormat.ABBREVIATED; + break; + } + scene.updateMoneyText(false); + break; + case SettingKeys.Sprite_Set: + scene.experimentalSprites = !!value; + if (value) { + scene.initExpSprites(); + } + break; + case SettingKeys.Move_Animations: + scene.moveAnimations = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Show_Moveset_Flyout: + scene.showMovesetFlyout = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Show_Arena_Flyout: + scene.showArenaFlyout = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Show_Time_Of_Day_Widget: + scene.showTimeOfDayWidget = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Time_Of_Day_Animation: + 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].value === "On"; + break; + case SettingKeys.Shop_Cursor_Target: + const selectedValue = shopCursorTargetIndexMap[value]; + scene.shopCursorTarget = selectedValue; + break; + case SettingKeys.EXP_Gains_Speed: + scene.expGainsSpeed = value; + break; + case SettingKeys.EXP_Party_Display: + scene.expParty = value; + break; + case SettingKeys.HP_Bar_Speed: + scene.hpBarSpeed = value; + break; + case SettingKeys.Fusion_Palette_Swaps: + scene.fusionPaletteSwaps = !!value; + break; + case SettingKeys.Player_Gender: + if (scene.gameData) { + 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 { return false; } - } - break; - case SettingKeys.Shop_Overlay_Opacity: - scene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); - break; + break; + case SettingKeys.Touch_Controls: + 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].value !== "Disabled" && hasTouchscreen(); + break; + case SettingKeys.Type_Hints: + scene.typeHints = Setting[index].options[value].value === "On"; + break; + case SettingKeys.Language: + if (value) { + if (scene.ui) { + const cancelHandler = () => { + scene.ui.revertMode(); + (scene.ui.getHandler() as SettingsUiHandler).setOptionCursor(0, 0, true); + }; + const changeLocaleHandler = (locale: string): boolean => { + try { + i18next.changeLanguage(locale); + localStorage.setItem("prLang", locale); + cancelHandler(); + // Reload the whole game to apply the new locale since also some constants are translated + window.location.reload(); + return true; + } catch (error) { + console.error("Error changing locale:", error); + return false; + } + }; + scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: [ + { + label: "English", + handler: () => changeLocaleHandler("en") + }, + { + label: "Español (ES)", + handler: () => changeLocaleHandler("es-ES") + }, + { + label: "Italiano", + handler: () => changeLocaleHandler("it") + }, + { + label: "Français", + handler: () => changeLocaleHandler("fr") + }, + { + label: "Deutsch", + handler: () => changeLocaleHandler("de") + }, + { + label: "Português (BR)", + handler: () => changeLocaleHandler("pt-BR") + }, + { + label: "简体中文", + handler: () => changeLocaleHandler("zh-CN") + }, + { + label: "繁體中文", + handler: () => changeLocaleHandler("zh-TW") + }, + { + label: "한국어", + handler: () => changeLocaleHandler("ko") + }, + { + label: "日本語", + handler: () => changeLocaleHandler("ja") + }, + // { + // label: "Català", + // handler: () => changeLocaleHandler("ca-ES") + // }, + { + label: "עברית", + handler: () => changeLocaleHandler("he") + }, + { + label: i18next.t("settings:back"), + handler: () => cancelHandler() + } + ], + maxOptions: 7 + }); + return false; + } + } + break; + case SettingKeys.Shop_Overlay_Opacity: + scene.updateShopOverlayOpacity(parseInt(Setting[index].options[value].value) * .01); + break; } return true; diff --git a/src/system/unlockables.ts b/src/system/unlockables.ts index 983909373fd..0a666e2c755 100644 --- a/src/system/unlockables.ts +++ b/src/system/unlockables.ts @@ -10,13 +10,13 @@ export enum Unlockables { export function getUnlockableName(unlockable: Unlockables) { switch (unlockable) { - case Unlockables.ENDLESS_MODE: - return `${GameMode.getModeName(GameModes.ENDLESS)} Mode`; - case Unlockables.MINI_BLACK_HOLE: - return i18next.t("modifierType:ModifierType.MINI_BLACK_HOLE.name"); - case Unlockables.SPLICED_ENDLESS_MODE: - return `${GameMode.getModeName(GameModes.SPLICED_ENDLESS)} Mode`; - case Unlockables.EVIOLITE: - return i18next.t("modifierType:ModifierType.EVIOLITE.name"); + case Unlockables.ENDLESS_MODE: + return `${GameMode.getModeName(GameModes.ENDLESS)} Mode`; + case Unlockables.MINI_BLACK_HOLE: + return i18next.t("modifierType:ModifierType.MINI_BLACK_HOLE.name"); + case Unlockables.SPLICED_ENDLESS_MODE: + return `${GameMode.getModeName(GameModes.SPLICED_ENDLESS)} Mode`; + case Unlockables.EVIOLITE: + return i18next.t("modifierType:ModifierType.EVIOLITE.name"); } } diff --git a/src/system/version_migration/version_converter.ts b/src/system/version_migration/version_converter.ts index f93e09b7a90..e96afb5cbd4 100644 --- a/src/system/version_migration/version_converter.ts +++ b/src/system/version_migration/version_converter.ts @@ -4,6 +4,9 @@ import { version } from "../../../package.json"; // --- v1.0.4 (and below) PATCHES --- // import * as v1_0_4 from "./versions/v1_0_4"; +// --- v1.1.0 PATCHES --- // +import * as v1_1_0 from "./versions/v1_1_0"; + const LATEST_VERSION = version.split(".").map(value => parseInt(value)); /** @@ -131,6 +134,10 @@ class SessionVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.sessionMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 session data migration!"); + this.callMigrators(data, v1_1_0.sessionMigrators); + } } console.log(`Session data successfully migrated to v${version}!`); @@ -153,6 +160,10 @@ class SystemVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.systemMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 system data migraton!"); + this.callMigrators(data, v1_1_0.systemMigrators); + } } console.log(`System data successfully migrated to v${version}!`); @@ -175,6 +186,10 @@ class SettingsVersionConverter extends VersionConverter { this.callMigrators(data, v1_0_4.settingsMigrators); } } + if (curMinor <= 1) { + console.log("Applying v1.1.0 settings data migraton!"); + this.callMigrators(data, v1_1_0.settingsMigrators); + } } console.log(`System data successfully migrated to v${version}!`); diff --git a/src/system/version_migration/versions/v1_0_4.ts b/src/system/version_migration/versions/v1_0_4.ts index c20e2a281e7..f16b6bcb6bb 100644 --- a/src/system/version_migration/versions/v1_0_4.ts +++ b/src/system/version_migration/versions/v1_0_4.ts @@ -108,15 +108,15 @@ export const sessionMigrators = [ } else if (m.className === "DoubleBattleChanceBoosterModifier" && m.args.length === 1) { let maxBattles: number; switch (m.typeId) { - case "MAX_LURE": - maxBattles = 30; - break; - case "SUPER_LURE": - maxBattles = 15; - break; - default: - maxBattles = 10; - break; + case "MAX_LURE": + maxBattles = 30; + break; + case "SUPER_LURE": + maxBattles = 15; + break; + default: + maxBattles = 10; + break; } // From [ battlesLeft ] to [ maxBattles, battleCount ] diff --git a/src/system/version_migration/versions/v1_1_0.ts b/src/system/version_migration/versions/v1_1_0.ts new file mode 100644 index 00000000000..aac554c4531 --- /dev/null +++ b/src/system/version_migration/versions/v1_1_0.ts @@ -0,0 +1,32 @@ +import { SessionSaveData } from "../../game-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; + +export const systemMigrators = [] as const; + +export const settingsMigrators = [] as const; + +export const sessionMigrators = [ + /** + * Converts old Pokemon natureOverride and mysteryEncounterData + * to use the new conjoined {@linkcode Pokemon.customPokemonData} structure instead. + * @param data {@linkcode SessionSaveData} + */ + function migrateCustomPokemonDataAndNatureOverrides(data: SessionSaveData) { + // Fix Pokemon nature overrides and custom data migration + data.party.forEach(pokemon => { + if (pokemon["mysteryEncounterPokemonData"]) { + pokemon.customPokemonData = new CustomPokemonData(pokemon["mysteryEncounterPokemonData"]); + pokemon["mysteryEncounterPokemonData"] = null; + } + if (pokemon["fusionMysteryEncounterPokemonData"]) { + pokemon.fusionCustomPokemonData = new CustomPokemonData(pokemon["fusionMysteryEncounterPokemonData"]); + pokemon["fusionMysteryEncounterPokemonData"] = null; + } + pokemon.customPokemonData = pokemon.customPokemonData ?? new CustomPokemonData(); + if (pokemon["natureOverride"] && pokemon["natureOverride"] >= 0) { + pokemon.customPokemonData.nature = pokemon["natureOverride"]; + pokemon["natureOverride"] = -1; + } + }); + } +] as const; diff --git a/src/system/voucher.ts b/src/system/voucher.ts index aca7b9fc2f2..b38fd528c9f 100644 --- a/src/system/voucher.ts +++ b/src/system/voucher.ts @@ -45,41 +45,41 @@ export class Voucher { getTier(): AchvTier { switch (this.voucherType) { - case VoucherType.REGULAR: - return AchvTier.COMMON; - case VoucherType.PLUS: - return AchvTier.GREAT; - case VoucherType.PREMIUM: - return AchvTier.ULTRA; - case VoucherType.GOLDEN: - return AchvTier.ROGUE; + case VoucherType.REGULAR: + return AchvTier.COMMON; + case VoucherType.PLUS: + return AchvTier.GREAT; + case VoucherType.PREMIUM: + return AchvTier.ULTRA; + case VoucherType.GOLDEN: + return AchvTier.ROGUE; } } } export function getVoucherTypeName(voucherType: VoucherType): string { switch (voucherType) { - case VoucherType.REGULAR: - return i18next.t("voucher:eggVoucher"); - case VoucherType.PLUS: - return i18next.t("voucher:eggVoucherPlus"); - case VoucherType.PREMIUM: - return i18next.t("voucher:eggVoucherPremium"); - case VoucherType.GOLDEN: - return i18next.t("voucher:eggVoucherGold"); + case VoucherType.REGULAR: + return i18next.t("voucher:eggVoucher"); + case VoucherType.PLUS: + return i18next.t("voucher:eggVoucherPlus"); + case VoucherType.PREMIUM: + return i18next.t("voucher:eggVoucherPremium"); + case VoucherType.GOLDEN: + return i18next.t("voucher:eggVoucherGold"); } } export function getVoucherTypeIcon(voucherType: VoucherType): string { switch (voucherType) { - case VoucherType.REGULAR: - return "coupon"; - case VoucherType.PLUS: - return "pair_of_tickets"; - case VoucherType.PREMIUM: - return "mystic_ticket"; - case VoucherType.GOLDEN: - return "golden_mystic_ticket"; + case VoucherType.REGULAR: + return "coupon"; + case VoucherType.PLUS: + return "pair_of_tickets"; + case VoucherType.PREMIUM: + return "mystic_ticket"; + case VoucherType.GOLDEN: + return "golden_mystic_ticket"; } } diff --git a/src/test/abilities/early_bird.test.ts b/src/test/abilities/early_bird.test.ts new file mode 100644 index 00000000000..a69290fa1e4 --- /dev/null +++ b/src/test/abilities/early_bird.test.ts @@ -0,0 +1,93 @@ +import { Status } from "#app/data/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Early Bird", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH ]) + .ability(Abilities.EARLY_BIRD) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("reduces Rest's sleep time to 1 turn", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const player = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.BELLY_DRUM); + await game.toNextTurn(); + game.move.select(Moves.REST); + await game.toNextTurn(); + + expect(player.status?.effect).toBe(StatusEffect.SLEEP); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBe(StatusEffect.SLEEP); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBeUndefined(); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + + it("reduces 3-turn sleep to 1 turn", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const player = game.scene.getPlayerPokemon()!; + player.status = new Status(StatusEffect.SLEEP, 0, 4); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBe(StatusEffect.SLEEP); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBeUndefined(); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + + it("reduces 1-turn sleep to 0 turns", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const player = game.scene.getPlayerPokemon()!; + player.status = new Status(StatusEffect.SLEEP, 0, 2); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBeUndefined(); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); +}); diff --git a/src/test/abilities/friend_guard.test.ts b/src/test/abilities/friend_guard.test.ts new file mode 100644 index 00000000000..4ce64468c43 --- /dev/null +++ b/src/test/abilities/friend_guard.test.ts @@ -0,0 +1,120 @@ +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; +import { allAbilities } from "#app/data/ability"; +import { allMoves, MoveCategory } from "#app/data/move"; + +describe("Moves - Friend Guard", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("double") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([ Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE ]) + .enemySpecies(Species.SHUCKLE) + .moveset([ Moves.SPLASH ]) + .startingLevel(100); + }); + + it("should reduce damage that other allied Pokémon receive from attacks (from any Pokémon) by 25%", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + const [ player1, player2 ] = game.scene.getPlayerField(); + const spy = vi.spyOn(player1, "getAttackDamage"); + + const enemy1 = game.scene.getEnemyField()[0]; + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Get the last return value from `getAttackDamage` + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + // Making sure the test is controlled; turn 1 damage is equal to base damage (after rounding) + expect(turn1Damage).toBe(Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL))); + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + // Get the last return value from `getAttackDamage` + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + // With the ally's Friend Guard, damage should have been reduced from base damage by 25% + expect(turn2Damage).toBe(Math.floor(player1.getBaseDamage(enemy1, allMoves[Moves.TACKLE], MoveCategory.PHYSICAL) * 0.75)); + }); + + it("should NOT reduce damage to pokemon with friend guard", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + + const player2 = game.scene.getPlayerField()[1]; + const spy = vi.spyOn(player2, "getAttackDamage"); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn2Damage).toBe(turn1Damage); + }); + + it("should NOT reduce damage from fixed damage attacks", async () => { + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER ]); + + const [ player1, player2 ] = game.scene.getPlayerField(); + const spy = vi.spyOn(player1, "getAttackDamage"); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.DRAGON_RAGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn1Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn1Damage).toBe(40); + + vi.spyOn(player2, "getAbility").mockReturnValue(allAbilities[Abilities.FRIEND_GUARD]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.SPLASH, 1); + await game.forceEnemyMove(Moves.DRAGON_RAGE, BattlerIndex.PLAYER); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + + const turn2Damage = spy.mock.results[spy.mock.results.length - 1].value.damage; + expect(turn2Damage).toBe(40); + }); +}); diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts index b7b8e0c5cca..3445b3b322c 100644 --- a/src/test/abilities/imposter.test.ts +++ b/src/test/abilities/imposter.test.ts @@ -36,9 +36,7 @@ describe("Abilities - Imposter", () => { }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([ Species.DITTO ]); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to(TurnEndPhase); @@ -62,25 +60,24 @@ describe("Abilities - Imposter", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { game.override.enemyMoveset([ Moves.POWER_SPLIT ]); - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([ Species.DITTO ]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -97,4 +94,26 @@ describe("Abilities - Imposter", () => { expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk); expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk); }); + + it("should set each move's pp to a maximum of 5", async () => { + game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + + await game.classicMode.startBattle([ Species.DITTO ]); + const player = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TACKLE); + await game.phaseInterceptor.to(TurnEndPhase); + + player.getMoveset().forEach(move => { + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } + }); + }); }); diff --git a/src/test/abilities/infiltrator.test.ts b/src/test/abilities/infiltrator.test.ts new file mode 100644 index 00000000000..01c5cef7796 --- /dev/null +++ b/src/test/abilities/infiltrator.test.ts @@ -0,0 +1,107 @@ +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Infiltrator", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES ]) + .ability(Abilities.INFILTRATOR) + .battleType("single") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .startingLevel(100) + .enemyLevel(100); + }); + + it.each([ + { effectName: "Light Screen", tagType: ArenaTagType.LIGHT_SCREEN, move: Moves.WATER_GUN }, + { effectName: "Reflect", tagType: ArenaTagType.REFLECT, move: Moves.TACKLE }, + { effectName: "Aurora Veil", tagType: ArenaTagType.AURORA_VEIL, move: Moves.TACKLE } + ])("should bypass the target's $effectName", async ({ tagType, move }) => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + const preScreenDmg = enemy.getAttackDamage(player, allMoves[move]).damage; + + game.scene.arena.addTag(tagType, 1, Moves.NONE, enemy.id, ArenaTagSide.ENEMY, true); + + const postScreenDmg = enemy.getAttackDamage(player, allMoves[move]).damage; + + expect(postScreenDmg).toBe(preScreenDmg); + expect(player.battleData.abilitiesApplied[0]).toBe(Abilities.INFILTRATOR); + }); + + it("should bypass the target's Safeguard", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.scene.arena.addTag(ArenaTagType.SAFEGUARD, 1, Moves.NONE, enemy.id, ArenaTagSide.ENEMY, true); + + game.move.select(Moves.SPORE); + + await game.phaseInterceptor.to("BerryPhase", false); + expect(enemy.status?.effect).toBe(StatusEffect.SLEEP); + expect(player.battleData.abilitiesApplied[0]).toBe(Abilities.INFILTRATOR); + }); + + // TODO: fix this interaction to pass this test + it.skip("should bypass the target's Mist", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.scene.arena.addTag(ArenaTagType.MIST, 1, Moves.NONE, enemy.id, ArenaTagSide.ENEMY, true); + + game.move.select(Moves.BABY_DOLL_EYES); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getStatStage(Stat.ATK)).toBe(-1); + expect(player.battleData.abilitiesApplied[0]).toBe(Abilities.INFILTRATOR); + }); + + it("should bypass the target's Substitute", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + enemy.addTag(BattlerTagType.SUBSTITUTE, 1, Moves.NONE, enemy.id); + + game.move.select(Moves.BABY_DOLL_EYES); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getStatStage(Stat.ATK)).toBe(-1); + expect(player.battleData.abilitiesApplied[0]).toBe(Abilities.INFILTRATOR); + }); +}); diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts index 614f983e76e..8075eac66f2 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/src/test/abilities/magic_guard.test.ts @@ -150,7 +150,7 @@ describe("Abilities - Magic Guard", () => { const enemyPokemon = game.scene.getEnemyPokemon()!; - const toxicStartCounter = enemyPokemon.status!.turnCount; + const toxicStartCounter = enemyPokemon.status!.toxicTurnCount; //should be 0 await game.phaseInterceptor.to(TurnEndPhase); @@ -162,7 +162,7 @@ describe("Abilities - Magic Guard", () => { * - The enemy Pokemon's hypothetical CatchRateMultiplier should be 1.5 */ expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); - expect(enemyPokemon.status!.turnCount).toBeGreaterThan(toxicStartCounter); + expect(enemyPokemon.status!.toxicTurnCount).toBeGreaterThan(toxicStartCounter); expect(getStatusEffectCatchRateMultiplier(enemyPokemon.status!.effect)).toBe(1.5); } ); diff --git a/src/test/abilities/mimicry.test.ts b/src/test/abilities/mimicry.test.ts new file mode 100644 index 00000000000..4e62ddc0b76 --- /dev/null +++ b/src/test/abilities/mimicry.test.ts @@ -0,0 +1,91 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Mimicry", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.MIMICRY) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH); + }); + + it("Mimicry activates after the Pokémon with Mimicry is switched in while terrain is present, or whenever there is a change in terrain", async () => { + game.override.enemyAbility(Abilities.MISTY_SURGE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.ABRA ]); + + const [ playerPokemon1, playerPokemon2 ] = game.scene.getParty(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon1.getTypes().includes(Type.FAIRY)).toBe(true); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + expect(playerPokemon2.getTypes().includes(Type.FAIRY)).toBe(true); + }); + + it("Pokemon should revert back to its original, root type once terrain ends", async () => { + game.override + .moveset([ Moves.SPLASH, Moves.TRANSFORM ]) + .enemyAbility(Abilities.MIMICRY) + .enemyMoveset([ Moves.SPLASH, Moves.PSYCHIC_TERRAIN ]); + await game.classicMode.startBattle([ Species.REGIELEKI ]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.TRANSFORM); + await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); + await game.toNextTurn(); + expect(playerPokemon?.getTypes().includes(Type.PSYCHIC)).toBe(true); + + if (game.scene.arena.terrain) { + game.scene.arena.terrain.turnsLeft = 1; + } + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon?.getTypes().includes(Type.ELECTRIC)).toBe(true); + }); + + it("If the Pokemon is under the effect of a type-adding move and an equivalent terrain activates, the move's effect disappears", async () => { + game.override + .enemyMoveset([ Moves.FORESTS_CURSE, Moves.GRASSY_TERRAIN ]); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const playerPokemon = game.scene.getPlayerPokemon(); + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.FORESTS_CURSE); + await game.toNextTurn(); + + expect(playerPokemon?.summonData.addedType).toBe(Type.GRASS); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.GRASSY_TERRAIN); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(playerPokemon?.summonData.addedType).toBeNull(); + expect(playerPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + }); +}); diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts index 3155594c81d..ddca87496e9 100644 --- a/src/test/abilities/serene_grace.test.ts +++ b/src/test/abilities/serene_grace.test.ts @@ -57,7 +57,7 @@ describe("Abilities - Serene Grace", () => { const chance = new Utils.IntegerHolder(move.chance); console.log(move.chance + " Their ability is " + phase.getUserPokemon()!.getAbility().name); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); expect(chance.value).toBe(30); }, 20000); @@ -83,7 +83,7 @@ describe("Abilities - Serene Grace", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); expect(chance.value).toBe(60); }, 20000); diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts index a2600476d6d..63c81e9aafc 100644 --- a/src/test/abilities/sheer_force.test.ts +++ b/src/test/abilities/sheer_force.test.ts @@ -60,8 +60,8 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); expect(chance.value).toBe(0); expect(power.value).toBe(move.power * 5461 / 4096); @@ -93,8 +93,8 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); expect(chance.value).toBe(-1); expect(power.value).toBe(move.power); @@ -126,8 +126,8 @@ describe("Abilities - Sheer Force", () => { const power = new Utils.IntegerHolder(move.power); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getTarget()!, move, false, power); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + applyPreAttackAbAttrs(MovePowerBoostAbAttr, phase.getUserPokemon()!, phase.getFirstTarget()!, move, false, power); expect(chance.value).toBe(-1); expect(power.value).toBe(move.power); @@ -161,7 +161,7 @@ describe("Abilities - 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 target = phase.getFirstTarget()!; const opponentType = target.getTypes()[0]; applyAbAttrs(MoveEffectChanceMultiplierAbAttr, user, null, false, chance, move, target, false); diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts index 0f831fcf3fa..ccedf6873d7 100644 --- a/src/test/abilities/shield_dust.test.ts +++ b/src/test/abilities/shield_dust.test.ts @@ -57,8 +57,8 @@ describe("Abilities - Shield Dust", () => { expect(move.id).toBe(Moves.AIR_SLASH); const chance = new Utils.IntegerHolder(move.chance); - applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getTarget(), false); - applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getTarget()!, phase.getUserPokemon()!, null, null, false, chance); + applyAbAttrs(MoveEffectChanceMultiplierAbAttr, phase.getUserPokemon()!, null, false, chance, move, phase.getFirstTarget(), false); + applyPreDefendAbAttrs(IgnoreMoveEffectsAbAttr, phase.getFirstTarget()!, phase.getUserPokemon()!, null, null, false, chance); expect(chance.value).toBe(0); }, 20000); diff --git a/src/test/abilities/speed_boost.test.ts b/src/test/abilities/speed_boost.test.ts new file mode 100644 index 00000000000..dd2e83aaa88 --- /dev/null +++ b/src/test/abilities/speed_boost.test.ts @@ -0,0 +1,125 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { CommandPhase } from "#app/phases/command-phase"; +import { Command } from "#app/ui/command-ui-handler"; +import { AttemptRunPhase } from "#app/phases/attempt-run-phase"; + +describe("Abilities - Speed Boost", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .battleType("single") + .enemySpecies(Species.DRAGAPULT) + .ability(Abilities.SPEED_BOOST) + .enemyMoveset(Moves.SPLASH) + .moveset([ Moves.SPLASH, Moves.U_TURN ]); + }); + + it("should increase speed by 1 stage at end of turn", + async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("should not trigger this turn if pokemon was switched into combat via attack, but the turn after", + async () => { + await game.classicMode.startBattle([ + Species.SHUCKLE, + Species.NINJASK + ]); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("checking back to back swtiches", + async () => { + await game.classicMode.startBattle([ + Species.SHUCKLE, + Species.NINJASK + ]); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + let playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.U_TURN); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("should not trigger this turn if pokemon was switched into combat via normal switch, but the turn after", + async () => { + await game.classicMode.startBattle([ + Species.SHUCKLE, + Species.NINJASK + ]); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); + + it("should not trigger if pokemon fails to escape", + async () => { + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const commandPhase = game.scene.getCurrentPhase() as CommandPhase; + commandPhase.handleCommand(Command.RUN, 0); + const runPhase = game.scene.getCurrentPhase() as AttemptRunPhase; + runPhase.forceFailEscape = true; + await game.phaseInterceptor.to(AttemptRunPhase); + await game.toNextTurn(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1); + }); +}); diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts index ec82b00ec5a..4fee7653b99 100644 --- a/src/test/abilities/volt_absorb.test.ts +++ b/src/test/abilities/volt_absorb.test.ts @@ -52,6 +52,7 @@ describe("Abilities - Volt Absorb", () => { expect(playerPokemon.getTag(BattlerTagType.CHARGED)).toBeDefined(); expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase"); }); + it("should activate regardless of accuracy checks", async () => { game.override.moveset(Moves.THUNDERBOLT); game.override.enemyMoveset(Moves.SPLASH); @@ -71,6 +72,7 @@ describe("Abilities - Volt Absorb", () => { await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); }); + it("regardless of accuracy should not trigger on pokemon in semi invulnerable state", async () => { game.override.moveset(Moves.THUNDERBOLT); game.override.enemyMoveset(Moves.DIVE); @@ -84,9 +86,7 @@ describe("Abilities - Volt Absorb", () => { game.move.select(Moves.THUNDERBOLT); enemyPokemon.hp = enemyPokemon.hp - 1; await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); - await game.phaseInterceptor.to("MoveEffectPhase"); - await game.move.forceMiss(); await game.phaseInterceptor.to("BerryPhase", false); expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); }); diff --git a/src/test/abilities/wimp_out.test.ts b/src/test/abilities/wimp_out.test.ts new file mode 100644 index 00000000000..ee943befc16 --- /dev/null +++ b/src/test/abilities/wimp_out.test.ts @@ -0,0 +1,614 @@ +import { BattlerIndex } from "#app/battle"; +import { ArenaTagSide } from "#app/data/arena-tag"; +import { allMoves } from "#app/data/move"; +import GameManager from "#app/test/utils/gameManager"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import { StatusEffect } from "#enums/status-effect"; +import { WeatherType } from "#enums/weather-type"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Abilities - Wimp Out", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .ability(Abilities.WIMP_OUT) + .enemySpecies(Species.NINJASK) + .enemyPassiveAbility(Abilities.NO_GUARD) + .startingLevel(90) + .enemyLevel(70) + .moveset([ Moves.SPLASH, Moves.FALSE_SWIPE, Moves.ENDURE ]) + .enemyMoveset(Moves.FALSE_SWIPE) + .disableCrits(); + }); + + function confirmSwitch(): void { + const [ pokemon1, pokemon2 ] = game.scene.getParty(); + + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + + expect(pokemon1.species.speciesId).not.toBe(Species.WIMPOD); + + expect(pokemon2.species.speciesId).toBe(Species.WIMPOD); + expect(pokemon2.isFainted()).toBe(false); + expect(pokemon2.getHpRatio()).toBeLessThan(0.5); + } + + function confirmNoSwitch(): void { + const [ pokemon1, pokemon2 ] = game.scene.getParty(); + + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + + expect(pokemon2.species.speciesId).not.toBe(Species.WIMPOD); + + expect(pokemon1.species.speciesId).toBe(Species.WIMPOD); + expect(pokemon1.isFainted()).toBe(false); + expect(pokemon1.getHpRatio()).toBeLessThan(0.5); + } + + it("triggers regenerator passive single time when switching out with wimp out", async () => { + game.override + .passiveAbility(Abilities.REGENERATOR) + .startingLevel(5) + .enemyLevel(100); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + const wimpod = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(wimpod.hp).toEqual(Math.floor(wimpod.getMaxHp() * 0.33 + 1)); + confirmSwitch(); + }); + + it("It makes wild pokemon flee if triggered", async () => { + game.override.enemyAbility(Abilities.WIMP_OUT); + await game.classicMode.startBattle([ + Species.GOLISOPOD, + Species.TYRUNT + ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + enemyPokemon.hp *= 0.52; + + game.move.select(Moves.FALSE_SWIPE); + await game.phaseInterceptor.to("BerryPhase"); + + const isVisible = enemyPokemon.visible; + const hasFled = enemyPokemon.switchOutStatus; + expect(!isVisible && hasFled).toBe(true); + }); + + it("Does not trigger when HP already below half", async () => { + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + const wimpod = game.scene.getPlayerPokemon()!; + wimpod.hp = 5; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(wimpod.hp).toEqual(1); + confirmNoSwitch(); + }); + + it("Trapping moves do not prevent Wimp Out from activating.", async () => { + game.override + .enemyMoveset([ Moves.SPIRIT_SHACKLE ]) + .startingLevel(53) + .enemyLevel(45); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + expect(game.scene.getParty()[1].getTag(BattlerTagType.TRAPPED)).toBeUndefined(); + confirmSwitch(); + }); + + it("If this Ability activates due to being hit by U-turn or Volt Switch, the user of that move will not be switched out.", async () => { + game.override + .startingLevel(95) + .enemyMoveset([ Moves.U_TURN ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const hasFled = enemyPokemon.switchOutStatus; + expect(hasFled).toBe(false); + confirmSwitch(); + }); + + it("If this Ability does not activate due to being hit by U-turn or Volt Switch, the user of that move will be switched out.", async () => { + game.override + .startingLevel(190) + .startingWave(8) + .enemyMoveset([ Moves.U_TURN ]); + await game.classicMode.startBattle([ + Species.GOLISOPOD, + Species.TYRUNT + ]); + const RIVAL_NINJASK1 = game.scene.getEnemyPokemon()?.id; + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("BerryPhase", false); + expect(game.scene.getEnemyPokemon()?.id !== RIVAL_NINJASK1); + }); + + it("Dragon Tail and Circle Throw switch out Pokémon before the Ability activates.", async () => { + game.override + .startingLevel(69) + .enemyMoveset([ Moves.DRAGON_TAIL ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + const wimpod = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("SwitchSummonPhase", false); + + expect(wimpod.summonData.abilitiesApplied).not.toContain(Abilities.WIMP_OUT); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getPlayerPokemon()!.species.speciesId).not.toBe(Species.WIMPOD); + }); + + it("triggers when recoil damage is taken", async () => { + game.override + .moveset([ Moves.HEAD_SMASH ]) + .enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.move.select(Moves.HEAD_SMASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("It does not activate when the Pokémon cuts its own HP", async () => { + game.override + .moveset([ Moves.SUBSTITUTE ]) + .enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + const wimpod = game.scene.getPlayerPokemon()!; + wimpod.hp *= 0.52; + + game.move.select(Moves.SUBSTITUTE); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + it("Does not trigger when neutralized", async () => { + game.override + .enemyAbility(Abilities.NEUTRALIZING_GAS) + .startingLevel(5); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + it("If it falls below half and recovers back above half from a Shell Bell, Wimp Out will activate even after the Shell Bell recovery", async () => { + game.override + .moveset([ Moves.DOUBLE_EDGE ]) + .enemyMoveset([ Moves.SPLASH ]) + .startingHeldItems([ + { name: "SHELL_BELL", count: 3 }, + { name: "HEALING_CHARM", count: 5 }, + ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.75; + + game.move.select(Moves.DOUBLE_EDGE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getParty()[1].getHpRatio()).toBeGreaterThan(0.5); + expect(game.phaseInterceptor.log).toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.TYRUNT); + }); + + it("Wimp Out will activate due to weather damage", async () => { + game.override + .weather(WeatherType.HAIL) + .enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("Does not trigger when enemy has sheer force", async () => { + game.override + .enemyAbility(Abilities.SHEER_FORCE) + .enemyMoveset(Moves.SLUDGE_BOMB) + .startingLevel(95); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmNoSwitch(); + }); + + it("Wimp Out will activate due to post turn status damage", async () => { + game.override + .statusEffect(StatusEffect.POISON) + .enemyMoveset([ Moves.SPLASH ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to bad dreams", async () => { + game.override + .statusEffect(StatusEffect.SLEEP) + .enemyAbility(Abilities.BAD_DREAMS); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to leech seed", async () => { + game.override + .enemyMoveset([ Moves.LEECH_SEED ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to curse damage", async () => { + game.override + .enemySpecies(Species.DUSKNOIR) + .enemyMoveset([ Moves.CURSE ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.52; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to salt cure damage", async () => { + game.override + .enemySpecies(Species.NACLI) + .enemyMoveset([ Moves.SALT_CURE ]) + .enemyLevel(1); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.70; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Wimp Out will activate due to damaging trap damage", async () => { + game.override + .enemySpecies(Species.MAGIKARP) + .enemyMoveset([ Moves.WHIRLPOOL ]) + .enemyLevel(1); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.55; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("Magic Guard passive should not allow indirect damage to trigger Wimp Out", async () => { + game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0, ArenaTagSide.ENEMY); + game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); + game.override + .passiveAbility(Abilities.MAGIC_GUARD) + .enemyMoveset([ Moves.LEECH_SEED ]) + .weather(WeatherType.HAIL) + .statusEffect(StatusEffect.POISON); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getParty()[0].getHpRatio()).toEqual(0.51); + expect(game.phaseInterceptor.log).not.toContain("SwitchSummonPhase"); + expect(game.scene.getPlayerPokemon()!.species.speciesId).toBe(Species.WIMPOD); + }); + + it("Wimp Out activating should not cancel a double battle", async () => { + game.override + .battleType("double") + .enemyAbility(Abilities.WIMP_OUT) + .enemyMoveset([ Moves.SPLASH ]) + .enemyLevel(1); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + const enemyLeadPokemon = game.scene.getEnemyParty()[0]; + const enemySecPokemon = game.scene.getEnemyParty()[1]; + + game.move.select(Moves.FALSE_SWIPE, 0, BattlerIndex.ENEMY); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + + const isVisibleLead = enemyLeadPokemon.visible; + const hasFledLead = enemyLeadPokemon.switchOutStatus; + const isVisibleSec = enemySecPokemon.visible; + const hasFledSec = enemySecPokemon.switchOutStatus; + expect(!isVisibleLead && hasFledLead && isVisibleSec && !hasFledSec).toBe(true); + expect(enemyLeadPokemon.hp).toBeLessThan(enemyLeadPokemon.getMaxHp()); + expect(enemySecPokemon.hp).toEqual(enemySecPokemon.getMaxHp()); + }); + + it("Wimp Out will activate due to aftermath", async () => { + game.override + .moveset([ Moves.THUNDER_PUNCH ]) + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.AFTERMATH) + .enemyMoveset([ Moves.SPLASH ]) + .enemyLevel(1); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.THUNDER_PUNCH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + confirmSwitch(); + }); + + it("Activates due to entry hazards", async () => { + game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0, ArenaTagSide.ENEMY); + game.scene.arena.addTag(ArenaTagType.SPIKES, 1, Moves.SPIKES, 0, ArenaTagSide.ENEMY); + game.override + .enemySpecies(Species.CENTISKORCH) + .enemyAbility(Abilities.WIMP_OUT) + .startingWave(4); + await game.classicMode.startBattle([ + Species.TYRUNT + ]); + + expect(game.phaseInterceptor.log).not.toContain("MovePhase"); + expect(game.phaseInterceptor.log).toContain("BattleEndPhase"); + }); + + it("Wimp Out will activate due to Nightmare", async () => { + game.override + .enemyMoveset([ Moves.NIGHTMARE ]) + .statusEffect(StatusEffect.SLEEP); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + game.scene.getPlayerPokemon()!.hp *= 0.65; + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + confirmSwitch(); + }); + + it("triggers status on the wimp out user before a new pokemon is switched in", async () => { + game.override + .enemyMoveset(Moves.SLUDGE_BOMB) + .startingLevel(80); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + vi.spyOn(allMoves[Moves.SLUDGE_BOMB], "chance", "get").mockReturnValue(100); + + game.move.select(Moves.SPLASH); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.getParty()[1].status?.effect).toEqual(StatusEffect.POISON); + confirmSwitch(); + }); + + it("triggers after last hit of multi hit move", async () => { + game.override + .enemyMoveset(Moves.BULLET_SEED) + .enemyAbility(Abilities.SKILL_LINK); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(5); + confirmSwitch(); + }); + + it("triggers after last hit of multi hit move (multi lens)", async () => { + game.override + .enemyMoveset(Moves.TACKLE) + .enemyHeldItems([{ name: "MULTI_LENS", count: 1 }]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(2); + confirmSwitch(); + }); + it("triggers after last hit of Parental Bond", async () => { + game.override + .enemyMoveset(Moves.TACKLE) + .enemyAbility(Abilities.PARENTAL_BOND); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + + game.scene.getPlayerPokemon()!.hp *= 0.51; + + game.move.select(Moves.ENDURE); + game.doSelectPartyPokemon(1); + await game.phaseInterceptor.to("TurnEndPhase"); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + expect(enemyPokemon.turnData.hitsLeft).toBe(0); + expect(enemyPokemon.turnData.hitCount).toBe(2); + confirmSwitch(); + }); + + // TODO: This interaction is not implemented yet + it.todo("Wimp Out will not activate if the Pokémon's HP falls below half due to hurting itself in confusion", async () => { + game.override + .moveset([ Moves.SWORDS_DANCE ]) + .enemyMoveset([ Moves.SWAGGER ]); + await game.classicMode.startBattle([ + Species.WIMPOD, + Species.TYRUNT + ]); + const playerPokemon = game.scene.getPlayerPokemon()!; + playerPokemon.hp *= 0.51; + playerPokemon.setStatStage(Stat.ATK, 6); + playerPokemon.addTag(BattlerTagType.CONFUSED); + + // TODO: add helper function to force confusion self-hits + + while (playerPokemon.getHpRatio() > 0.49) { + game.move.select(Moves.SWORDS_DANCE); + await game.phaseInterceptor.to("TurnEndPhase"); + } + + confirmNoSwitch(); + }); +}); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index b6982896571..13e9c23a35c 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -1,8 +1,8 @@ +import { BattlerIndex } from "#app/battle"; import { allMoves } from "#app/data/move"; -import { Abilities } from "#app/enums/abilities"; -import { ArenaTagType } from "#app/enums/arena-tag-type"; -import { MoveEffectPhase } from "#app/phases/move-effect-phase"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; +import { Abilities } from "#enums/abilities"; +import { ArenaTagType } from "#enums/arena-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; @@ -31,7 +31,8 @@ describe("Arena - Gravity", () => { .ability(Abilities.UNNERVE) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) - .enemyMoveset(Moves.SPLASH); + .enemyMoveset(Moves.SPLASH) + .enemyLevel(5); }); // Reference: https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) @@ -42,102 +43,121 @@ describe("Arena - Gravity", () => { vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([ Species.PIKACHU ]); game.move.select(Moves.GRAVITY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); // Use non-OHKO move on second turn await game.toNextTurn(); game.move.select(Moves.TACKLE); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to("MoveEffectPhase"); - expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(100 * 1.67); + expect(moveToCheck.calculateBattleAccuracy).toHaveLastReturnedWith(100 * 1.67); }); it("OHKO move accuracy is not affected", async () => { - game.override.startingLevel(5); - game.override.enemyLevel(5); - /** See Fissure {@link https://bulbapedia.bulbagarden.net/wiki/Fissure_(move)} */ const moveToCheck = allMoves[Moves.FISSURE]; vi.spyOn(moveToCheck, "calculateBattleAccuracy"); // Setup Gravity on first turn - await game.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([ Species.PIKACHU ]); game.move.select(Moves.GRAVITY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); // Use OHKO move on second turn await game.toNextTurn(); game.move.select(Moves.FISSURE); - await game.phaseInterceptor.to(MoveEffectPhase); + await game.phaseInterceptor.to("MoveEffectPhase"); - expect(moveToCheck.calculateBattleAccuracy).toHaveReturnedWith(30); + expect(moveToCheck.calculateBattleAccuracy).toHaveLastReturnedWith(30); }); describe("Against flying types", () => { it("can be hit by ground-type moves now", async () => { game.override - .startingLevel(5) - .enemyLevel(5) .enemySpecies(Species.PIDGEOT) .moveset([ Moves.GRAVITY, Moves.EARTHQUAKE ]); - await game.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([ Species.PIKACHU ]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); // Try earthquake on 1st turn (fails!); game.move.select(Moves.EARTHQUAKE); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(0); + expect(pidgeot.getAttackTypeEffectiveness).toHaveLastReturnedWith(0); // Setup Gravity on 2nd turn await game.toNextTurn(); game.move.select(Moves.GRAVITY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); // Use ground move on 3rd turn await game.toNextTurn(); game.move.select(Moves.EARTHQUAKE); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(1); + expect(pidgeot.getAttackTypeEffectiveness).toHaveLastReturnedWith(1); }); it("keeps super-effective moves super-effective after using gravity", async () => { game.override - .startingLevel(5) - .enemyLevel(5) .enemySpecies(Species.PIDGEOT) .moveset([ Moves.GRAVITY, Moves.THUNDERBOLT ]); - await game.startBattle([ Species.PIKACHU ]); + await game.classicMode.startBattle([ Species.PIKACHU ]); const pidgeot = game.scene.getEnemyPokemon()!; vi.spyOn(pidgeot, "getAttackTypeEffectiveness"); // Setup Gravity on 1st turn game.move.select(Moves.GRAVITY); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(game.scene.arena.getTag(ArenaTagType.GRAVITY)).toBeDefined(); // Use electric move on 2nd turn await game.toNextTurn(); game.move.select(Moves.THUNDERBOLT); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); - expect(pidgeot.getAttackTypeEffectiveness).toHaveReturnedWith(2); + expect(pidgeot.getAttackTypeEffectiveness).toHaveLastReturnedWith(2); }); }); + + it("cancels Fly if its user is semi-invulnerable", async () => { + game.override + .enemySpecies(Species.SNORLAX) + .enemyMoveset(Moves.FLY) + .moveset([ Moves.GRAVITY, Moves.SPLASH ]); + + await game.classicMode.startBattle([ Species.CHARIZARD ]); + + const charizard = game.scene.getPlayerPokemon()!; + const snorlax = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.toNextTurn(); + expect(snorlax.getTag(BattlerTagType.FLYING)).toBeDefined(); + + game.move.select(Moves.GRAVITY); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to("MoveEffectPhase"); + expect(snorlax.getTag(BattlerTagType.INTERRUPTED)).toBeDefined(); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(charizard.hp).toBe(charizard.getMaxHp()); + }); }); diff --git a/src/test/data/status-effect.test.ts b/src/test/data/status-effect.test.ts index bca3bd21c70..1b1a97fc51f 100644 --- a/src/test/data/status-effect.test.ts +++ b/src/test/data/status-effect.test.ts @@ -1,4 +1,5 @@ import { + Status, StatusEffect, getStatusEffectActivationText, getStatusEffectDescriptor, @@ -6,14 +7,19 @@ import { getStatusEffectObtainText, getStatusEffectOverlapText, } from "#app/data/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; import { mockI18next } from "#test/utils/testUtils"; import i18next from "i18next"; -import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const pokemonName = "PKM"; const sourceText = "SOURCE"; -describe("status-effect", () => { +describe("Status Effect Messages", () => { beforeAll(() => { i18next.init(); }); @@ -299,3 +305,99 @@ describe("status-effect", () => { vi.resetAllMocks(); }); }); + +describe("Status Effects", () => { + describe("Paralysis", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override + .enemySpecies(Species.MAGIKARP) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .moveset([ Moves.QUICK_ATTACK ]) + .ability(Abilities.BALL_FETCH) + .statusEffect(StatusEffect.PARALYSIS); + }); + + it("causes the pokemon's move to fail when activated", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.QUICK_ATTACK); + await game.move.forceStatusActivation(true); + await game.toNextTurn(); + + expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(true); + expect(game.scene.getPlayerPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + }); + }); + + describe("Sleep", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should last the appropriate number of turns", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const player = game.scene.getPlayerPokemon()!; + player.status = new Status(StatusEffect.SLEEP, 0, 4); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status.effect).toBe(StatusEffect.SLEEP); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status.effect).toBe(StatusEffect.SLEEP); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status.effect).toBe(StatusEffect.SLEEP); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(player.status?.effect).toBeUndefined(); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + }); +}); diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts index 6f57af63e6b..aebb196ff5e 100644 --- a/src/test/eggs/egg.test.ts +++ b/src/test/eggs/egg.test.ts @@ -1,4 +1,7 @@ -import { Egg, getLegendaryGachaSpeciesForTimestamp } from "#app/data/egg"; +import { speciesEggTiers } from "#app/data/balance/species-egg-tiers"; +import { speciesStarterCosts } from "#app/data/balance/starters"; +import { Egg, getLegendaryGachaSpeciesForTimestamp, getValidLegendaryGachaSpecies } from "#app/data/egg"; +import { allSpecies } from "#app/data/pokemon-species"; import { EggSourceType } from "#app/enums/egg-source-types"; import { EggTier } from "#app/enums/egg-type"; import { VariantTier } from "#app/enums/variant-tier"; @@ -64,6 +67,12 @@ describe("Egg Generation Tests", () => { expect(gachaSpeciesCount).toBeGreaterThan(0.4 * EGG_HATCH_COUNT); expect(gachaSpeciesCount).toBeLessThan(0.6 * EGG_HATCH_COUNT); }); + it("should never be allowed to generate Eternatus via the legendary gacha", () => { + const validLegendaryGachaSpecies = getValidLegendaryGachaSpecies(); + expect(validLegendaryGachaSpecies.every(s => speciesEggTiers[s] === EggTier.LEGENDARY)).toBe(true); + expect(validLegendaryGachaSpecies.every(s => allSpecies[s].isObtainable())).toBe(true); + expect(validLegendaryGachaSpecies.includes(Species.ETERNATUS)).toBe(false); + }); it("should hatch an Arceus. Set from species", () => { const scene = game.scene; const expectedSpecies = Species.ARCEUS; @@ -376,4 +385,23 @@ describe("Egg Generation Tests", () => { expect(diffShiny).toBe(true); expect(diffAbility).toBe(true); }); + + // For now, we are using this test to detect oversights in egg tiers. + // Delete this test if the balance team rebalances species costs independently of egg tiers. + it("should have correct egg tiers based on species costs", () => { + const getExpectedEggTier = (starterCost) => + starterCost <= 3 ? EggTier.COMMON + : starterCost <= 5 ? EggTier.RARE + : starterCost <= 7 ? EggTier.EPIC + : EggTier.LEGENDARY; + + allSpecies.forEach(pokemonSpecies => { + const rootSpecies = pokemonSpecies.getRootSpeciesId(); + const speciesCost = speciesStarterCosts[rootSpecies]; + const expectedEggTier = getExpectedEggTier(speciesCost); + const actualEggTier = speciesEggTiers[rootSpecies]; + + expect(actualEggTier).toBe(expectedEggTier); + }); + }); }); diff --git a/src/test/items/toxic_orb.test.ts b/src/test/items/toxic_orb.test.ts index 63c7b6245f5..583e302126c 100644 --- a/src/test/items/toxic_orb.test.ts +++ b/src/test/items/toxic_orb.test.ts @@ -7,8 +7,6 @@ import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -const TIMEOUT = 20 * 1000; - describe("Items - Toxic orb", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -27,10 +25,10 @@ describe("Items - Toxic orb", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .enemySpecies(Species.RATTATA) + .enemySpecies(Species.MAGIKARP) .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) - .moveset([ Moves.SPLASH ]) + .moveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH) .startingHeldItems([{ name: "TOXIC_ORB", @@ -39,22 +37,19 @@ describe("Items - Toxic orb", () => { vi.spyOn(i18next, "t"); }); - it("badly poisons the holder", async () => { - await game.classicMode.startBattle([ Species.MIGHTYENA ]); + it("should badly poison the holder", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); - const player = game.scene.getPlayerField()[0]; + const player = game.scene.getPlayerPokemon()!; + expect(player.getHeldItems()[0].type.id).toBe("TOXIC_ORB"); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("TurnEndPhase"); - // Toxic orb should trigger here - await game.phaseInterceptor.run("MessagePhase"); + await game.phaseInterceptor.to("MessagePhase"); expect(i18next.t).toHaveBeenCalledWith("statusEffect:toxic.obtainSource", expect.anything()); - await game.toNextTurn(); - expect(player.status?.effect).toBe(StatusEffect.TOXIC); - // Damage should not have ticked yet. - expect(player.status?.turnCount).toBe(0); - }, TIMEOUT); + expect(player.status?.toxicTurnCount).toBe(0); + }); }); diff --git a/src/test/moves/aurora_veil.test.ts b/src/test/moves/aurora_veil.test.ts index 243ba3a3269..e68117a2f59 100644 --- a/src/test/moves/aurora_veil.test.ts +++ b/src/test/moves/aurora_veil.test.ts @@ -111,7 +111,7 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = 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, false, move.category, multiplierHolder); + defender.scene.arena.applyTagsForSide(ArenaTagType.AURORA_VEIL, side, false, attacker, move.category, multiplierHolder); } return move.power * multiplierHolder.value; diff --git a/src/test/moves/baton_pass.test.ts b/src/test/moves/baton_pass.test.ts index 5e6e4be21ba..9d4a9358715 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/src/test/moves/baton_pass.test.ts @@ -34,7 +34,7 @@ describe("Moves - Baton Pass", () => { .disableCrits(); }); - it("transfers all stat stages when player uses it", async() => { + it("transfers all stat stages when player uses it", async () => { // arrange await game.classicMode.startBattle([ Species.RAICHU, Species.SHUCKLE ]); @@ -91,7 +91,7 @@ describe("Moves - Baton Pass", () => { ]); }, 20000); - it("doesn't transfer effects that aren't transferrable", async() => { + it("doesn't transfer effects that aren't transferrable", async () => { game.override.enemyMoveset([ Moves.SALT_CURE ]); await game.classicMode.startBattle([ Species.PIKACHU, Species.FEEBAS ]); @@ -106,4 +106,28 @@ describe("Moves - Baton Pass", () => { expect(player2.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined(); }, 20000); + + it("doesn't allow binding effects from the user to persist", async () => { + game.override.moveset([ Moves.FIRE_SPIN, Moves.BATON_PASS ]); + + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FIRE_SPIN); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceHit(); + + await game.toNextTurn(); + + expect(enemy.getTag(BattlerTagType.FIRE_SPIN)).toBeDefined(); + + game.move.select(Moves.BATON_PASS); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + game.doSelectPartyPokemon(1); + await game.toNextTurn(); + + expect(enemy.getTag(BattlerTagType.FIRE_SPIN)).toBeUndefined(); + }); }); diff --git a/src/test/moves/camouflage.test.ts b/src/test/moves/camouflage.test.ts new file mode 100644 index 00000000000..acf37635c47 --- /dev/null +++ b/src/test/moves/camouflage.test.ts @@ -0,0 +1,49 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { TerrainType } from "#app/data/terrain"; +import { Type } from "#app/data/type"; +import { BattlerIndex } from "#app/battle"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Camouflage", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.CAMOUFLAGE ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.REGIELEKI) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.PSYCHIC_TERRAIN); + }); + + it("Camouflage should look at terrain first when selecting a type to change into", async () => { + await game.classicMode.startBattle([ Species.SHUCKLE ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.CAMOUFLAGE); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + await game.phaseInterceptor.to("BerryPhase"); + expect(game.scene.arena.getTerrainType()).toBe(TerrainType.PSYCHIC); + const pokemonType = playerPokemon.getTypes()[0]; + expect(pokemonType).toBe(Type.PSYCHIC); + }); +}); diff --git a/src/test/moves/chloroblast.test.ts b/src/test/moves/chloroblast.test.ts new file mode 100644 index 00000000000..5e55bf46958 --- /dev/null +++ b/src/test/moves/chloroblast.test.ts @@ -0,0 +1,42 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Chloroblast", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.CHLOROBLAST ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.PROTECT); + }); + + it("should not deal recoil damage if the opponent uses protect", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + game.move.select(Moves.CHLOROBLAST); + await game.phaseInterceptor.to("BerryPhase"); + + expect(game.scene.getPlayerPokemon()!.isFullHp()).toBe(true); + }); +}); diff --git a/src/test/moves/dig.test.ts b/src/test/moves/dig.test.ts new file mode 100644 index 00000000000..4c6b5d3b75d --- /dev/null +++ b/src/test/moves/dig.test.ts @@ -0,0 +1,114 @@ +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { describe, beforeAll, afterEach, beforeEach, it, expect } from "vitest"; +import GameManager from "#test/utils/gameManager"; + +describe("Moves - Dig", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.DIG) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should make the user semi-invulnerable, then attack over 2 turns", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIG); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERGROUND)).toBeDefined(); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveQueue()[0].move).toBe(Moves.DIG); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERGROUND)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + + const playerDig = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.DIG); + expect(playerDig?.ppUsed).toBe(1); + }); + + it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { + game.override.enemyAbility(Abilities.NO_GUARD); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIG); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should not expend PP when the attack phase is cancelled", async () => { + game.override + .enemyAbility(Abilities.NO_GUARD) + .enemyMoveset(Moves.SPORE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DIG); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERGROUND)).toBeUndefined(); + expect(playerPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + const playerDig = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.DIG); + expect(playerDig?.ppUsed).toBe(0); + }); + + it("should cause the user to take double damage from Earthquake", async () => { + await game.classicMode.startBattle([ Species.DONDOZO ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + const preDigEarthquakeDmg = playerPokemon.getAttackDamage(enemyPokemon, allMoves[Moves.EARTHQUAKE]).damage; + + game.move.select(Moves.DIG); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + + await game.phaseInterceptor.to("MoveEffectPhase"); + + const postDigEarthquakeDmg = playerPokemon.getAttackDamage(enemyPokemon, allMoves[Moves.EARTHQUAKE]).damage; + // these hopefully get avoid rounding errors :shrug: + expect(postDigEarthquakeDmg).toBeGreaterThanOrEqual(2 * preDigEarthquakeDmg); + expect(postDigEarthquakeDmg).toBeLessThan(2 * (preDigEarthquakeDmg + 1)); + }); +}); diff --git a/src/test/moves/dive.test.ts b/src/test/moves/dive.test.ts new file mode 100644 index 00000000000..b60416d7740 --- /dev/null +++ b/src/test/moves/dive.test.ts @@ -0,0 +1,137 @@ +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatusEffect } from "#enums/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; +import { WeatherType } from "#enums/weather-type"; + +describe("Moves - Dive", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.DIVE) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + }); + + it("should make the user semi-invulnerable, then attack over 2 turns", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERWATER)).toBeDefined(); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveQueue()[0].move).toBe(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERWATER)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + + const playerDive = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.DIVE); + expect(playerDive?.ppUsed).toBe(1); + }); + + it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { + game.override.enemyAbility(Abilities.NO_GUARD); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should not expend PP when the attack phase is cancelled", async () => { + game.override + .enemyAbility(Abilities.NO_GUARD) + .enemyMoveset(Moves.SPORE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.UNDERWATER)).toBeUndefined(); + expect(playerPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + const playerDive = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.DIVE); + expect(playerDive?.ppUsed).toBe(0); + }); + + it("should trigger on-contact post-defend ability effects", async () => { + game.override + .enemyAbility(Abilities.ROUGH_SKIN) + .enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.battleData.abilitiesApplied[0]).toBe(Abilities.ROUGH_SKIN); + }); + + it("should cancel attack after Harsh Sunlight is set", async () => { + game.override.enemyMoveset(Moves.SPLASH); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.DIVE); + + await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnStartPhase", false); + game.scene.arena.trySetWeather(WeatherType.HARSH_SUN, false); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getTag(BattlerTagType.UNDERWATER)).toBeUndefined(); + + const playerDive = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.DIVE); + expect(playerDive?.ppUsed).toBe(1); + }); +}); diff --git a/src/test/moves/dynamax_cannon.test.ts b/src/test/moves/dynamax_cannon.test.ts index 9dd48d3c94c..001f986bd52 100644 --- a/src/test/moves/dynamax_cannon.test.ts +++ b/src/test/moves/dynamax_cannon.test.ts @@ -81,7 +81,7 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); await game.phaseInterceptor.to(DamagePhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(120); }, 20000); @@ -98,7 +98,7 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); await game.phaseInterceptor.to(DamagePhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(140); }, 20000); @@ -115,7 +115,7 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); await game.phaseInterceptor.to(DamagePhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(160); }, 20000); @@ -132,7 +132,7 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); await game.phaseInterceptor.to(DamagePhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(180); }, 20000); @@ -149,7 +149,7 @@ describe("Moves - Dynamax Cannon", () => { const phase = game.scene.getCurrentPhase() as MoveEffectPhase; expect(phase.move.moveId).toBe(dynamaxCannon.id); // Force level cap to be 100 - vi.spyOn(phase.getTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); + vi.spyOn(phase.getFirstTarget()!.scene, "getMaxExpLevel").mockReturnValue(100); await game.phaseInterceptor.to(DamagePhase, false); expect(dynamaxCannon.calculateBattlePower).toHaveLastReturnedWith(200); }, 20000); diff --git a/src/test/moves/electro_shot.test.ts b/src/test/moves/electro_shot.test.ts new file mode 100644 index 00000000000..1373b4941eb --- /dev/null +++ b/src/test/moves/electro_shot.test.ts @@ -0,0 +1,104 @@ +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Stat } from "#enums/stat"; +import { WeatherType } from "#enums/weather-type"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Electro Shot", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.ELECTRO_SHOT) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should increase the user's Sp. Atk on the first turn, then attack on the second turn", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ELECTRO_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeDefined(); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.OTHER); + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerElectroShot = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.ELECTRO_SHOT); + expect(playerElectroShot?.ppUsed).toBe(1); + }); + + it.each([ + { weatherType: WeatherType.RAIN, name: "Rain" }, + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + ])("should fully resolve in one turn if $name is active", async ({ weatherType }) => { + game.override.weather(weatherType); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.ELECTRO_SHOT); + + await game.phaseInterceptor.to("MoveEffectPhase", false); + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerElectroShot = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.ELECTRO_SHOT); + expect(playerElectroShot?.ppUsed).toBe(1); + }); + + it("should only increase Sp. Atk once with Multi-Lens", async () => { + game.override + .weather(WeatherType.RAIN) + .startingHeldItems([{ name: "MULTI_LENS", count: 1 }]); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.ELECTRO_SHOT); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(playerPokemon.turnData.hitCount).toBe(2); + expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1); + }); +}); diff --git a/src/test/moves/fly.test.ts b/src/test/moves/fly.test.ts new file mode 100644 index 00000000000..6ae758fe3dc --- /dev/null +++ b/src/test/moves/fly.test.ts @@ -0,0 +1,122 @@ +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatusEffect } from "#enums/status-effect"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; +import { BattlerIndex } from "#app/battle"; +import { allMoves } from "#app/data/move"; + +describe("Moves - Fly", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.FLY) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.TACKLE); + + vi.spyOn(allMoves[Moves.FLY], "accuracy", "get").mockReturnValue(100); + }); + + it("should make the user semi-invulnerable, then attack over 2 turns", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FLY); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.FLYING)).toBeDefined(); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); + expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp()); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveQueue()[0].move).toBe(Moves.FLY); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.FLYING)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + + const playerFly = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.FLY); + expect(playerFly?.ppUsed).toBe(1); + }); + + it("should not allow the user to evade attacks from Pokemon with No Guard", async () => { + game.override.enemyAbility(Abilities.NO_GUARD); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FLY); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.hp).toBeLessThan(playerPokemon.getMaxHp()); + expect(enemyPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + }); + + it("should not expend PP when the attack phase is cancelled", async () => { + game.override + .enemyAbility(Abilities.NO_GUARD) + .enemyMoveset(Moves.SPORE); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.FLY); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.FLYING)).toBeUndefined(); + expect(playerPokemon.status?.effect).toBe(StatusEffect.SLEEP); + + const playerFly = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.FLY); + expect(playerFly?.ppUsed).toBe(0); + }); + + it("should be cancelled when another Pokemon uses Gravity", async () => { + game.override.enemyMoveset([ Moves.SPLASH, Moves.GRAVITY ]); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.FLY); + + await game.forceEnemyMove(Moves.SPLASH); + + await game.toNextTurn(); + await game.forceEnemyMove(Moves.GRAVITY); + await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + + const playerFly = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.FLY); + expect(playerFly?.ppUsed).toBe(0); + }); +}); diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts index 386eb2537ee..352e3b60aa4 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/src/test/moves/focus_punch.test.ts @@ -59,7 +59,7 @@ describe("Moves - Focus Punch", () => { expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp); expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.damageDealt).toBe(enemyStartingHp - enemyPokemon.hp); + expect(leadPokemon.turnData.totalDamageDealt).toBe(enemyStartingHp - enemyPokemon.hp); } ); @@ -86,7 +86,7 @@ describe("Moves - Focus Punch", () => { expect(enemyPokemon.hp).toBe(enemyStartingHp); expect(leadPokemon.getMoveHistory().length).toBe(1); - expect(leadPokemon.turnData.damageDealt).toBe(0); + expect(leadPokemon.turnData.totalDamageDealt).toBe(0); } ); diff --git a/src/test/moves/forests_curse.test.ts b/src/test/moves/forests_curse.test.ts new file mode 100644 index 00000000000..c49bdab5255 --- /dev/null +++ b/src/test/moves/forests_curse.test.ts @@ -0,0 +1,47 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Forest's Curse", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("will replace the added type from Trick Or Treat", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon!.summonData.addedType).toBe(Type.GHOST); + + game.move.select(Moves.FORESTS_CURSE); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon?.summonData.addedType).toBe(Type.GRASS); + }); +}); diff --git a/src/test/moves/geomancy.test.ts b/src/test/moves/geomancy.test.ts new file mode 100644 index 00000000000..6e2f40b9144 --- /dev/null +++ b/src/test/moves/geomancy.test.ts @@ -0,0 +1,78 @@ +import { EffectiveStat, Stat } from "#enums/stat"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Geomancy", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.GEOMANCY) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should boost the user's stats on the second turn of use", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + + game.move.select(Moves.GEOMANCY); + + await game.phaseInterceptor.to("TurnEndPhase"); + affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(0)); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.OTHER); + + await game.phaseInterceptor.to("TurnEndPhase"); + affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + expect(player.getMoveHistory()).toHaveLength(2); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + expect(playerGeomancy?.ppUsed).toBe(1); + }); + + it("should execute over 2 turns between waves", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const player = game.scene.getPlayerPokemon()!; + const affectedStats: EffectiveStat[] = [ Stat.SPATK, Stat.SPDEF, Stat.SPD ]; + + game.move.select(Moves.GEOMANCY); + + await game.phaseInterceptor.to("MoveEndPhase", false); + await game.doKillOpponents(); + + await game.toNextWave(); + + await game.phaseInterceptor.to("TurnEndPhase"); + affectedStats.forEach((stat) => expect(player.getStatStage(stat)).toBe(2)); + expect(player.getMoveHistory()).toHaveLength(2); + expect(player.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerGeomancy = player.getMoveset().find((mv) => mv && mv.moveId === Moves.GEOMANCY); + expect(playerGeomancy?.ppUsed).toBe(1); + }); +}); diff --git a/src/test/moves/light_screen.test.ts b/src/test/moves/light_screen.test.ts index 11b8144bb4e..af14d9273e6 100644 --- a/src/test/moves/light_screen.test.ts +++ b/src/test/moves/light_screen.test.ts @@ -94,7 +94,7 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = 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, false, move.category, multiplierHolder); + defender.scene.arena.applyTagsForSide(ArenaTagType.LIGHT_SCREEN, side, false, attacker, move.category, multiplierHolder); } return move.power * multiplierHolder.value; diff --git a/src/test/moves/mist.test.ts b/src/test/moves/mist.test.ts new file mode 100644 index 00000000000..cd338f79412 --- /dev/null +++ b/src/test/moves/mist.test.ts @@ -0,0 +1,49 @@ +import { Stat } from "#enums/stat"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Mist", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.MIST, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .battleType("double") + .disableCrits() + .enemySpecies(Species.SNORLAX) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.GROWL); + }); + + it("should prevent the user's side from having stats lowered", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP, Species.FEEBAS ]); + + const playerPokemon = game.scene.getPlayerField(); + + game.move.select(Moves.MIST, 0); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("BerryPhase"); + + playerPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0)); + }); + + it.todo("should be ignored by opponents with Infiltrator"); +}); diff --git a/src/test/moves/nightmare.test.ts b/src/test/moves/nightmare.test.ts new file mode 100644 index 00000000000..f4c485ff1b4 --- /dev/null +++ b/src/test/moves/nightmare.test.ts @@ -0,0 +1,52 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Nightmare", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + + game.override.battleType("single") + .enemySpecies(Species.RATTATA) + .enemyMoveset(Moves.SPLASH) + .enemyAbility(Abilities.BALL_FETCH) + .enemyStatusEffect(StatusEffect.SLEEP) + .startingLevel(5) + .moveset([ Moves.NIGHTMARE, Moves.SPLASH ]); + }); + + it("lowers enemy hp by 1/4 each turn while asleep", async () => { + await game.classicMode.startBattle([ Species.HYPNO ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + const enemyMaxHP = enemyPokemon.hp; + + game.move.select(Moves.NIGHTMARE); + await game.toNextTurn(); + + expect(enemyPokemon.hp).toBe(enemyMaxHP - Math.floor(enemyMaxHP / 4)); + + // take a second turn to make sure damage occurs again + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(enemyPokemon.hp).toBe(enemyMaxHP - Math.floor(enemyMaxHP / 4) - Math.floor(enemyMaxHP / 4)); + }); +}); diff --git a/src/test/moves/reflect.test.ts b/src/test/moves/reflect.test.ts index b18b2423895..3bf415ea75c 100644 --- a/src/test/moves/reflect.test.ts +++ b/src/test/moves/reflect.test.ts @@ -94,7 +94,7 @@ const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) = const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY; if (defender.scene.arena.getTagOnSide(ArenaTagType.REFLECT, side)) { - defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, move.category, multiplierHolder); + defender.scene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder); } return move.power * multiplierHolder.value; diff --git a/src/test/moves/reflect_type.test.ts b/src/test/moves/reflect_type.test.ts new file mode 100644 index 00000000000..0e47d4b00fc --- /dev/null +++ b/src/test/moves/reflect_type.test.ts @@ -0,0 +1,59 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Reflect Type", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemyAbility(Abilities.BALL_FETCH); + }); + + it("will make the user Normal/Grass if targetting a typeless Pokemon affected by Forest's Curse", async () => { + game.override + .moveset([ Moves.FORESTS_CURSE, Moves.REFLECT_TYPE ]) + .startingLevel(60) + .enemySpecies(Species.CHARMANDER) + .enemyMoveset([ Moves.BURN_UP, Moves.SPLASH ]); + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const playerPokemon = game.scene.getPlayerPokemon(); + const enemyPokemon = game.scene.getEnemyPokemon(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.BURN_UP); + await game.toNextTurn(); + + game.move.select(Moves.FORESTS_CURSE); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(enemyPokemon?.getTypes().includes(Type.UNKNOWN)).toBe(true); + expect(enemyPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + + game.move.select(Moves.REFLECT_TYPE); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon?.getTypes()[0]).toBe(Type.NORMAL); + expect(playerPokemon?.getTypes().includes(Type.GRASS)).toBe(true); + }); +}); diff --git a/src/test/moves/secret_power.test.ts b/src/test/moves/secret_power.test.ts index ff0b5ae8c24..09fe5faa50b 100644 --- a/src/test/moves/secret_power.test.ts +++ b/src/test/moves/secret_power.test.ts @@ -2,7 +2,7 @@ import { Abilities } from "#enums/abilities"; import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; -import { allMoves, SecretPowerAttr } from "#app/data/move"; +import { allMoves } from "#app/data/move"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; @@ -11,6 +11,7 @@ import { StatusEffect } from "#enums/status-effect"; import { BattlerIndex } from "#app/battle"; import { ArenaTagType } from "#enums/arena-tag-type"; import { ArenaTagSide } from "#app/data/arena-tag"; +import { allAbilities, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability"; describe("Moves - Secret Power", () => { let phaserGame: Phaser.Game; @@ -60,30 +61,38 @@ describe("Moves - Secret Power", () => { expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1); }); - it("the 'rainbow' effect of fire+water pledge does not double the chance of secret power's secondary effect", + it("Secret Power's effect chance is doubled by Serene Grace, but not by the 'rainbow' effect from Fire/Water Pledge", async () => { game.override .moveset([ Moves.FIRE_PLEDGE, Moves.WATER_PLEDGE, Moves.SECRET_POWER, Moves.SPLASH ]) + .ability(Abilities.SERENE_GRACE) .enemyMoveset([ Moves.SPLASH ]) .battleType("double"); await game.classicMode.startBattle([ Species.BLASTOISE, Species.CHARIZARD ]); - const secretPowerAttr = allMoves[Moves.SECRET_POWER].getAttrs(SecretPowerAttr)[0]; - vi.spyOn(secretPowerAttr, "getMoveChance"); + const sereneGraceAttr = allAbilities[Abilities.SERENE_GRACE].getAttrs(MoveEffectChanceMultiplierAbAttr)[0]; + vi.spyOn(sereneGraceAttr, "apply"); game.move.select(Moves.WATER_PLEDGE, 0, BattlerIndex.ENEMY); game.move.select(Moves.FIRE_PLEDGE, 1, BattlerIndex.ENEMY_2); await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined(); + let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER); + expect(rainbowEffect).toBeDefined(); + + rainbowEffect = rainbowEffect!; + vi.spyOn(rainbowEffect, "apply"); game.move.select(Moves.SECRET_POWER, 0, BattlerIndex.ENEMY); game.move.select(Moves.SPLASH, 1); await game.phaseInterceptor.to("BerryPhase", false); - expect(secretPowerAttr.getMoveChance).toHaveLastReturnedWith(30); + expect(sereneGraceAttr.apply).toHaveBeenCalledOnce(); + expect(sereneGraceAttr.apply).toHaveLastReturnedWith(true); + + expect(rainbowEffect.apply).toHaveBeenCalledTimes(0); } ); }); diff --git a/src/test/moves/shed_tail.test.ts b/src/test/moves/shed_tail.test.ts index c4df6c574cb..4d761a8af24 100644 --- a/src/test/moves/shed_tail.test.ts +++ b/src/test/moves/shed_tail.test.ts @@ -1,4 +1,5 @@ import { SubstituteTag } from "#app/data/battler-tags"; +import { MoveResult } from "#app/field/pokemon"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; @@ -53,4 +54,18 @@ describe("Moves - Shed Tail", () => { expect(substituteTag).toBeDefined(); expect(substituteTag?.hp).toBe(Math.floor(magikarp.getMaxHp() / 4)); }); + + it("should fail if no ally is available to switch in", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const magikarp = game.scene.getPlayerPokemon()!; + expect(game.scene.getParty().length).toBe(1); + + game.move.select(Moves.SHED_TAIL); + + await game.phaseInterceptor.to("TurnEndPhase", false); + + expect(magikarp.isOnField()).toBeTruthy(); + expect(magikarp.getLastXMoves()[0].result).toBe(MoveResult.FAIL); + }); }); diff --git a/src/test/moves/solar_beam.test.ts b/src/test/moves/solar_beam.test.ts new file mode 100644 index 00000000000..ebec338932a --- /dev/null +++ b/src/test/moves/solar_beam.test.ts @@ -0,0 +1,102 @@ +import { allMoves } from "#app/data/move"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { WeatherType } from "#enums/weather-type"; +import { MoveResult } from "#app/field/pokemon"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; + +describe("Moves - Solar Beam", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Moves.SOLAR_BEAM) + .battleType("single") + .startingLevel(100) + .enemySpecies(Species.SNORLAX) + .enemyLevel(100) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should deal damage in two turns if no weather is active", async () => { + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SOLAR_BEAM); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeDefined(); + expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp()); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.OTHER); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerSolarBeam = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.SOLAR_BEAM); + expect(playerSolarBeam?.ppUsed).toBe(1); + }); + + it.each([ + { weatherType: WeatherType.SUNNY, name: "Sun" }, + { weatherType: WeatherType.HARSH_SUN, name: "Harsh Sun" } + ])("should deal damage in one turn if $name is active", async ({ weatherType }) => { + game.override.weather(weatherType); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + const enemyPokemon = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SOLAR_BEAM); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(playerPokemon.getTag(BattlerTagType.CHARGING)).toBeUndefined(); + expect(enemyPokemon.hp).toBeLessThan(enemyPokemon.getMaxHp()); + expect(playerPokemon.getMoveHistory()).toHaveLength(2); + expect(playerPokemon.getLastXMoves(1)[0].result).toBe(MoveResult.SUCCESS); + + const playerSolarBeam = playerPokemon.getMoveset().find(mv => mv && mv.moveId === Moves.SOLAR_BEAM); + expect(playerSolarBeam?.ppUsed).toBe(1); + }); + + it.each([ + { weatherType: WeatherType.RAIN, name: "Rain" }, + { weatherType: WeatherType.HEAVY_RAIN, name: "Heavy Rain" } + ])("should have its power halved in $name", async ({ weatherType }) => { + game.override.weather(weatherType); + + await game.classicMode.startBattle([ Species.MAGIKARP ]); + + const solarBeam = allMoves[Moves.SOLAR_BEAM]; + + vi.spyOn(solarBeam, "calculateBattlePower"); + + game.move.select(Moves.SOLAR_BEAM); + + await game.phaseInterceptor.to("TurnEndPhase"); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(solarBeam.calculateBattlePower).toHaveLastReturnedWith(60); + }); +}); diff --git a/src/test/moves/toxic_spikes.test.ts b/src/test/moves/toxic_spikes.test.ts index bac1ccdccd8..a5c63a2652f 100644 --- a/src/test/moves/toxic_spikes.test.ts +++ b/src/test/moves/toxic_spikes.test.ts @@ -9,8 +9,6 @@ import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -const TIMEOUT = 20 * 1000; - describe("Moves - Toxic Spikes", () => { let phaserGame: Phaser.Game; let game: GameManager; @@ -34,10 +32,10 @@ describe("Moves - Toxic Spikes", () => { .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH) - .moveset([ Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR ]); + .moveset([ Moves.TOXIC_SPIKES, Moves.SPLASH, Moves.ROAR, Moves.COURT_CHANGE ]); }); - it("should not affect the opponent if they do not switch", async() => { + it("should not affect the opponent if they do not switch", async () => { await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); const enemy = game.scene.getEnemyField()[0]; @@ -51,9 +49,9 @@ describe("Moves - Toxic Spikes", () => { expect(enemy.hp).toBe(enemy.getMaxHp()); expect(enemy.status?.effect).toBeUndefined(); - }, TIMEOUT); + }); - it("should poison the opponent if they switch into 1 layer", async() => { + it("should poison the opponent if they switch into 1 layer", async () => { await game.classicMode.runToSummon([ Species.MIGHTYENA ]); game.move.select(Moves.TOXIC_SPIKES); @@ -65,9 +63,9 @@ describe("Moves - Toxic Spikes", () => { expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); expect(enemy.status?.effect).toBe(StatusEffect.POISON); - }, TIMEOUT); + }); - it("should badly poison the opponent if they switch into 2 layers", async() => { + it("should badly poison the opponent if they switch into 2 layers", async () => { await game.classicMode.runToSummon([ Species.MIGHTYENA ]); game.move.select(Moves.TOXIC_SPIKES); @@ -80,27 +78,32 @@ describe("Moves - Toxic Spikes", () => { const enemy = game.scene.getEnemyField()[0]; expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); expect(enemy.status?.effect).toBe(StatusEffect.TOXIC); - }, TIMEOUT); + }); - it("should be removed if a grounded poison pokemon switches in", async() => { - game.override.enemySpecies(Species.GRIMER); - await game.classicMode.runToSummon([ Species.MIGHTYENA ]); + it("should be removed if a grounded poison pokemon switches in", async () => { + await game.classicMode.runToSummon([ Species.MUK, Species.PIDGEY ]); + + const muk = game.scene.getPlayerPokemon()!; game.move.select(Moves.TOXIC_SPIKES); - await game.phaseInterceptor.to("TurnEndPhase"); - game.move.select(Moves.TOXIC_SPIKES); - await game.phaseInterceptor.to("TurnEndPhase"); - game.move.select(Moves.ROAR); - await game.phaseInterceptor.to("TurnEndPhase"); - - const enemy = game.scene.getEnemyField()[0]; - expect(enemy.hp).toBe(enemy.getMaxHp()); - expect(enemy.status?.effect).toBeUndefined(); + await game.toNextTurn(); + // also make sure the toxic spikes are removed even if the pokemon + // that set them up is the one switching in (https://github.com/pagefaultgames/pokerogue/issues/935) + game.move.select(Moves.COURT_CHANGE); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.doSwitchPokemon(1); + await game.toNextTurn(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(muk.isFullHp()).toBe(true); + expect(muk.status?.effect).toBeUndefined(); expect(game.scene.arena.tags.length).toBe(0); - }, TIMEOUT); + }); - it("shouldn't create multiple layers per use in doubles", async() => { + it("shouldn't create multiple layers per use in doubles", async () => { await game.classicMode.runToSummon([ Species.MIGHTYENA, Species.POOCHYENA ]); game.move.select(Moves.TOXIC_SPIKES); @@ -109,9 +112,9 @@ describe("Moves - Toxic Spikes", () => { const arenaTags = (game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY) as ArenaTrapTag); expect(arenaTags.tagType).toBe(ArenaTagType.TOXIC_SPIKES); expect(arenaTags.layers).toBe(1); - }, TIMEOUT); + }); - it("should persist through reload", async() => { + it("should persist through reload", async () => { game.override.startingWave(1); const scene = game.scene; const gameData = new GameData(scene); @@ -132,5 +135,5 @@ describe("Moves - Toxic Spikes", () => { expect(sessionData.arena.tags).toEqual(recoveredData.arena.tags); localStorage.removeItem("sessionTestData"); - }, TIMEOUT); + }); }); diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts index 079fdfa5685..adb97b42af7 100644 --- a/src/test/moves/transform.test.ts +++ b/src/test/moves/transform.test.ts @@ -36,9 +36,7 @@ describe("Moves - Transform", () => { }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([ Species.DITTO ]); game.move.select(Moves.TRANSFORM); await game.phaseInterceptor.to(TurnEndPhase); @@ -62,25 +60,24 @@ describe("Moves - Transform", () => { const playerMoveset = player.getMoveset(); const enemyMoveset = player.getMoveset(); + expect(playerMoveset.length).toBe(enemyMoveset.length); for (let i = 0; i < playerMoveset.length && i < enemyMoveset.length; i++) { - // TODO: Checks for 5 PP should be done here when that gets addressed expect(playerMoveset[i]?.moveId).toBe(enemyMoveset[i]?.moveId); } const playerTypes = player.getTypes(); const enemyTypes = enemy.getTypes(); + expect(playerTypes.length).toBe(enemyTypes.length); for (let i = 0; i < playerTypes.length && i < enemyTypes.length; i++) { expect(playerTypes[i]).toBe(enemyTypes[i]); } - }, 20000); + }); it("should copy in-battle overridden stats", async () => { game.override.enemyMoveset([ Moves.POWER_SPLIT ]); - await game.startBattle([ - Species.DITTO - ]); + await game.classicMode.startBattle([ Species.DITTO ]); const player = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -97,4 +94,26 @@ describe("Moves - Transform", () => { expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk); expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk); }); + + it("should set each move's pp to a maximum of 5", async () => { + game.override.enemyMoveset([ Moves.SWORDS_DANCE, Moves.GROWL, Moves.SKETCH, Moves.RECOVER ]); + + await game.classicMode.startBattle([ Species.DITTO ]); + const player = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.TRANSFORM); + await game.phaseInterceptor.to(TurnEndPhase); + + player.getMoveset().forEach(move => { + // Should set correct maximum PP without touching `ppUp` + if (move) { + if (move.moveId === Moves.SKETCH) { + expect(move.getMovePp()).toBe(1); + } else { + expect(move.getMovePp()).toBe(5); + } + expect(move.ppUp).toBe(0); + } + }); + }); }); diff --git a/src/test/moves/trick_or_treat.test.ts b/src/test/moves/trick_or_treat.test.ts new file mode 100644 index 00000000000..7ecd00ed076 --- /dev/null +++ b/src/test/moves/trick_or_treat.test.ts @@ -0,0 +1,47 @@ +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Trick Or Treat", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.FORESTS_CURSE, Moves.TRICK_OR_TREAT ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("will replace added type from Forest's Curse", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemyPokemon = game.scene.getEnemyPokemon(); + game.move.select(Moves.FORESTS_CURSE); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon!.summonData.addedType).toBe(Type.GRASS); + + game.move.select(Moves.TRICK_OR_TREAT); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemyPokemon?.summonData.addedType).toBe(Type.GHOST); + }); +}); diff --git a/src/test/moves/whirlwind.test.ts b/src/test/moves/whirlwind.test.ts index cc31b2591a2..c16f38111f2 100644 --- a/src/test/moves/whirlwind.test.ts +++ b/src/test/moves/whirlwind.test.ts @@ -41,7 +41,8 @@ describe("Moves - Whirlwind", () => { const staraptor = game.scene.getPlayerPokemon()!; game.move.select(move); - await game.toNextTurn(); + + await game.phaseInterceptor.to("BerryPhase", false); expect(staraptor.findTag((t) => t.tagType === BattlerTagType.FLYING)).toBeDefined(); expect(game.scene.getEnemyPokemon()!.getLastXMoves(1)[0].result).toBe(MoveResult.MISS); diff --git a/src/test/moves/will_o_wisp.test.ts b/src/test/moves/will_o_wisp.test.ts new file mode 100644 index 00000000000..39729d331ad --- /dev/null +++ b/src/test/moves/will_o_wisp.test.ts @@ -0,0 +1,53 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import { StatusEffect } from "#enums/status-effect"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Will-O-Wisp", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([ Moves.WILL_O_WISP, Moves.SPLASH ]) + .ability(Abilities.BALL_FETCH) + .battleType("single") + .disableCrits() + .enemySpecies(Species.MAGIKARP) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH); + }); + + it("should burn the opponent", async () => { + await game.classicMode.startBattle([ Species.FEEBAS ]); + + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.WILL_O_WISP); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceHit(); + await game.toNextTurn(); + + expect(enemy.status?.effect).toBe(StatusEffect.BURN); + + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + + expect(enemy.status?.effect).toBe(StatusEffect.BURN); + }); +}); diff --git a/src/test/mystery-encounter/encounter-test-utils.ts b/src/test/mystery-encounter/encounter-test-utils.ts index 9fb2504c02b..f95a442d4c2 100644 --- a/src/test/mystery-encounter/encounter-test-utils.ts +++ b/src/test/mystery-encounter/encounter-test-utils.ts @@ -97,20 +97,20 @@ export async function runSelectMysteryEncounterOption(game: GameManager, optionN uiHandler.unblockInput(); // input are blocked by 1s to prevent accidental input. Tests need to handle that switch (optionNo) { - default: - case 1: + default: + case 1: // no movement needed. Default cursor position - break; - case 2: - uiHandler.processInput(Button.RIGHT); - break; - case 3: - uiHandler.processInput(Button.DOWN); - break; - case 4: - uiHandler.processInput(Button.RIGHT); - uiHandler.processInput(Button.DOWN); - break; + break; + case 2: + uiHandler.processInput(Button.RIGHT); + break; + case 3: + uiHandler.processInput(Button.DOWN); + break; + case 4: + uiHandler.processInput(Button.RIGHT); + uiHandler.processInput(Button.DOWN); + break; } if (!isNullOrUndefined(secondaryOptionSelect?.pokemonNo)) { diff --git a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts index 0dc02e03c6d..e0f37c7e045 100644 --- a/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/bug-type-superfan-encounter.test.ts @@ -476,10 +476,11 @@ describe("Bug-Type Superfan - Mystery Encounter", () => { expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(3); + expect(modifierSelectHandler.options.length).toEqual(4); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toBe("MASTER_BALL"); - expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MAX_LURE"); - expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("FORM_CHANGE_ITEM"); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toBe("MEGA_BRACELET"); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toBe("DYNAMAX_BAND"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toBe("FORM_CHANGE_ITEM"); }); it("should leave encounter without battle", async () => { diff --git a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts index b92a4d96adc..82ed558e6db 100644 --- a/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/clowning-around-encounter.test.ts @@ -118,11 +118,11 @@ describe("Clowning Around - Mystery Encounter", () => { }); expect(config.pokemonConfigs?.[1]).toEqual({ species: getPokemonSpecies(Species.BLACEPHALON), - mysteryEncounterPokemonData: expect.anything(), + customPokemonData: expect.anything(), isBoss: true, moveSet: [ Moves.TRICK, Moves.HYPNOSIS, Moves.SHADOW_BALL, Moves.MIND_BLOWN ] }); - expect(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.types.length).toBe(2); + expect(config.pokemonConfigs?.[1].customPokemonData?.types.length).toBe(2); expect([ Abilities.STURDY, Abilities.PICKUP, @@ -139,8 +139,8 @@ describe("Clowning Around - Mystery Encounter", () => { Abilities.MAGICIAN, Abilities.SHEER_FORCE, Abilities.PRANKSTER - ]).toContain(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.ability); - expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].mysteryEncounterPokemonData?.ability); + ]).toContain(config.pokemonConfigs?.[1].customPokemonData?.ability); + expect(ClowningAroundEncounter.misc.ability).toBe(config.pokemonConfigs?.[1].customPokemonData?.ability); await vi.waitFor(() => expect(moveInitSpy).toHaveBeenCalled()); await vi.waitFor(() => expect(moveLoadSpy).toHaveBeenCalled()); expect(onInitResult).toBe(true); @@ -219,7 +219,7 @@ describe("Clowning Around - Mystery Encounter", () => { await game.phaseInterceptor.to(NewBattlePhase, false); const leadPokemon = scene.getParty()[0]; - expect(leadPokemon.mysteryEncounterPokemonData?.ability).toBe(abilityToTrain); + expect(leadPokemon.customPokemonData?.ability).toBe(abilityToTrain); }); }); @@ -340,9 +340,9 @@ describe("Clowning Around - Mystery Encounter", () => { scene.getParty()[2].moveset = []; await runMysteryEncounterToEnd(game, 3); - const leadTypesAfter = scene.getParty()[0].mysteryEncounterPokemonData?.types; - const secondaryTypesAfter = scene.getParty()[1].mysteryEncounterPokemonData?.types; - const thirdTypesAfter = scene.getParty()[2].mysteryEncounterPokemonData?.types; + const leadTypesAfter = scene.getParty()[0].customPokemonData?.types; + const secondaryTypesAfter = scene.getParty()[1].customPokemonData?.types; + const thirdTypesAfter = scene.getParty()[2].customPokemonData?.types; expect(leadTypesAfter.length).toBe(2); expect(leadTypesAfter[0]).toBe(Type.WATER); diff --git a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts index 69c0a114645..66d628ef82f 100644 --- a/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/delibirdy-encounter.test.ts @@ -206,7 +206,7 @@ describe("Delibird-y - Mystery Encounter", () => { expect(candyJarAfter?.stackCount).toBe(1); }); - it("Should remove Reviver Seed and give the player a Healing Charm", async () => { + it("Should remove Reviver Seed and give the player a Berry Pouch", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 1 Reviver Seed on party lead @@ -220,11 +220,11 @@ describe("Delibird-y - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); const reviverSeedAfter = scene.findModifier(m => m instanceof PokemonInstantReviveModifier); - const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); + const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); expect(reviverSeedAfter).toBeUndefined(); - expect(healingCharmAfter).toBeDefined(); - expect(healingCharmAfter?.stackCount).toBe(1); + expect(berryPouchAfter).toBeDefined(); + expect(berryPouchAfter?.stackCount).toBe(1); }); it("Should give the player a Shell Bell if they have max stacks of Candy Jars", async () => { @@ -256,13 +256,13 @@ describe("Delibird-y - Mystery Encounter", () => { expect(shellBellAfter?.stackCount).toBe(1); }); - it("Should give the player a Shell Bell if they have max stacks of Healing Charms", async () => { + it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); - // 5 Healing Charms + // 3 Berry Pouches scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; - healingCharm.stackCount = 5; + const healingCharm = generateModifierType(scene, modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; + healingCharm.stackCount = 3; await scene.addModifier(healingCharm, true, false, false, true); // Set 1 Reviver Seed on party lead @@ -275,12 +275,12 @@ describe("Delibird-y - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 2, { pokemonNo: 1, optionNo: 1 }); const reviverSeedAfter = scene.findModifier(m => m instanceof PokemonInstantReviveModifier); - const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); expect(reviverSeedAfter).toBeUndefined(); expect(healingCharmAfter).toBeDefined(); - expect(healingCharmAfter?.stackCount).toBe(5); + expect(healingCharmAfter?.stackCount).toBe(3); expect(shellBellAfter).toBeDefined(); expect(shellBellAfter?.stackCount).toBe(1); }); @@ -347,7 +347,7 @@ describe("Delibird-y - Mystery Encounter", () => { }); }); - it("Should decrease held item stacks and give the player a Berry Pouch", async () => { + it("Should decrease held item stacks and give the player a Healing Charm", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 2 Soul Dew on party lead @@ -361,14 +361,14 @@ describe("Delibird-y - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); - const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); expect(soulDewAfter?.stackCount).toBe(1); - expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter?.stackCount).toBe(1); + expect(healingCharmAfter).toBeDefined(); + expect(healingCharmAfter?.stackCount).toBe(1); }); - it("Should remove held item and give the player a Berry Pouch", async () => { + it("Should remove held item and give the player a Healing Charm", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // Set 1 Soul Dew on party lead @@ -382,20 +382,20 @@ describe("Delibird-y - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); - const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); expect(soulDewAfter).toBeUndefined(); - expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter?.stackCount).toBe(1); + expect(healingCharmAfter).toBeDefined(); + expect(healingCharmAfter?.stackCount).toBe(1); }); - it("Should give the player a Shell Bell if they have max stacks of Berry Pouches", async () => { + it("Should give the player a Shell Bell if they have max stacks of Healing Charms", async () => { await game.runToMysteryEncounter(MysteryEncounterType.DELIBIRDY, defaultParty); // 5 Healing Charms scene.modifiers = []; - const healingCharm = generateModifierType(scene, modifierTypes.BERRY_POUCH)!.newModifier() as PreserveBerryModifier; - healingCharm.stackCount = 3; + const healingCharm = generateModifierType(scene, modifierTypes.HEALING_CHARM)!.newModifier() as HealingBoosterModifier; + healingCharm.stackCount = 5; await scene.addModifier(healingCharm, true, false, false, true); // Set 1 Soul Dew on party lead @@ -408,12 +408,12 @@ describe("Delibird-y - Mystery Encounter", () => { await runMysteryEncounterToEnd(game, 3, { pokemonNo: 1, optionNo: 1 }); const soulDewAfter = scene.findModifier(m => m instanceof PokemonNatureWeightModifier); - const berryPouchAfter = scene.findModifier(m => m instanceof PreserveBerryModifier); + const healingCharmAfter = scene.findModifier(m => m instanceof HealingBoosterModifier); const shellBellAfter = scene.findModifier(m => m instanceof HitHealModifier); expect(soulDewAfter).toBeUndefined(); - expect(berryPouchAfter).toBeDefined(); - expect(berryPouchAfter?.stackCount).toBe(3); + expect(healingCharmAfter).toBeDefined(); + expect(healingCharmAfter?.stackCount).toBe(5); expect(shellBellAfter).toBeDefined(); expect(shellBellAfter?.stackCount).toBe(1); }); diff --git a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts index a4f303d121f..5a270f1cbec 100644 --- a/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/fiery-fallout-encounter.test.ts @@ -12,7 +12,7 @@ import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encount import { runMysteryEncounterToEnd, runSelectMysteryEncounterOption, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import { Moves } from "#enums/moves"; import BattleScene from "#app/battle-scene"; -import { PokemonHeldItemModifier } from "#app/modifier/modifier"; +import { AttackTypeBoosterModifier, PokemonHeldItemModifier } from "#app/modifier/modifier"; import { Type } from "#app/data/type"; import { Status, StatusEffect } from "#app/data/status-effect"; import { MysteryEncounterPhase } from "#app/phases/mystery-encounter-phases"; @@ -22,6 +22,8 @@ import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { Abilities } from "#enums/abilities"; import i18next from "i18next"; const namespace = "mysteryEncounters/fieryFallout"; @@ -42,10 +44,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { beforeEach(async () => { game = new GameManager(phaserGame); scene = game.scene; - game.override.mysteryEncounterChance(100); - game.override.startingWave(defaultWave); - game.override.startingBiome(defaultBiome); - game.override.disableTrainerWaves(); + game.override.mysteryEncounterChance(100) + .startingWave(defaultWave) + .startingBiome(defaultBiome) + .disableTrainerWaves() + .moveset([ Moves.PAYBACK, Moves.THUNDERBOLT ]); // Required for attack type booster item generation vi.spyOn(MysteryEncounters, "mysteryEncountersByBiome", "get").mockReturnValue( new Map([ @@ -109,12 +112,16 @@ describe("Fiery Fallout - Mystery Encounter", () => { { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, - gender: Gender.MALE + gender: Gender.MALE, + tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + mysteryEncounterBattleEffects: expect.any(Function) }, { species: getPokemonSpecies(Species.VOLCARONA), isBoss: false, - gender: Gender.FEMALE + gender: Gender.FEMALE, + tags: [ BattlerTagType.MYSTERY_ENCOUNTER_POST_SUMMON ], + mysteryEncounterBattleEffects: expect.any(Function) } ], doubleBattle: true, @@ -157,12 +164,11 @@ describe("Fiery Fallout - Mystery Encounter", () => { expect(enemyField[0].gender).not.toEqual(enemyField[1].gender); // Should be opposite gender const movePhases = phaseSpy.mock.calls.filter(p => p[0] instanceof MovePhase).map(p => p[0]); - expect(movePhases.length).toBe(4); + expect(movePhases.length).toBe(2); expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.FIRE_SPIN).length).toBe(2); // Fire spin used twice before battle - expect(movePhases.filter(p => (p as MovePhase).move.moveId === Moves.QUIVER_DANCE).length).toBe(2); // Quiver Dance used twice before battle }); - it("should give charcoal to lead pokemon", async () => { + it("should give attack type boosting item to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runMysteryEncounterToEnd(game, 1, undefined, true); await skipBattleRunMysteryEncounterRewardsPhase(game); @@ -172,8 +178,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { const leadPokemonId = scene.getParty()?.[0].id; const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; - const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); - expect(charcoal).toBeDefined; + const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); + expect(item).toBeDefined; }); }); @@ -193,7 +199,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); }); - it("should damage all non-fire party PKM by 20% and randomly burn 1", async () => { + it("should damage all non-fire party PKM by 20%, and burn + give Heatproof to a random Pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); const party = scene.getParty(); @@ -210,7 +216,8 @@ describe("Fiery Fallout - Mystery Encounter", () => { burnablePokemon.forEach((pkm) => { expect(pkm.hp, `${pkm.name} should have received 20% damage: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp() - Math.floor(pkm.getMaxHp() * 0.2)); }); - expect(burnablePokemon.some(pkm => pkm?.status?.effect === StatusEffect.BURN)).toBeTruthy(); + expect(burnablePokemon.some(pkm => pkm.status?.effect === StatusEffect.BURN)).toBeTruthy(); + expect(burnablePokemon.some(pkm => pkm.customPokemonData.ability === Abilities.HEATPROOF)); notBurnablePokemon.forEach((pkm) => expect(pkm.hp, `${pkm.name} should be full hp: ${pkm.hp} / ${pkm.getMaxHp()} HP`).toBe(pkm.getMaxHp())); }); @@ -241,17 +248,15 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); }); - it("should give charcoal to lead pokemon", async () => { + it("should give attack type boosting item to lead pokemon", async () => { await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, defaultParty); await runMysteryEncounterToEnd(game, 3); await game.phaseInterceptor.to(SelectModifierPhase, false); expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); - const leadPokemonId = scene.getParty()?.[0].id; - const leadPokemonItems = scene.findModifiers(m => m instanceof PokemonHeldItemModifier - && (m as PokemonHeldItemModifier).pokemonId === leadPokemonId, true) as PokemonHeldItemModifier[]; - const charcoal = leadPokemonItems.find(i => i.type.name === "Charcoal"); - expect(charcoal).toBeDefined; + const leadPokemonItems = scene.getParty()?.[0].getHeldItems() as PokemonHeldItemModifier[]; + const item = leadPokemonItems.find(i => i instanceof AttackTypeBoosterModifier); + expect(item).toBeDefined; }); it("should leave encounter without battle", async () => { @@ -264,7 +269,7 @@ describe("Fiery Fallout - Mystery Encounter", () => { }); it("should be disabled if not enough FIRE types are in party", async () => { - await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [ Species.MAGIKARP, Species.ARCANINE ]); + await game.runToMysteryEncounter(MysteryEncounterType.FIERY_FALLOUT, [ Species.MAGIKARP ]); await game.phaseInterceptor.to(MysteryEncounterPhase, false); const encounterPhase = scene.getCurrentPhase(); diff --git a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts index f64124790b7..4d95ff31d36 100644 --- a/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/the-strong-stuff-encounter.test.ts @@ -21,7 +21,7 @@ import { BerryModifier, PokemonBaseStatTotalModifier } from "#app/modifier/modif import { MysteryEncounterOptionMode } from "#enums/mystery-encounter-option-mode"; import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; -import { MysteryEncounterPokemonData } from "#app/data/mystery-encounters/mystery-encounter-pokemon-data"; +import { CustomPokemonData } from "#app/data/custom-pokemon-data"; import { CommandPhase } from "#app/phases/command-phase"; import { MovePhase } from "#app/phases/move-phase"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; @@ -109,7 +109,7 @@ describe("The Strong Stuff - Mystery Encounter", () => { species: getPokemonSpecies(Species.SHUCKLE), isBoss: true, bossSegments: 5, - mysteryEncounterPokemonData: new MysteryEncounterPokemonData({ spriteScale: 1.25 }), + customPokemonData: new CustomPokemonData({ spriteScale: 1.25 }), nature: Nature.BOLD, moveSet: [ Moves.INFESTATION, Moves.SALT_CURE, Moves.GASTRO_ACID, Moves.HEAL_ORDER ], modifierConfigs: expect.any(Array), diff --git a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts index d761f2d1b21..8286c6a694b 100644 --- a/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/trash-to-treasure-encounter.test.ts @@ -86,7 +86,7 @@ describe("Trash to Treasure - Mystery Encounter", () => { expect(TrashToTreasureEncounter.enemyPartyConfigs).toEqual([ { - levelAdditiveModifier: 1, + levelAdditiveModifier: 0.5, disableSwitch: true, pokemonConfigs: [ { diff --git a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts index f4d055c69aa..c1fa6d83a18 100644 --- a/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts +++ b/src/test/mystery-encounter/encounters/weird-dream-encounter.test.ts @@ -5,7 +5,7 @@ import { Species } from "#app/enums/species"; import GameManager from "#app/test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import * as EncounterPhaseUtils from "#app/data/mystery-encounters/utils/encounter-phase-utils"; -import { runMysteryEncounterToEnd } from "#test/mystery-encounter/encounter-test-utils"; +import { runMysteryEncounterToEnd, skipBattleRunMysteryEncounterRewardsPhase } from "#test/mystery-encounter/encounter-test-utils"; import BattleScene from "#app/battle-scene"; import { Mode } from "#app/ui/ui"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; @@ -15,6 +15,8 @@ import { initSceneWithoutEncounterPhase } from "#test/utils/gameManagerUtils"; import { WeirdDreamEncounter } from "#app/data/mystery-encounters/encounters/weird-dream-encounter"; import * as EncounterTransformationSequence from "#app/data/mystery-encounters/utils/encounter-transformation-sequence"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { CommandPhase } from "#app/phases/command-phase"; +import { ModifierTier } from "#app/modifier/modifier-tier"; const namespace = "mysteryEncounters/weirdDream"; const defaultParty = [ Species.MAGBY, Species.HAUNTER, Species.ABRA ]; @@ -70,7 +72,7 @@ describe("Weird Dream - Mystery Encounter", () => { expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.title).toBe(`${namespace}:title`); expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.description).toBe(`${namespace}:description`); expect(WeirdDreamEncounter.dialogue.encounterOptionsDialogue?.query).toBe(`${namespace}:query`); - expect(WeirdDreamEncounter.options.length).toBe(2); + expect(WeirdDreamEncounter.options.length).toBe(3); }); it("should initialize fully", async () => { @@ -122,7 +124,7 @@ describe("Weird Dream - Mystery Encounter", () => { for (let i = 0; i < pokemonAfter.length; i++) { const newPokemon = pokemonAfter[i]; expect(newPokemon.getSpeciesForm().speciesId).not.toBe(pokemonPrior[i].getSpeciesForm().speciesId); - expect(newPokemon.mysteryEncounterPokemonData?.types.length).toBe(2); + expect(newPokemon.customPokemonData?.types.length).toBe(2); } const plus90To110 = bstDiff.filter(bst => bst > 80); @@ -132,7 +134,7 @@ describe("Weird Dream - Mystery Encounter", () => { expect(plus40To50.length).toBe(1); }); - it("should have 1 Memory Mushroom, 5 Rogue Balls, and 2 Mints in rewards", async () => { + it("should have 1 Memory Mushroom, 5 Rogue Balls, and 3 Mints in rewards", async () => { await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); await runMysteryEncounterToEnd(game, 1); await game.phaseInterceptor.to(SelectModifierPhase, false); @@ -141,11 +143,12 @@ describe("Weird Dream - Mystery Encounter", () => { expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; - expect(modifierSelectHandler.options.length).toEqual(4); + expect(modifierSelectHandler.options.length).toEqual(5); expect(modifierSelectHandler.options[0].modifierTypeOption.type.id).toEqual("MEMORY_MUSHROOM"); expect(modifierSelectHandler.options[1].modifierTypeOption.type.id).toEqual("ROGUE_BALL"); expect(modifierSelectHandler.options[2].modifierTypeOption.type.id).toEqual("MINT"); expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("MINT"); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.id).toEqual("MINT"); }); it("should leave encounter without battle", async () => { @@ -158,7 +161,7 @@ describe("Weird Dream - Mystery Encounter", () => { }); }); - describe("Option 2 - Leave", () => { + describe("Option 2 - Battle Future Self", () => { it("should have the correct properties", () => { const option = WeirdDreamEncounter.options[1]; expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); @@ -174,17 +177,63 @@ describe("Weird Dream - Mystery Encounter", () => { }); }); - it("should reduce party levels by 12.5%", async () => { + it("should start a battle against the player's transformation team", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + await runMysteryEncounterToEnd(game, 2, undefined, true); + + const enemyField = scene.getEnemyField(); + expect(scene.getCurrentPhase()?.constructor.name).toBe(CommandPhase.name); + expect(enemyField.length).toBe(1); + expect(scene.getEnemyParty().length).toBe(scene.getParty().length); + }); + + it("should have 2 Rogue/2 Ultra/2 Great items in rewards", async () => { + await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); + await runMysteryEncounterToEnd(game, 2, undefined, true); + await skipBattleRunMysteryEncounterRewardsPhase(game); + await game.phaseInterceptor.to(SelectModifierPhase, false); + expect(scene.getCurrentPhase()?.constructor.name).toBe(SelectModifierPhase.name); + await game.phaseInterceptor.run(SelectModifierPhase); + + expect(scene.ui.getMode()).to.equal(Mode.MODIFIER_SELECT); + const modifierSelectHandler = scene.ui.handlers.find(h => h instanceof ModifierSelectUiHandler) as ModifierSelectUiHandler; + expect(modifierSelectHandler.options.length).toEqual(6); + expect(modifierSelectHandler.options[0].modifierTypeOption.type.tier - modifierSelectHandler.options[0].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[1].modifierTypeOption.type.tier - modifierSelectHandler.options[1].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ROGUE); + expect(modifierSelectHandler.options[2].modifierTypeOption.type.tier - modifierSelectHandler.options[2].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[3].modifierTypeOption.type.tier - modifierSelectHandler.options[3].modifierTypeOption.upgradeCount).toEqual(ModifierTier.ULTRA); + expect(modifierSelectHandler.options[4].modifierTypeOption.type.tier - modifierSelectHandler.options[4].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + expect(modifierSelectHandler.options[5].modifierTypeOption.type.tier - modifierSelectHandler.options[5].modifierTypeOption.upgradeCount).toEqual(ModifierTier.GREAT); + }); + }); + + describe("Option 3 - Leave", () => { + it("should have the correct properties", () => { + const option = WeirdDreamEncounter.options[2]; + expect(option.optionMode).toBe(MysteryEncounterOptionMode.DEFAULT); + expect(option.dialogue).toBeDefined(); + expect(option.dialogue).toStrictEqual({ + buttonLabel: `${namespace}:option.3.label`, + buttonTooltip: `${namespace}:option.3.tooltip`, + selected: [ + { + text: `${namespace}:option.3.selected`, + }, + ], + }); + }); + + it("should reduce party levels by 10%", async () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); const levelsPrior = scene.getParty().map(p => p.level); - await runMysteryEncounterToEnd(game, 2); + await runMysteryEncounterToEnd(game, 3); const levelsAfter = scene.getParty().map(p => p.level); for (let i = 0; i < levelsPrior.length; i++) { - expect(Math.max(Math.ceil(0.8875 * levelsPrior[i]), 1)).toBe(levelsAfter[i]); + expect(Math.max(Math.ceil(0.9 * levelsPrior[i]), 1)).toBe(levelsAfter[i]); expect(scene.getParty()[i].levelExp).toBe(0); } @@ -195,7 +244,7 @@ describe("Weird Dream - Mystery Encounter", () => { const leaveEncounterWithoutBattleSpy = vi.spyOn(EncounterPhaseUtils, "leaveEncounterWithoutBattle"); await game.runToMysteryEncounter(MysteryEncounterType.WEIRD_DREAM, defaultParty); - await runMysteryEncounterToEnd(game, 2); + await runMysteryEncounterToEnd(game, 3); expect(leaveEncounterWithoutBattleSpy).toBeCalled(); }); diff --git a/src/test/phases/frenzy-move-reset.test.ts b/src/test/phases/frenzy-move-reset.test.ts new file mode 100644 index 00000000000..db9ec2bfe66 --- /dev/null +++ b/src/test/phases/frenzy-move-reset.test.ts @@ -0,0 +1,72 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#enums/abilities"; +import { BattlerTagType } from "#enums/battler-tag-type"; +import { StatusEffect } from "#enums/status-effect"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Frenzy Move Reset", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .disableCrits() + .starterSpecies(Species.MAGIKARP) + .moveset(Moves.THRASH) + .statusEffect(StatusEffect.PARALYSIS) + .enemyMoveset(Moves.SPLASH) + .enemyLevel(100) + .enemySpecies(Species.SHUCKLE) + .enemyAbility(Abilities.BALL_FETCH); + }); + + /* + * Thrash (or frenzy moves in general) should not continue to run if attack fails due to paralysis + * + * This is a 3-turn Thrash test: + * 1. Thrash is selected and succeeds to hit the enemy -> Enemy Faints + * + * 2. Thrash is automatically selected but misses due to paralysis + * Note: After missing the Pokemon should stop automatically attacking + * + * 3. At the start of the 3rd turn the Player should be able to select a move/switch Pokemon/etc. + * Note: This means that BattlerTag.FRENZY is not anymore in pokemon.summonData.tags and pokemon.summonData.moveQueue is empty + * + */ + it("should cancel frenzy move if move fails turn 2", async () => { + await game.classicMode.startBattle(); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + game.move.select(Moves.THRASH); + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceStatusActivation(false); + await game.toNextTurn(); + + expect(playerPokemon.summonData.moveQueue.length).toBe(2); + expect(playerPokemon.summonData.tags.some(tag => tag.tagType === BattlerTagType.FRENZY)).toBe(true); + + await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); + await game.move.forceStatusActivation(true); + await game.toNextTurn(); + + expect(playerPokemon.summonData.moveQueue.length).toBe(0); + expect(playerPokemon.summonData.tags.some(tag => tag.tagType === BattlerTagType.FRENZY)).toBe(false); + }); +}); diff --git a/src/test/utils/gameWrapper.ts b/src/test/utils/gameWrapper.ts index 48c0007118b..22517502a05 100644 --- a/src/test/utils/gameWrapper.ts +++ b/src/test/utils/gameWrapper.ts @@ -24,6 +24,7 @@ import GamepadPlugin = Phaser.Input.Gamepad.GamepadPlugin; import EventEmitter = Phaser.Events.EventEmitter; import UpdateList = Phaser.GameObjects.UpdateList; import { version } from "../../../package.json"; +import { MockTimedEventManager } from "./mocks/mockTimedEventManager"; Object.defineProperty(window, "localStorage", { value: mockLocalStorage(), @@ -232,6 +233,7 @@ export default class GameWrapper { this.scene.make = new MockGameObjectCreator(mockTextureManager); this.scene.time = new MockClock(this.scene); this.scene.remove = vi.fn(); // TODO: this should be stubbed differently + this.scene.eventManager = new MockTimedEventManager(); // Disable Timed Events } } diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/src/test/utils/helpers/challengeModeHelper.ts index 184f11f505c..5210d942d5a 100644 --- a/src/test/utils/helpers/challengeModeHelper.ts +++ b/src/test/utils/helpers/challengeModeHelper.ts @@ -38,6 +38,10 @@ export class ChallengeModeHelper extends GameManagerHelper { async runToSummon(species?: Species[]) { await this.game.runToTitle(); + if (this.game.override.disableShinies) { + this.game.override.shiny(false).enemyShiny(false); + } + this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { this.game.scene.gameMode.challenges = this.challenges; const starters = generateStarter(this.game.scene, species); @@ -47,7 +51,7 @@ export class ChallengeModeHelper extends GameManagerHelper { }); await this.game.phaseInterceptor.run(EncounterPhase); - if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) { this.game.removeEnemyHeldItems(); } } diff --git a/src/test/utils/helpers/classicModeHelper.ts b/src/test/utils/helpers/classicModeHelper.ts index 55e995fc9dc..80d0b86de7b 100644 --- a/src/test/utils/helpers/classicModeHelper.ts +++ b/src/test/utils/helpers/classicModeHelper.ts @@ -20,9 +20,13 @@ export class ClassicModeHelper extends GameManagerHelper { * @param species - Optional array of species to summon. * @returns A promise that resolves when the summon phase is reached. */ - async runToSummon(species?: Species[]) { + async runToSummon(species?: Species[]): Promise { await this.game.runToTitle(); + if (this.game.override.disableShinies) { + this.game.override.shiny(false).enemyShiny(false); + } + this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { this.game.scene.gameMode = getGameMode(GameModes.CLASSIC); const starters = generateStarter(this.game.scene, species); @@ -32,7 +36,7 @@ export class ClassicModeHelper extends GameManagerHelper { }); await this.game.phaseInterceptor.run(EncounterPhase); - if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) { this.game.removeEnemyHeldItems(); } } @@ -42,7 +46,7 @@ export class ClassicModeHelper extends GameManagerHelper { * @param species - Optional array of species to start the battle with. * @returns A promise that resolves when the battle is started. */ - async startBattle(species?: Species[]) { + async startBattle(species?: Species[]): Promise { await this.runToSummon(species); if (this.game.scene.battleStyle === BattleStyle.SWITCH) { diff --git a/src/test/utils/helpers/dailyModeHelper.ts b/src/test/utils/helpers/dailyModeHelper.ts index e40fada8ac7..813544f85df 100644 --- a/src/test/utils/helpers/dailyModeHelper.ts +++ b/src/test/utils/helpers/dailyModeHelper.ts @@ -21,6 +21,10 @@ export class DailyModeHelper extends GameManagerHelper { async runToSummon() { await this.game.runToTitle(); + if (this.game.override.disableShinies) { + this.game.override.shiny(false).enemyShiny(false); + } + this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => { const titlePhase = new TitlePhase(this.game.scene); titlePhase.initDailyRun(); @@ -33,7 +37,7 @@ export class DailyModeHelper extends GameManagerHelper { await this.game.phaseInterceptor.to(EncounterPhase); - if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0 && this.game.override.removeEnemyStartingItems) { this.game.removeEnemyHeldItems(); } } diff --git a/src/test/utils/helpers/moveHelper.ts b/src/test/utils/helpers/moveHelper.ts index a0667d91f4c..73fe63395fd 100644 --- a/src/test/utils/helpers/moveHelper.ts +++ b/src/test/utils/helpers/moveHelper.ts @@ -1,12 +1,13 @@ import { BattlerIndex } from "#app/battle"; -import { Moves } from "#app/enums/moves"; +import Overrides from "#app/overrides"; import { CommandPhase } from "#app/phases/command-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { Command } from "#app/ui/command-ui-handler"; import { Mode } from "#app/ui/ui"; +import { Moves } from "#enums/moves"; +import { getMovePosition } from "#test/utils/gameManagerUtils"; +import { GameManagerHelper } from "#test/utils/helpers/gameManagerHelper"; import { vi } from "vitest"; -import { getMovePosition } from "../gameManagerUtils"; -import { GameManagerHelper } from "./gameManagerHelper"; /** * Helper to handle a Pokemon's move @@ -17,7 +18,7 @@ export class MoveHelper extends GameManagerHelper { * {@linkcode MoveEffectPhase.hitCheck | hitCheck}'s return value to `true`. * Used to force a move to hit. */ - async forceHit(): Promise { + public async forceHit(): Promise { await this.game.phaseInterceptor.to(MoveEffectPhase, false); vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck").mockReturnValue(true); } @@ -26,9 +27,9 @@ export class MoveHelper extends GameManagerHelper { * Intercepts {@linkcode MoveEffectPhase} and mocks the * {@linkcode MoveEffectPhase.hitCheck | hitCheck}'s return value to `false`. * Used to force a move to miss. - * @param firstTargetOnly Whether the move should force miss on the first target only, in the case of multi-target moves. + * @param firstTargetOnly - Whether the move should force miss on the first target only, in the case of multi-target moves. */ - async forceMiss(firstTargetOnly: boolean = false): Promise { + public async forceMiss(firstTargetOnly: boolean = false): Promise { await this.game.phaseInterceptor.to(MoveEffectPhase, false); const hitCheck = vi.spyOn(this.game.scene.getCurrentPhase() as MoveEffectPhase, "hitCheck"); @@ -40,12 +41,12 @@ export class MoveHelper extends GameManagerHelper { } /** - * Select the move to be used by the given Pokemon(-index). Triggers during the next {@linkcode CommandPhase} - * @param move the move to use - * @param pkmIndex the pokemon index. Relevant for double-battles only (defaults to 0) - * @param targetIndex The {@linkcode BattlerIndex} of the Pokemon to target for single-target moves, or `null` if a manual call to `selectTarget()` is required - */ - select(move: Moves, pkmIndex: 0 | 1 = 0, targetIndex?: BattlerIndex | null) { + * Select the move to be used by the given Pokemon(-index). Triggers during the next {@linkcode CommandPhase} + * @param move - the move to use + * @param pkmIndex - the pokemon index. Relevant for double-battles only (defaults to 0) + * @param targetIndex - The {@linkcode BattlerIndex} of the Pokemon to target for single-target moves, or `null` if a manual call to `selectTarget()` is required + */ + public select(move: Moves, pkmIndex: 0 | 1 = 0, targetIndex?: BattlerIndex | null) { const movePosition = getMovePosition(this.game.scene, pkmIndex, move); this.game.onNextPrompt("CommandPhase", Mode.COMMAND, () => { @@ -59,4 +60,15 @@ export class MoveHelper extends GameManagerHelper { this.game.selectTarget(movePosition, targetIndex); } } + + /** + * Forces the Paralysis or Freeze status to activate on the next move by temporarily mocking {@linkcode Overrides.STATUS_ACTIVATION_OVERRIDE}, + * advancing to the next `MovePhase`, and then resetting the override to `null` + * @param activated - `true` to force the status to activate, `false` to force the status to not activate (will cause Freeze to heal) + */ + public async forceStatusActivation(activated: boolean): Promise { + vi.spyOn(Overrides, "STATUS_ACTIVATION_OVERRIDE", "get").mockReturnValue(activated); + await this.game.phaseInterceptor.to("MovePhase"); + vi.spyOn(Overrides, "STATUS_ACTIVATION_OVERRIDE", "get").mockReturnValue(null); + } } diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts index 27fd9552fe4..404f5c34a26 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -19,12 +19,17 @@ import { MysteryEncounterTier } from "#enums/mystery-encounter-tier"; * Helper to handle overrides in tests */ export class OverridesHelper extends GameManagerHelper { + /** If `true`, removes the starting items from enemies at the start of each test; default `true` */ + public removeEnemyStartingItems: boolean = true; + /** If `true`, sets the shiny overrides to disable shinies at the start of each test; default `true` */ + public disableShinies: boolean = true; + /** * Override the starting biome * @warning Any event listeners that are attached to [NewArenaEvent](events\battle-scene.ts) may need to be handled down the line * @param biome the biome to set */ - startingBiome(biome: Biome): this { + public startingBiome(biome: Biome): this { this.game.scene.newArena(biome); this.log(`Starting biome set to ${Biome[biome]} (=${biome})!`); return this; @@ -33,9 +38,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the starting wave (index) * @param wave the wave (index) to set. Classic: `1`-`200` - * @returns this + * @returns `this` */ - startingWave(wave: number): this { + public startingWave(wave: number): this { vi.spyOn(Overrides, "STARTING_WAVE_OVERRIDE", "get").mockReturnValue(wave); this.log(`Starting wave set to ${wave}!`); return this; @@ -44,9 +49,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) starting level * @param level the (pokemon) level to set - * @returns this + * @returns `this` */ - startingLevel(level: Species | number): this { + public startingLevel(level: Species | number): this { vi.spyOn(Overrides, "STARTING_LEVEL_OVERRIDE", "get").mockReturnValue(level); this.log(`Player Pokemon starting level set to ${level}!`); return this; @@ -57,7 +62,7 @@ export class OverridesHelper extends GameManagerHelper { * @param value the XP multiplier to set * @returns `this` */ - xpMultiplier(value: number): this { + public xpMultiplier(value: number): this { vi.spyOn(Overrides, "XP_MULTIPLIER_OVERRIDE", "get").mockReturnValue(value); this.log(`XP Multiplier set to ${value}!`); return this; @@ -66,9 +71,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) starting held items * @param items the items to hold - * @returns this + * @returns `this` */ - startingHeldItems(items: ModifierOverride[]) { + public startingHeldItems(items: ModifierOverride[]): this { vi.spyOn(Overrides, "STARTING_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); this.log("Player Pokemon starting held items set to:", items); return this; @@ -77,9 +82,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) {@linkcode Species | species} * @param species the (pokemon) {@linkcode Species | species} to set - * @returns this + * @returns `this` */ - starterSpecies(species: Species | number): this { + public starterSpecies(species: Species | number): this { vi.spyOn(Overrides, "STARTER_SPECIES_OVERRIDE", "get").mockReturnValue(species); this.log(`Player Pokemon species set to ${Species[species]} (=${species})!`); return this; @@ -87,9 +92,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) to be a random fusion - * @returns this + * @returns `this` */ - enableStarterFusion(): this { + public enableStarterFusion(): this { vi.spyOn(Overrides, "STARTER_FUSION_OVERRIDE", "get").mockReturnValue(true); this.log("Player Pokemon is a random fusion!"); return this; @@ -98,9 +103,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) fusion species * @param species the fusion species to set - * @returns this + * @returns `this` */ - starterFusionSpecies(species: Species | number): this { + public starterFusionSpecies(species: Species | number): this { vi.spyOn(Overrides, "STARTER_FUSION_SPECIES_OVERRIDE", "get").mockReturnValue(species); this.log(`Player Pokemon fusion species set to ${Species[species]} (=${species})!`); return this; @@ -109,9 +114,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemons) forms * @param forms the (pokemon) forms to set - * @returns this + * @returns `this` */ - starterForms(forms: Partial>): this { + public starterForms(forms: Partial>): this { vi.spyOn(Overrides, "STARTER_FORM_OVERRIDES", "get").mockReturnValue(forms); const formsStr = Object.entries(forms) .map(([ speciesId, formIndex ]) => `${Species[speciesId]}=${formIndex}`) @@ -123,9 +128,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player's starting modifiers * @param modifiers the modifiers to set - * @returns this + * @returns `this` */ - startingModifier(modifiers: ModifierOverride[]): this { + public startingModifier(modifiers: ModifierOverride[]): this { vi.spyOn(Overrides, "STARTING_MODIFIER_OVERRIDE", "get").mockReturnValue(modifiers); this.log(`Player starting modifiers set to: ${modifiers}`); return this; @@ -134,9 +139,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) {@linkcode Abilities | ability} * @param ability the (pokemon) {@linkcode Abilities | ability} to set - * @returns this + * @returns `this` */ - ability(ability: Abilities): this { + public ability(ability: Abilities): this { vi.spyOn(Overrides, "ABILITY_OVERRIDE", "get").mockReturnValue(ability); this.log(`Player Pokemon ability set to ${Abilities[ability]} (=${ability})!`); return this; @@ -145,9 +150,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) **passive** {@linkcode Abilities | ability} * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set - * @returns this + * @returns `this` */ - passiveAbility(passiveAbility: Abilities): this { + public passiveAbility(passiveAbility: Abilities): this { vi.spyOn(Overrides, "PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); this.log(`Player Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); return this; @@ -156,9 +161,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the player (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set - * @returns this + * @returns `this` */ - moveset(moveset: Moves | Moves[]): this { + public moveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { moveset = [ moveset ]; @@ -173,7 +178,7 @@ export class OverridesHelper extends GameManagerHelper { * @param statusEffect the {@linkcode StatusEffect | status-effect} to set * @returns */ - statusEffect(statusEffect: StatusEffect): this { + public statusEffect(statusEffect: StatusEffect): this { vi.spyOn(Overrides, "STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); this.log(`Player Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); return this; @@ -181,9 +186,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override each wave to not have standard trainer battles - * @returns this + * @returns `this` */ - disableTrainerWaves(): this { + public disableTrainerWaves(): this { const realFn = getGameMode; vi.spyOn(GameMode, "getGameMode").mockImplementation((gameMode: GameModes) => { const mode = realFn(gameMode); @@ -196,9 +201,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override each wave to not have critical hits - * @returns this + * @returns `this` */ - disableCrits() { + public disableCrits(): this { vi.spyOn(Overrides, "NEVER_CRIT_OVERRIDE", "get").mockReturnValue(true); this.log("Critical hits are disabled!"); return this; @@ -207,9 +212,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the {@linkcode WeatherType | weather (type)} * @param type {@linkcode WeatherType | weather type} to set - * @returns this + * @returns `this` */ - weather(type: WeatherType): this { + public weather(type: WeatherType): this { vi.spyOn(Overrides, "WEATHER_OVERRIDE", "get").mockReturnValue(type); this.log(`Weather set to ${Weather[type]} (=${type})!`); return this; @@ -218,9 +223,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the seed * @param seed the seed to set - * @returns this + * @returns `this` */ - seed(seed: string): this { + public seed(seed: string): this { vi.spyOn(this.game.scene, "resetSeed").mockImplementation(() => { this.game.scene.waveSeed = seed; Phaser.Math.RND.sow([ seed ]); @@ -234,9 +239,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the battle type (single or double) * @param battleType battle type to set - * @returns this + * @returns `this` */ - battleType(battleType: "single" | "double" | null): this { + public battleType(battleType: "single" | "double" | null): this { vi.spyOn(Overrides, "BATTLE_TYPE_OVERRIDE", "get").mockReturnValue(battleType); this.log(`Battle type set to ${battleType} only!`); return this; @@ -245,9 +250,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) {@linkcode Species | species} * @param species the (pokemon) {@linkcode Species | species} to set - * @returns this + * @returns `this` */ - enemySpecies(species: Species | number): this { + public enemySpecies(species: Species | number): this { vi.spyOn(Overrides, "OPP_SPECIES_OVERRIDE", "get").mockReturnValue(species); this.log(`Enemy Pokemon species set to ${Species[species]} (=${species})!`); return this; @@ -255,9 +260,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) to be a random fusion - * @returns this + * @returns `this` */ - enableEnemyFusion(): this { + public enableEnemyFusion(): this { vi.spyOn(Overrides, "OPP_FUSION_OVERRIDE", "get").mockReturnValue(true); this.log("Enemy Pokemon is a random fusion!"); return this; @@ -266,9 +271,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) fusion species * @param species the fusion species to set - * @returns this + * @returns `this` */ - enemyFusionSpecies(species: Species | number): this { + public enemyFusionSpecies(species: Species | number): this { vi.spyOn(Overrides, "OPP_FUSION_SPECIES_OVERRIDE", "get").mockReturnValue(species); this.log(`Enemy Pokemon fusion species set to ${Species[species]} (=${species})!`); return this; @@ -277,9 +282,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) {@linkcode Abilities | ability} * @param ability the (pokemon) {@linkcode Abilities | ability} to set - * @returns this + * @returns `this` */ - enemyAbility(ability: Abilities): this { + public enemyAbility(ability: Abilities): this { vi.spyOn(Overrides, "OPP_ABILITY_OVERRIDE", "get").mockReturnValue(ability); this.log(`Enemy Pokemon ability set to ${Abilities[ability]} (=${ability})!`); return this; @@ -288,9 +293,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) **passive** {@linkcode Abilities | ability} * @param passiveAbility the (pokemon) **passive** {@linkcode Abilities | ability} to set - * @returns this + * @returns `this` */ - enemyPassiveAbility(passiveAbility: Abilities): this { + public enemyPassiveAbility(passiveAbility: Abilities): this { vi.spyOn(Overrides, "OPP_PASSIVE_ABILITY_OVERRIDE", "get").mockReturnValue(passiveAbility); this.log(`Enemy Pokemon PASSIVE ability set to ${Abilities[passiveAbility]} (=${passiveAbility})!`); return this; @@ -299,9 +304,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) {@linkcode Moves | moves}set * @param moveset the {@linkcode Moves | moves}set to set - * @returns this + * @returns `this` */ - enemyMoveset(moveset: Moves | Moves[]): this { + public enemyMoveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); if (!Array.isArray(moveset)) { moveset = [ moveset ]; @@ -314,9 +319,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) level * @param level the level to set - * @returns this + * @returns `this` */ - enemyLevel(level: number): this { + public enemyLevel(level: number): this { vi.spyOn(Overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(level); this.log(`Enemy Pokemon level set to ${level}!`); return this; @@ -327,7 +332,7 @@ export class OverridesHelper extends GameManagerHelper { * @param statusEffect the {@linkcode StatusEffect | status-effect} to set * @returns */ - enemyStatusEffect(statusEffect: StatusEffect): this { + public enemyStatusEffect(statusEffect: StatusEffect): this { vi.spyOn(Overrides, "OPP_STATUS_OVERRIDE", "get").mockReturnValue(statusEffect); this.log(`Enemy Pokemon status-effect set to ${StatusEffect[statusEffect]} (=${statusEffect})!`); return this; @@ -336,9 +341,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the enemy (pokemon) held items * @param items the items to hold - * @returns this + * @returns `this` */ - enemyHeldItems(items: ModifierOverride[]) { + public enemyHeldItems(items: ModifierOverride[]): this { vi.spyOn(Overrides, "OPP_HELD_ITEMS_OVERRIDE", "get").mockReturnValue(items); this.log("Enemy Pokemon held items set to:", items); return this; @@ -349,7 +354,7 @@ export class OverridesHelper extends GameManagerHelper { * @param unlockable The Unlockable(s) to enable. * @returns `this` */ - enableUnlockable(unlockable: Unlockables[]) { + public enableUnlockable(unlockable: Unlockables[]): this { vi.spyOn(Overrides, "ITEM_UNLOCK_OVERRIDE", "get").mockReturnValue(unlockable); this.log("Temporarily unlocked the following content: ", unlockable); return this; @@ -358,9 +363,9 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the items rolled at the end of a battle * @param items the items to be rolled - * @returns this + * @returns `this` */ - itemRewards(items: ModifierOverride[]) { + public itemRewards(items: ModifierOverride[]): this { vi.spyOn(Overrides, "ITEM_REWARD_OVERRIDE", "get").mockReturnValue(items); this.log("Item rewards set to:", items); return this; @@ -368,43 +373,87 @@ export class OverridesHelper extends GameManagerHelper { /** * Override player shininess - * @param shininess Whether the player's Pokemon should be shiny. + * @param shininess - `true` or `false` to force the player's pokemon to be shiny or not shiny, + * `null` to disable the override and re-enable RNG shinies. + * @returns `this` */ - shinyLevel(shininess: boolean): this { + public shiny(shininess: boolean | null): this { vi.spyOn(Overrides, "SHINY_OVERRIDE", "get").mockReturnValue(shininess); - this.log(`Set player Pokemon as ${shininess ? "" : "not "}shiny!`); + if (shininess === null) { + this.log("Disabled player Pokemon shiny override!"); + } else { + this.log(`Set player Pokemon to be ${shininess ? "" : "not "}shiny!`); + } return this; } + /** * Override player shiny variant - * @param variant The player's shiny variant. + * @param variant - The player's shiny variant. + * @returns `this` */ - variantLevel(variant: Variant): this { + public shinyVariant(variant: Variant): this { vi.spyOn(Overrides, "VARIANT_OVERRIDE", "get").mockReturnValue(variant); this.log(`Set player Pokemon's shiny variant to ${variant}!`); return this; } + /** + * Override enemy shininess + * @param shininess - `true` or `false` to force the enemy's pokemon to be shiny or not shiny, + * `null` to disable the override and re-enable RNG shinies. + * @param variant - (Optional) The enemy's shiny {@linkcode Variant}. + */ + enemyShiny(shininess: boolean | null, variant?: Variant): this { + vi.spyOn(Overrides, "OPP_SHINY_OVERRIDE", "get").mockReturnValue(shininess); + if (shininess === null) { + this.log("Disabled enemy Pokemon shiny override!"); + } else { + this.log(`Set enemy Pokemon to be ${shininess ? "" : "not "}shiny!`); + } + + if (variant !== undefined) { + vi.spyOn(Overrides, "OPP_VARIANT_OVERRIDE", "get").mockReturnValue(variant); + this.log(`Set enemy shiny variant to be ${variant}!`); + } + return this; + } + /** * Override the enemy (Pokemon) to have the given amount of health segments * @param healthSegments the number of segments to give - * default: 0, the health segments will be handled like in the game based on wave, level and species - * 1: the Pokemon will not be a boss - * 2+: the Pokemon will be a boss with the given number of health segments - * @returns this + * - `0` (default): the health segments will be handled like in the game based on wave, level and species + * - `1`: the Pokemon will not be a boss + * - `2`+: the Pokemon will be a boss with the given number of health segments + * @returns `this` */ - enemyHealthSegments(healthSegments: number) { + public enemyHealthSegments(healthSegments: number): this { vi.spyOn(Overrides, "OPP_HEALTH_SEGMENTS_OVERRIDE", "get").mockReturnValue(healthSegments); this.log("Enemy Pokemon health segments set to:", healthSegments); return this; } + /** + * Override statuses (Paralysis and Freeze) to always or never activate + * @param activate - `true` to force activation, `false` to force no activation, `null` to disable the override + * @returns `this` + */ + public statusActivation(activate: boolean | null): this { + vi.spyOn(Overrides, "STATUS_ACTIVATION_OVERRIDE", "get").mockReturnValue(activate); + if (activate !== null) { + this.log(`Paralysis and Freeze forced to ${activate ? "always" : "never"} activate!`); + } else { + this.log("Status activation override disabled!"); + } + return this; + } + /** * Override the encounter chance for a mystery encounter. * @param percentage the encounter chance in % - * @returns spy instance + * @returns `this` */ - mysteryEncounterChance(percentage: number) { + public mysteryEncounterChance(percentage: number): this { const maxRate: number = 256; // 100% const rate = maxRate * (percentage / 100); vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_RATE_OVERRIDE", "get").mockReturnValue(rate); @@ -414,10 +463,10 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the encounter chance for a mystery encounter. - * @returns spy instance - * @param tier + * @param tier - The {@linkcode MysteryEncounterTier} to encounter + * @returns `this` */ - mysteryEncounterTier(tier: MysteryEncounterTier) { + public mysteryEncounterTier(tier: MysteryEncounterTier): this { vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_TIER_OVERRIDE", "get").mockReturnValue(tier); this.log(`Mystery encounter tier set to ${tier}!`); return this; @@ -425,10 +474,10 @@ export class OverridesHelper extends GameManagerHelper { /** * Override the encounter that spawns for the scene - * @param encounterType - * @returns spy instance + * @param encounterType - The {@linkcode MysteryEncounterType} of the encounter + * @returns `this` */ - mysteryEncounter(encounterType: MysteryEncounterType) { + public mysteryEncounter(encounterType: MysteryEncounterType): this { vi.spyOn(Overrides, "MYSTERY_ENCOUNTER_OVERRIDE", "get").mockReturnValue(encounterType); this.log(`Mystery encounter override set to ${encounterType}!`); return this; diff --git a/src/test/utils/mocks/mockTimedEventManager.ts b/src/test/utils/mocks/mockTimedEventManager.ts new file mode 100644 index 00000000000..b44729996a7 --- /dev/null +++ b/src/test/utils/mocks/mockTimedEventManager.ts @@ -0,0 +1,17 @@ +import { TimedEventManager } from "#app/timed-event-manager"; + +/** Mock TimedEventManager so that ongoing events don't impact tests */ +export class MockTimedEventManager extends TimedEventManager { + override activeEvent() { + return undefined; + } + override isEventActive(): boolean { + return false; + } + override getFriendshipMultiplier(): number { + return 1; + } + override getShinyMultiplier(): number { + return 1; + } +} diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts index 513d21bd2f3..3b2b3619397 100644 --- a/src/timed-event-manager.ts +++ b/src/timed-event-manager.ts @@ -5,13 +5,13 @@ import i18next from "i18next"; export enum EventType { SHINY, - GENERIC + NO_TIMER_DISPLAY } interface EventBanner { bannerKey?: string; - xPosition?: number; - yPosition?: number; + xOffset?: number; + yOffset?: number; scale?: number; availableLangs?: string[]; } @@ -20,21 +20,22 @@ interface TimedEvent extends EventBanner { name: string; eventType: EventType; shinyMultiplier?: number; + friendshipMultiplier?: number; startDate: Date; endDate: Date; } const timedEvents: TimedEvent[] = [ { - name: "Egg Skip Update", - eventType: EventType.GENERIC, - startDate: new Date(Date.UTC(2024, 8, 8, 0)), - endDate: new Date(Date.UTC(2024, 8, 12, 0)), - bannerKey: "egg-update", - xPosition: 19, - yPosition: 120, + name: "Halloween Update", + eventType: EventType.SHINY, + shinyMultiplier: 2, + friendshipMultiplier: 2, + startDate: new Date(Date.UTC(2024, 9, 27, 0)), + endDate: new Date(Date.UTC(2024, 10, 4, 0)), + bannerKey: "halloween2024-event-", scale: 0.21, - availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN" ] + availableLangs: [ "en", "de", "it", "fr", "ja", "ko", "es-ES", "pt-BR", "zh-CN" ] } ]; @@ -61,6 +62,16 @@ export class TimedEventManager { return activeEvents.length > 0; } + getFriendshipMultiplier(): number { + let multiplier = 1; + const friendshipEvents = timedEvents.filter((te) => this.isActive(te)); + friendshipEvents.forEach((fe) => { + multiplier *= fe.friendshipMultiplier ?? 1; + }); + + return multiplier; + } + getShinyMultiplier(): number { let multiplier = 1; const shinyEvents = timedEvents.filter((te) => te.eventType === EventType.SHINY && this.isActive(te)); @@ -80,42 +91,63 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { private event: TimedEvent | nil; private eventTimerText: Phaser.GameObjects.Text; private banner: Phaser.GameObjects.Image; - private bannerShadow: Phaser.GameObjects.Rectangle; + private availableWidth: number; private eventTimer: NodeJS.Timeout | null; constructor(scene: BattleScene, x: number, y: number, event?: TimedEvent) { super(scene, x, y); + this.availableWidth = scene.scaledCanvas.width; this.event = event; this.setVisible(false); } + /** + * Set the width that can be used to display the event timer and banner. By default + * these elements get centered horizontally in that space, in the bottom left of the screen + */ + setWidth(width: number) { + if (width !== this.availableWidth) { + this.availableWidth = width; + const xPosition = this.availableWidth / 2 + (this.event?.xOffset ?? 0); + if (this.banner) { + this.banner.x = xPosition; + } + if (this.eventTimerText) { + this.eventTimerText.x = xPosition; + } + } + } + setup() { const lang = i18next.resolvedLanguage; if (this.event && this.event.bannerKey) { let key = this.event.bannerKey; if (lang && this.event.availableLangs && this.event.availableLangs.length > 0) { if (this.event.availableLangs.includes(lang)) { - key += "_" + lang; + key += lang; } else { - key += "_en"; + key += "en"; } } console.log(this.event.bannerKey); - this.banner = new Phaser.GameObjects.Image(this.scene, this.event.xPosition ?? 29, this.event.yPosition ?? 64, key); + const padding = 5; + const showTimer = this.event.eventType !== EventType.NO_TIMER_DISPLAY; + const yPosition = this.scene.game.canvas.height / 6 - padding - (showTimer ? 10 : 0) - (this.event.yOffset ?? 0); + this.banner = new Phaser.GameObjects.Image(this.scene, this.availableWidth / 2, yPosition - padding, key); this.banner.setName("img-event-banner"); - this.banner.setOrigin(0.08, -0.35); + this.banner.setOrigin(0.5, 1); this.banner.setScale(this.event.scale ?? 0.18); - if (this.event.eventType !== EventType.GENERIC) { + if (showTimer) { this.eventTimerText = addTextObject( this.scene, - this.banner.x + 8, - this.banner.y + 100, + this.banner.x, + this.banner.y + 2, this.timeToGo(this.event.endDate), TextStyle.WINDOW ); this.eventTimerText.setName("text-event-timer"); this.eventTimerText.setScale(0.15); - this.eventTimerText.setOrigin(0, 0); + this.eventTimerText.setOrigin(0.5, 0); this.add(this.eventTimerText); } @@ -161,7 +193,7 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container { } updateCountdown() { - if (this.event && this.event.eventType !== EventType.GENERIC) { + if (this.event && this.event.eventType !== EventType.NO_TIMER_DISPLAY) { this.eventTimerText.setText(this.timeToGo(this.event.endDate)); } } diff --git a/src/touch-controls.ts b/src/touch-controls.ts index 786d1203d12..93032ce59fe 100644 --- a/src/touch-controls.ts +++ b/src/touch-controls.ts @@ -122,20 +122,20 @@ export default class TouchControl { const button = Button[key]; switch (eventType) { - case "keydown": - this.events.emit("input_down", { - controller_type: "keyboard", - button: button, - isTouch: true - }); - break; - case "keyup": - this.events.emit("input_up", { - controller_type: "keyboard", - button: button, - isTouch: true - }); - break; + case "keydown": + this.events.emit("input_down", { + controller_type: "keyboard", + button: button, + isTouch: true + }); + break; + case "keyup": + this.events.emit("input_up", { + controller_type: "keyboard", + button: button, + isTouch: true + }); + break; } return true; } diff --git a/src/ui-inputs.ts b/src/ui-inputs.ts index 9ea1276352a..92b1653df3d 100644 --- a/src/ui-inputs.ts +++ b/src/ui-inputs.ts @@ -168,26 +168,26 @@ export class UiInputs { return; } switch (this.scene.ui?.getMode()) { - case Mode.MESSAGE: - const messageHandler = this.scene.ui.getHandler(); - if (!messageHandler.pendingPrompt || messageHandler.isTextAnimationInProgress()) { + case Mode.MESSAGE: + const messageHandler = this.scene.ui.getHandler(); + if (!messageHandler.pendingPrompt || messageHandler.isTextAnimationInProgress()) { + return; + } + case Mode.TITLE: + case Mode.COMMAND: + case Mode.MODIFIER_SELECT: + case Mode.MYSTERY_ENCOUNTER: + this.scene.ui.setOverlayMode(Mode.MENU); + break; + case Mode.STARTER_SELECT: + this.buttonTouch(); + break; + case Mode.MENU: + this.scene.ui.revertMode(); + this.scene.playSound("ui/select"); + break; + default: return; - } - case Mode.TITLE: - case Mode.COMMAND: - case Mode.MODIFIER_SELECT: - case Mode.MYSTERY_ENCOUNTER: - this.scene.ui.setOverlayMode(Mode.MENU); - break; - case Mode.STARTER_SELECT: - this.buttonTouch(); - break; - case Mode.MENU: - this.scene.ui.revertMode(); - this.scene.playSound("ui/select"); - break; - default: - return; } } diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts index a12ffbc46bd..01fc5b00014 100644 --- a/src/ui/abstact-option-select-ui-handler.ts +++ b/src/ui/abstact-option-select-ui-handler.ts @@ -222,20 +222,20 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler { } } else { switch (button) { - case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else if (this.cursor === 0) { - success = this.setCursor(options.length - 1); - } - break; - case Button.DOWN: - if (this.cursor < options.length - 1) { - success = this.setCursor(this.cursor + 1); - } else { - success = this.setCursor(0); - } - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.cursor === 0) { + success = this.setCursor(options.length - 1); + } + break; + case Button.DOWN: + if (this.cursor < options.length - 1) { + success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(0); + } + break; } if (this.config?.supportHover) { // handle hover code if the element supports hover-handlers and the option has the optional hover-handler set. diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts index 4e0e2feea81..a1ced6145eb 100644 --- a/src/ui/achvs-ui-handler.ts +++ b/src/ui/achvs-ui-handler.ts @@ -245,51 +245,51 @@ export default class AchvsUiHandler extends MessageUiHandler { const rowIndex = Math.floor(this.cursor / this.COLS); const itemOffset = (this.scrollCursor * this.COLS); switch (button) { - case Button.UP: - if (this.cursor < this.COLS) { - if (this.scrollCursor) { - success = this.setScrollCursor(this.scrollCursor - 1); - } else { + case Button.UP: + if (this.cursor < this.COLS) { + if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } else { // Wrap around to the last row - success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS); - let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS; - if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS - 1) { - newCursorIndex -= this.COLS; + success = this.setScrollCursor(Math.ceil(this.currentTotal / this.COLS) - this.ROWS); + let newCursorIndex = this.cursor + (this.ROWS - 1) * this.COLS; + if (newCursorIndex > this.currentTotal - this.scrollCursor * this.COLS - 1) { + newCursorIndex -= this.COLS; + } + success = success && this.setCursor(newCursorIndex); } - success = success && this.setCursor(newCursorIndex); - } - } else { - success = this.setCursor(this.cursor - this.COLS); - } - break; - case Button.DOWN: - const canMoveDown = itemOffset + 1 < this.currentTotal; - if (rowIndex >= this.ROWS - 1) { - if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) { - // scroll down one row - success = this.setScrollCursor(this.scrollCursor + 1); } else { - // wrap back to the first row - success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS); + success = this.setCursor(this.cursor - this.COLS); } - } else if (canMoveDown) { - success = this.setCursor(Math.min(this.cursor + this.COLS, this.currentTotal - itemOffset - 1)); - } - break; - case Button.LEFT: - if (this.cursor % this.COLS === 0) { - success = this.setCursor(Math.min(this.cursor + this.COLS - 1, this.currentTotal - itemOffset - 1)); - } else { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.RIGHT: - if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) { - success = this.setCursor(this.cursor - this.cursor % this.COLS); - } else { - success = this.setCursor(this.cursor + 1); - } - break; + break; + case Button.DOWN: + const canMoveDown = itemOffset + 1 < this.currentTotal; + if (rowIndex >= this.ROWS - 1) { + if (this.scrollCursor < Math.ceil(this.currentTotal / this.COLS) - this.ROWS && canMoveDown) { + // scroll down one row + success = this.setScrollCursor(this.scrollCursor + 1); + } else { + // wrap back to the first row + success = this.setScrollCursor(0) && this.setCursor(this.cursor % this.COLS); + } + } else if (canMoveDown) { + success = this.setCursor(Math.min(this.cursor + this.COLS, this.currentTotal - itemOffset - 1)); + } + break; + case Button.LEFT: + if (this.cursor % this.COLS === 0) { + success = this.setCursor(Math.min(this.cursor + this.COLS - 1, this.currentTotal - itemOffset - 1)); + } else { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if ((this.cursor + 1) % this.COLS === 0 || (this.cursor + itemOffset) === (this.currentTotal - 1)) { + success = this.setCursor(this.cursor - this.cursor % this.COLS); + } else { + success = this.setCursor(this.cursor + 1); + } + break; } } @@ -316,22 +316,22 @@ export default class AchvsUiHandler extends MessageUiHandler { if (update || pageChange) { switch (this.currentPage) { - case Page.ACHIEVEMENTS: - if (pageChange) { - this.titleBg.width = 174; - this.titleText.x = this.titleBg.width / 2; - this.scoreContainer.setVisible(true); - } - this.showAchv(achvs[Object.keys(achvs)[cursor + this.scrollCursor * this.COLS]]); - break; - case Page.VOUCHERS: - if (pageChange) { - this.titleBg.width = 220; - this.titleText.x = this.titleBg.width / 2; - this.scoreContainer.setVisible(false); - } - this.showVoucher(vouchers[Object.keys(vouchers)[cursor + this.scrollCursor * this.COLS]]); - break; + case Page.ACHIEVEMENTS: + if (pageChange) { + this.titleBg.width = 174; + this.titleText.x = this.titleBg.width / 2; + this.scoreContainer.setVisible(true); + } + this.showAchv(achvs[Object.keys(achvs)[cursor + this.scrollCursor * this.COLS]]); + break; + case Page.VOUCHERS: + if (pageChange) { + this.titleBg.width = 220; + this.titleText.x = this.titleBg.width / 2; + this.scoreContainer.setVisible(false); + } + this.showVoucher(vouchers[Object.keys(vouchers)[cursor + this.scrollCursor * this.COLS]]); + break; } } return ret; @@ -358,14 +358,14 @@ export default class AchvsUiHandler extends MessageUiHandler { } switch (this.currentPage) { - case Page.ACHIEVEMENTS: - this.updateAchvIcons(); - this.showAchv(achvs[Object.keys(achvs)[this.cursor + this.scrollCursor * this.COLS]]); - break; - case Page.VOUCHERS: - this.updateVoucherIcons(); - this.showVoucher(vouchers[Object.keys(vouchers)[this.cursor + this.scrollCursor * this.COLS]]); - break; + case Page.ACHIEVEMENTS: + this.updateAchvIcons(); + this.showAchv(achvs[Object.keys(achvs)[this.cursor + this.scrollCursor * this.COLS]]); + break; + case Page.VOUCHERS: + this.updateVoucherIcons(); + this.showVoucher(vouchers[Object.keys(vouchers)[this.cursor + this.scrollCursor * this.COLS]]); + break; } return true; } diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts index c73c02e66c2..6249e54d8c3 100644 --- a/src/ui/admin-ui-handler.ts +++ b/src/ui/admin-ui-handler.ts @@ -2,37 +2,83 @@ import BattleScene from "#app/battle-scene"; import { ModalConfig } from "./modal-ui-handler"; import { Mode } from "./ui"; import * as Utils from "../utils"; -import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { Button } from "#app/enums/buttons"; +import { TextStyle } from "./text"; export default class AdminUiHandler extends FormModalUiHandler { + private adminMode: AdminMode; + private adminResult: AdminSearchInfo; + private config: ModalConfig; + + private readonly buttonGap = 10; + // http response from the server when a username isn't found in the server + private readonly httpUserNotFoundErrorCode: number = 404; + private readonly ERR_REQUIRED_FIELD = (field: string) => { + if (field === "username") { + return `${Utils.formatText(field)} is required`; + } else { + return `${Utils.formatText(field)} Id is required`; + } + }; + // returns a string saying whether a username has been successfully linked/unlinked to discord/google + private readonly SUCCESS_SERVICE_MODE = (service: string, mode: string) => { + return `Username and ${service} successfully ${mode.toLowerCase()}ed`; + }; + private readonly ERR_USERNAME_NOT_FOUND: string = "Username not found!"; + private readonly ERR_GENERIC_ERROR: string = "There was an error"; + constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); } - setup(): void { - super.setup(); - } - - getModalTitle(config?: ModalConfig): string { + override getModalTitle(): string { return "Admin panel"; } - getFields(config?: ModalConfig): string[] { - return [ "Username", "Discord ID" ]; + override getWidth(): number { + return this.adminMode === AdminMode.ADMIN ? 180 : 160; } - getWidth(config?: ModalConfig): number { - return 160; + override getMargin(): [number, number, number, number] { + return [ 0, 0, 0, 0 ]; } - getMargin(config?: ModalConfig): [number, number, number, number] { - return [ 0, 0, 48, 0 ]; + override getButtonLabels(): string[] { + switch (this.adminMode) { + case AdminMode.LINK: + return [ "Link Account", "Cancel" ]; + case AdminMode.SEARCH: + return [ "Find account", "Cancel" ]; + case AdminMode.ADMIN: + return [ "Back to search", "Cancel" ]; + default: + return [ "Activate ADMIN", "Cancel" ]; + } } - getButtonLabels(config?: ModalConfig): string[] { - return [ "Link account", "Cancel" ]; + override getInputFieldConfigs(): InputFieldConfig[] { + const inputFieldConfigs: InputFieldConfig[] = []; + switch (this.adminMode) { + case AdminMode.LINK: + inputFieldConfigs.push( { label: "Username" }); + inputFieldConfigs.push( { label: "Discord ID" }); + break; + case AdminMode.SEARCH: + inputFieldConfigs.push( { label: "Username" }); + break; + case AdminMode.ADMIN: + const adminResult = this.adminResult ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; + // Discord and Google ID fields that are not empty get locked, other fields are all locked + inputFieldConfigs.push( { label: "Username", isReadOnly: true }); + inputFieldConfigs.push( { label: "Discord ID", isReadOnly: adminResult.discordId !== "" }); + inputFieldConfigs.push( { label: "Google ID", isReadOnly: adminResult.googleId !== "" }); + inputFieldConfigs.push( { label: "Last played", isReadOnly: true }); + inputFieldConfigs.push( { label: "Registered", isReadOnly: true }); + break; + } + return inputFieldConfigs; } processInput(button: Button): boolean { @@ -45,44 +91,281 @@ export default class AdminUiHandler extends FormModalUiHandler { } show(args: any[]): boolean { + this.config = args[0] as ModalConfig; // config + this.adminMode = args[1] as AdminMode; // admin mode + this.adminResult = args[2] ?? { username: "", discordId: "", googleId: "", lastLoggedIn: "", registered: "" }; // admin result, if any + const isMessageError = args[3]; // is the message shown a success or error + + const fields = this.getInputFieldConfigs(); + const hasTitle = !!this.getModalTitle(); + + this.updateFields(fields, hasTitle); + this.updateContainer(this.config); + + const labels = this.getButtonLabels(); + for (let i = 0; i < labels.length; i++) { + this.buttonLabels[i].setText(labels[i]); // sets the label text + } + + this.errorMessage.setPosition(10, (hasTitle ? 31 : 5) + 20 * (fields.length - 1) + 16 + this.getButtonTopMargin()); // sets the position of the message dynamically + if (isMessageError) { + this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); + this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); + } else { + this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_GREEN)); + this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_GREEN, true)); + } + if (super.show(args)) { - const config = args[0] as ModalConfig; + this.populateFields(this.adminMode, this.adminResult); const originalSubmitAction = this.submitAction; this.submitAction = (_) => { this.submitAction = originalSubmitAction; + const adminSearchResult: AdminSearchInfo = this.convertInputsToAdmin(); // this converts the input texts into a single object for use later + const validFields = this.areFieldsValid(this.adminMode); + if (validFields.error) { + this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + return this.showMessage(validFields.errorMessage ?? "", adminSearchResult, true); + } this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); - const onFail = error => { - this.scene.ui.setMode(Mode.ADMIN, Object.assign(config, { errorMessage: error?.trim() })); - this.scene.ui.playError(); - }; - if (!this.inputs[0].text) { - return onFail("Username is required"); + if (this.adminMode === AdminMode.LINK) { + this.adminLinkUnlink(adminSearchResult, "discord", "Link") // calls server to link discord + .then(response => { + if (response.error) { + return this.showMessage(response.errorType, adminSearchResult, true); // error or some kind + } else { + return this.showMessage(this.SUCCESS_SERVICE_MODE("discord", "link"), adminSearchResult, false); // success + } + }); + } else if (this.adminMode === AdminMode.SEARCH) { + this.adminSearch(adminSearchResult) // admin search for username + .then(response => { + if (response.error) { + return this.showMessage(response.errorType, adminSearchResult, true); // failure + } + this.updateAdminPanelInfo(response.adminSearchResult ?? adminSearchResult); // success + }); + } else if (this.adminMode === AdminMode.ADMIN) { + this.updateAdminPanelInfo(adminSearchResult, AdminMode.SEARCH); } - if (!this.inputs[1].text) { - return onFail("Discord Id is required"); - } - Utils.apiPost("admin/account/discord-link", `username=${encodeURIComponent(this.inputs[0].text)}&discordId=${encodeURIComponent(this.inputs[1].text)}`, "application/x-www-form-urlencoded", true) - .then(response => { - if (!response.ok) { - console.error(response); - } - this.inputs[0].setText(""); - this.inputs[1].setText(""); - this.scene.ui.revertMode(); - }) - .catch((err) => { - console.error(err); - this.scene.ui.revertMode(); - }); return false; }; return true; } return false; + } + showMessage(message: string, adminResult: AdminSearchInfo, isError: boolean) { + this.scene.ui.setMode(Mode.ADMIN, Object.assign(this.config, { errorMessage: message?.trim() }), this.adminMode, adminResult, isError); + if (isError) { + this.scene.ui.playError(); + } else { + this.scene.ui.playSelect(); + } + } + + /** + * This is used to update the fields' text when loading in a new admin ui handler. It uses the {@linkcode adminResult} + * to update the input text based on the {@linkcode adminMode}. For a linking adminMode, it sets the username and discord. + * For a search adminMode, it sets the username. For an admin adminMode, it sets all the info from adminResult in the + * appropriate text boxes, and also sets the link/unlink icons for discord/google depending on the result + */ + private populateFields(adminMode: AdminMode, adminResult: AdminSearchInfo) { + switch (adminMode) { + case AdminMode.LINK: + this.inputs[0].setText(adminResult.username); + this.inputs[1].setText(adminResult.discordId); + break; + case AdminMode.SEARCH: + this.inputs[0].setText(adminResult.username); + break; + case AdminMode.ADMIN: + Object.keys(adminResult).forEach((aR, i) => { + this.inputs[i].setText(adminResult[aR]); + if (aR === "discordId" || aR === "googleId") { // this is here to add the icons for linking/unlinking of google/discord IDs + const nineSlice = this.inputContainers[i].list.find(iC => iC.type === "NineSlice"); + const img = this.scene.add.image(this.inputContainers[i].x + nineSlice!.width + this.buttonGap, this.inputContainers[i].y + (Math.floor(nineSlice!.height / 2)), adminResult[aR] === "" ? "link_icon" : "unlink_icon"); + img.setName(`adminBtn_${aR}`); + img.setOrigin(0.5, 0.5); + img.setInteractive(); + img.on("pointerdown", () => { + const service = aR.toLowerCase().replace("id", ""); // this takes our key (discordId or googleId) and removes the "Id" at the end to make it more url friendly + const mode = adminResult[aR] === "" ? "Link" : "Unlink"; // this figures out if we're linking or unlinking a service + const validFields = this.areFieldsValid(this.adminMode, service); + if (validFields.error) { + this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); // this is here to force a loading screen to allow the admin tool to reopen again if there's an error + return this.showMessage(validFields.errorMessage ?? "", adminResult, true); + } + this.adminLinkUnlink(this.convertInputsToAdmin(), service, mode).then(response => { // attempts to link/unlink depending on the service + if (response.error) { + this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + return this.showMessage(response.errorType, adminResult, true); // fail + } else { // success, reload panel with new results + this.scene.ui.setMode(Mode.LOADING, { buttonActions: []}); + this.adminSearch(adminResult) + .then(response => { + if (response.error) { + return this.showMessage(response.errorType, adminResult, true); + } + return this.showMessage(this.SUCCESS_SERVICE_MODE(service, mode), response.adminSearchResult ?? adminResult, false); + }); + } + }); + }); + this.addInteractionHoverEffect(img); + this.modalContainer.add(img); + } + }); + break; + } + } + + private areFieldsValid(adminMode: AdminMode, service?: string): { error: boolean; errorMessage?: string; } { + switch (adminMode) { + case AdminMode.LINK: + if (!this.inputs[0].text) { // username missing from link panel + return { + error: true, + errorMessage: this.ERR_REQUIRED_FIELD("username") + }; + } + if (!this.inputs[1].text) { // discordId missing from linking panel + return { + error: true, + errorMessage: this.ERR_REQUIRED_FIELD("discord") + }; + } + break; + case AdminMode.SEARCH: + if (!this.inputs[0].text) { // username missing from search panel + return { + error: true, + errorMessage: this.ERR_REQUIRED_FIELD("username") + }; + } + break; + case AdminMode.ADMIN: + if (!this.inputs[1].text && service === "discord") { // discordId missing from admin panel + return { + error: true, + errorMessage: this.ERR_REQUIRED_FIELD(service) + }; + } + if (!this.inputs[2].text && service === "google") { // googleId missing from admin panel + return { + error: true, + errorMessage: this.ERR_REQUIRED_FIELD(service) + }; + } + break; + } + return { + error: false + }; + } + + private convertInputsToAdmin(): AdminSearchInfo { + return { + username: this.inputs[0]?.node ? this.inputs[0].text : "", + discordId: this.inputs[1]?.node ? this.inputs[1]?.text : "", + googleId: this.inputs[2]?.node ? this.inputs[2]?.text : "", + lastLoggedIn: this.inputs[3]?.node ? this.inputs[3]?.text : "", + registered: this.inputs[4]?.node ? this.inputs[4]?.text : "" + }; + } + + private async adminSearch(adminSearchResult: AdminSearchInfo) { + try { + const adminInfo = await Utils.apiFetch(`admin/account/adminSearch?username=${encodeURIComponent(adminSearchResult.username)}`, true); + if (!adminInfo.ok) { // error - if adminInfo.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db + return { adminSearchResult: adminSearchResult, error: true, errorType: adminInfo.status === this.httpUserNotFoundErrorCode ? this.ERR_USERNAME_NOT_FOUND : this.ERR_GENERIC_ERROR }; + } else { // success + const adminInfoJson: AdminSearchInfo = await adminInfo.json(); + return { adminSearchResult: adminInfoJson, error: false }; + } + } catch (err) { + console.error(err); + return { error: true, errorType: err }; + } + } + + private async adminLinkUnlink(adminSearchResult: AdminSearchInfo, service: string, mode: string) { + try { + const response = await Utils.apiPost(`admin/account/${service}${mode}`, `username=${encodeURIComponent(adminSearchResult.username)}&${service}Id=${encodeURIComponent(service === "discord" ? adminSearchResult.discordId : adminSearchResult.googleId)}`, "application/x-www-form-urlencoded", true); + if (!response.ok) { // error - if response.status === this.httpUserNotFoundErrorCode that means the username can't be found in the db + return { adminSearchResult: adminSearchResult, error: true, errorType: response.status === this.httpUserNotFoundErrorCode ? this.ERR_USERNAME_NOT_FOUND : this.ERR_GENERIC_ERROR }; + } else { // success! + return { adminSearchResult: adminSearchResult, error: false }; + } + } catch (err) { + console.error(err); + return { error: true, errorType: err }; + } + } + + private updateAdminPanelInfo(adminSearchResult: AdminSearchInfo, mode?: AdminMode) { + mode = mode ?? AdminMode.ADMIN; + this.scene.ui.setMode(Mode.ADMIN, { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + this.scene.ui.revertMode(); + this.scene.ui.revertMode(); + }, + () => { + this.scene.ui.revertMode(); + this.scene.ui.revertMode(); + } + ] + }, mode, adminSearchResult); } clear(): void { super.clear(); + + // this is used to remove the existing fields on the admin panel so they can be updated + + const itemsToRemove: string[] = [ "formLabel", "adminBtn" ]; // this is the start of the names for each element we want to remove + const removeArray: any[] = []; + const mC = this.modalContainer.list; + for (let i = mC.length - 1; i >= 0; i--) { + /* This code looks for a few things before destroying the specific field; first it looks to see if the name of the element is %like% the itemsToRemove labels + * this means that anything with, for example, "formLabel", will be true. + * It then also checks for any containers that are within this.modalContainer, and checks if any of its child elements are of type rexInputText + * and if either of these conditions are met, the element is destroyed. + */ + if (itemsToRemove.some(iTR => mC[i].name.includes(iTR)) || (mC[i].type === "Container" && (mC[i] as Phaser.GameObjects.Container).list.find(m => m.type === "rexInputText"))) { + removeArray.push(mC[i]); + } + } + + while (removeArray.length > 0) { + this.modalContainer.remove(removeArray.pop(), true); + } } } + +export enum AdminMode { + LINK, + SEARCH, + ADMIN +} + +export function getAdminModeName(adminMode: AdminMode): string { + switch (adminMode) { + case AdminMode.LINK: + return "Link"; + case AdminMode.SEARCH: + return "Search"; + default: + return ""; + } +} + +interface AdminSearchInfo { + username: string; + discordId: string; + googleId: string; + lastLoggedIn: string; + registered: string; +} diff --git a/src/ui/arena-flyout.ts b/src/ui/arena-flyout.ts index 0c00d3403b6..a82f97244cd 100644 --- a/src/ui/arena-flyout.ts +++ b/src/ui/arena-flyout.ts @@ -215,20 +215,20 @@ export 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.effecType) { - case ArenaEffectType.PLAYER: - textObject = this.flyoutTextPlayer; - break; + case ArenaEffectType.PLAYER: + textObject = this.flyoutTextPlayer; + break; - case ArenaEffectType.WEATHER: - case ArenaEffectType.TERRAIN: - case ArenaEffectType.FIELD: - textObject = this.flyoutTextField; + case ArenaEffectType.WEATHER: + case ArenaEffectType.TERRAIN: + case ArenaEffectType.FIELD: + textObject = this.flyoutTextField; - break; + break; - case ArenaEffectType.ENEMY: - textObject = this.flyoutTextEnemy; - break; + case ArenaEffectType.ENEMY: + textObject = this.flyoutTextEnemy; + break; } textObject.text += fieldEffectInfo.name; @@ -253,81 +253,81 @@ export class ArenaFlyout extends Phaser.GameObjects.Container { let foundIndex: number; switch (arenaEffectChangedEvent.constructor) { - case TagAddedEvent: - const tagAddedEvent = arenaEffectChangedEvent as TagAddedEvent; - const isArenaTrapTag = this.battleScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof ArenaTrapTag; - let arenaEffectType: ArenaEffectType; + 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 = getFieldEffectText(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})`; + if (tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH) { + arenaEffectType = ArenaEffectType.FIELD; + } else if (tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER) { + arenaEffectType = ArenaEffectType.PLAYER; + } else { + arenaEffectType = ArenaEffectType.ENEMY; } - } - this.fieldEffectInfo.push({ - name, - effecType: arenaEffectType, - maxDuration: tagAddedEvent.duration, - duration: tagAddedEvent.duration, - tagType: tagAddedEvent.arenaTagType - }); - break; - case TagRemovedEvent: - const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent; - foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType); + const existingTrapTagIndex = isArenaTrapTag ? this.fieldEffectInfo.findIndex(e => tagAddedEvent.arenaTagType === e.tagType && arenaEffectType === e.effecType) : -1; + let name: string = getFieldEffectText(ArenaTagType[tagAddedEvent.arenaTagType]); - if (foundIndex !== -1) { // If the tag was being tracked, remove it - this.fieldEffectInfo.splice(foundIndex, 1); - } - break; + 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})`; + } + } - case WeatherChangedEvent: - case TerrainChangedEvent: - const fieldEffectChangedEvent = arenaEffectChangedEvent as WeatherChangedEvent | TerrainChangedEvent; + this.fieldEffectInfo.push({ + name, + effecType: arenaEffectType, + maxDuration: tagAddedEvent.duration, + duration: tagAddedEvent.duration, + tagType: tagAddedEvent.arenaTagType + }); + break; + case TagRemovedEvent: + const tagRemovedEvent = arenaEffectChangedEvent as TagRemovedEvent; + foundIndex = this.fieldEffectInfo.findIndex(info => info.tagType === tagRemovedEvent.arenaTagType); - // Stores the old Weather/Terrain name in case it's in the array already - const oldName = + if (foundIndex !== -1) { // If the tag was being tracked, remove it + this.fieldEffectInfo.splice(foundIndex, 1); + } + break; + + case WeatherChangedEvent: + case TerrainChangedEvent: + const fieldEffectChangedEvent = arenaEffectChangedEvent as WeatherChangedEvent | TerrainChangedEvent; + + // Stores the old Weather/Terrain name in case it's in the array already + const oldName = getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent ? WeatherType[fieldEffectChangedEvent.oldWeatherType] : TerrainType[fieldEffectChangedEvent.oldTerrainType]); - // Stores the new Weather/Terrain info - const newInfo = { - name: + // Stores the new Weather/Terrain info + const newInfo = { + name: getFieldEffectText(fieldEffectChangedEvent instanceof WeatherChangedEvent ? WeatherType[fieldEffectChangedEvent.newWeatherType] : TerrainType[fieldEffectChangedEvent.newTerrainType]), - effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent - ? ArenaEffectType.WEATHER - : ArenaEffectType.TERRAIN, - maxDuration: fieldEffectChangedEvent.duration, - duration: fieldEffectChangedEvent.duration }; + effecType: fieldEffectChangedEvent instanceof WeatherChangedEvent + ? ArenaEffectType.WEATHER + : ArenaEffectType.TERRAIN, + maxDuration: fieldEffectChangedEvent.duration, + duration: fieldEffectChangedEvent.duration }; - foundIndex = this.fieldEffectInfo.findIndex(info => [ newInfo.name, oldName ].includes(info.name)); - if (foundIndex === -1) { - if (newInfo.name !== undefined) { - this.fieldEffectInfo.push(newInfo); // Adds the info to the array if it doesn't already exist and is defined + foundIndex = this.fieldEffectInfo.findIndex(info => [ newInfo.name, oldName ].includes(info.name)); + if (foundIndex === -1) { + if (newInfo.name !== undefined) { + this.fieldEffectInfo.push(newInfo); // Adds the info to the array if it doesn't already exist and is defined + } + } else if (!newInfo.name) { + this.fieldEffectInfo.splice(foundIndex, 1); // Removes the old info if the new one is undefined + } else { + this.fieldEffectInfo[foundIndex] = newInfo; // Otherwise, replace the old info } - } else if (!newInfo.name) { - this.fieldEffectInfo.splice(foundIndex, 1); // Removes the old info if the new one is undefined - } else { - this.fieldEffectInfo[foundIndex] = newInfo; // Otherwise, replace the old info - } - break; + break; } this.updateFieldText(); diff --git a/src/ui/ball-ui-handler.ts b/src/ui/ball-ui-handler.ts index 0d97a79943d..9df6da36055 100644 --- a/src/ui/ball-ui-handler.ts +++ b/src/ui/ball-ui-handler.ts @@ -90,12 +90,12 @@ export default class BallUiHandler extends UiHandler { } } else { switch (button) { - case Button.UP: - success = this.setCursor(this.cursor ? this.cursor - 1 : pokeballTypeCount); - break; - case Button.DOWN: - success = this.setCursor(this.cursor < pokeballTypeCount ? this.cursor + 1 : 0); - break; + case Button.UP: + success = this.setCursor(this.cursor ? this.cursor - 1 : pokeballTypeCount); + break; + case Button.DOWN: + success = this.setCursor(this.cursor < pokeballTypeCount ? this.cursor + 1 : 0); + break; } } diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts index b2c0f1a1746..e2547a626de 100644 --- a/src/ui/challenges-select-ui-handler.ts +++ b/src/ui/challenges-select-ui-handler.ts @@ -376,66 +376,66 @@ export default class GameChallengesUiHandler extends UiHandler { } else { if (this.cursorObj?.visible && !this.startCursor.visible) { switch (button) { - case Button.UP: - if (this.cursor === 0) { - if (this.scrollCursor === 0) { + case Button.UP: + if (this.cursor === 0) { + if (this.scrollCursor === 0) { // When at the top of the menu and pressing UP, move to the bottommost item. - if (this.scene.gameMode.challenges.length > rowsToDisplay) { // If there are more than 9 challenges, scroll to the bottom + if (this.scene.gameMode.challenges.length > rowsToDisplay) { // If there are more than 9 challenges, scroll to the bottom // First, set the cursor to the last visible element, preparing for the scroll to the end. - const successA = this.setCursor(rowsToDisplay - 1); - // Then, adjust the scroll to display the bottommost elements of the menu. - const successB = this.setScrollCursor(this.scene.gameMode.challenges.length - rowsToDisplay); - success = successA && successB; // success is just there to play the little validation sound effect - } else { // If there are 9 or less challenges, just move to the bottom one - success = this.setCursor(this.scene.gameMode.challenges.length - 1); + const successA = this.setCursor(rowsToDisplay - 1); + // Then, adjust the scroll to display the bottommost elements of the menu. + const successB = this.setScrollCursor(this.scene.gameMode.challenges.length - rowsToDisplay); + success = successA && successB; // success is just there to play the little validation sound effect + } else { // If there are 9 or less challenges, just move to the bottom one + success = this.setCursor(this.scene.gameMode.challenges.length - 1); + } + } else { + success = this.setScrollCursor(this.scrollCursor - 1); } } else { - success = this.setScrollCursor(this.scrollCursor - 1); + success = this.setCursor(this.cursor - 1); } - } else { - success = this.setCursor(this.cursor - 1); - } - if (success) { - this.updateText(); - } - break; - case Button.DOWN: - if (this.cursor === rowsToDisplay - 1) { - if (this.scrollCursor < this.scene.gameMode.challenges.length - rowsToDisplay) { + if (success) { + this.updateText(); + } + break; + case Button.DOWN: + if (this.cursor === rowsToDisplay - 1) { + if (this.scrollCursor < this.scene.gameMode.challenges.length - rowsToDisplay) { // When at the bottom and pressing DOWN, scroll if possible. - success = this.setScrollCursor(this.scrollCursor + 1); - } else { + success = this.setScrollCursor(this.scrollCursor + 1); + } else { // When at the bottom of a scrolling menu and pressing DOWN, move to the topmost item. // First, set the cursor to the first visible element, preparing for the scroll to the top. - const successA = this.setCursor(0); - // Then, adjust the scroll to display the topmost elements of the menu. - const successB = this.setScrollCursor(0); - success = successA && successB; // success is just there to play the little validation sound effect - } - } else if (this.scene.gameMode.challenges.length < rowsToDisplay && this.cursor === this.scene.gameMode.challenges.length - 1) { + const successA = this.setCursor(0); + // Then, adjust the scroll to display the topmost elements of the menu. + const successB = this.setScrollCursor(0); + success = successA && successB; // success is just there to play the little validation sound effect + } + } else if (this.scene.gameMode.challenges.length < rowsToDisplay && this.cursor === this.scene.gameMode.challenges.length - 1) { // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item. - success = this.setCursor(0); - } else { - success = this.setCursor(this.cursor + 1); - } - if (success) { - this.updateText(); - } - break; - case Button.LEFT: + success = this.setCursor(0); + } else { + success = this.setCursor(this.cursor + 1); + } + if (success) { + this.updateText(); + } + break; + case Button.LEFT: // Moves the option cursor left, if possible. - success = this.getActiveChallenge().decreaseValue(); - if (success) { - this.updateText(); - } - break; - case Button.RIGHT: + success = this.getActiveChallenge().decreaseValue(); + if (success) { + this.updateText(); + } + break; + case Button.RIGHT: // Moves the option cursor right, if possible. - success = this.getActiveChallenge().increaseValue(); - if (success) { - this.updateText(); - } - break; + success = this.getActiveChallenge().increaseValue(); + if (success) { + this.updateText(); + } + break; } } } diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts index 2f65fa0b457..0f5edc28675 100644 --- a/src/ui/command-ui-handler.ts +++ b/src/ui/command-ui-handler.ts @@ -89,54 +89,54 @@ export default class CommandUiHandler extends UiHandler { if (button === Button.ACTION) { switch (cursor) { // Fight - case Command.FIGHT: - if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) { - return true; - } - ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); - success = true; - break; + case Command.FIGHT: + if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) { + return true; + } + ui.setMode(Mode.FIGHT, (this.scene.getCurrentPhase() as CommandPhase).getFieldIndex()); + success = true; + break; // Ball - case Command.BALL: - ui.setModeWithoutClear(Mode.BALL); - success = true; - break; + case Command.BALL: + ui.setModeWithoutClear(Mode.BALL); + success = true; + break; // Pokemon - case Command.POKEMON: - ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); - success = true; - break; + case Command.POKEMON: + ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted); + success = true; + break; // Run - case Command.RUN: - (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); - success = true; - break; + case Command.RUN: + (this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0); + success = true; + break; } } else { (this.scene.getCurrentPhase() as CommandPhase).cancel(); } } else { switch (button) { - case Button.UP: - if (cursor >= 2) { - success = this.setCursor(cursor - 2); - } - break; - case Button.DOWN: - if (cursor < 2) { - success = this.setCursor(cursor + 2); - } - break; - case Button.LEFT: - if (cursor % 2 === 1) { - success = this.setCursor(cursor - 1); - } - break; - case Button.RIGHT: - if (cursor % 2 === 0) { - success = this.setCursor(cursor + 1); - } - break; + case Button.UP: + if (cursor >= 2) { + success = this.setCursor(cursor - 2); + } + break; + case Button.DOWN: + if (cursor < 2) { + success = this.setCursor(cursor + 2); + } + break; + case Button.LEFT: + if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor % 2 === 0) { + success = this.setCursor(cursor + 1); + } + break; } } diff --git a/src/ui/daily-run-scoreboard.ts b/src/ui/daily-run-scoreboard.ts index b535a94d35c..b9c1c6ea49a 100644 --- a/src/ui/daily-run-scoreboard.ts +++ b/src/ui/daily-run-scoreboard.ts @@ -142,13 +142,13 @@ export class DailyRunScoreboard extends Phaser.GameObjects.Container { entryContainer.add(scoreLabel); switch (this.category) { - case ScoreboardCategory.DAILY: - const waveLabel = addTextObject(this.scene, 68, 0, wave, TextStyle.WINDOW, { fontSize: "54px" }); - entryContainer.add(waveLabel); - break; - case ScoreboardCategory.WEEKLY: - scoreLabel.x -= 16; - break; + case ScoreboardCategory.DAILY: + const waveLabel = addTextObject(this.scene, 68, 0, wave, TextStyle.WINDOW, { fontSize: "54px" }); + entryContainer.add(waveLabel); + break; + case ScoreboardCategory.WEEKLY: + scoreLabel.x -= 16; + break; } return entryContainer; diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts index eec44480c89..e16efe17036 100644 --- a/src/ui/dropdown.ts +++ b/src/ui/dropdown.ts @@ -115,18 +115,18 @@ export class DropDownOption extends Phaser.GameObjects.Container { */ private updateToggleIconColor(): void { switch (this.state) { - case DropDownState.ON: - this.toggle.setTint(this.onColor); - break; - case DropDownState.OFF: - this.toggle.setTint(this.offColor); - break; - case DropDownState.EXCLUDE: - this.toggle.setTint(this.excludeColor); - break; - case DropDownState.UNLOCKABLE: - this.toggle.setTint(this.unlockableColor); - break; + case DropDownState.ON: + this.toggle.setTint(this.onColor); + break; + case DropDownState.OFF: + this.toggle.setTint(this.offColor); + break; + case DropDownState.EXCLUDE: + this.toggle.setTint(this.excludeColor); + break; + case DropDownState.UNLOCKABLE: + this.toggle.setTint(this.unlockableColor); + break; } } @@ -500,18 +500,18 @@ export class DropDown extends Phaser.GameObjects.Container { }; switch (this.dropDownType) { - case DropDownType.MULTI: - case DropDownType.RADIAL: - return compareValues([ "val", "state" ]); + case DropDownType.MULTI: + case DropDownType.RADIAL: + return compareValues([ "val", "state" ]); - case DropDownType.HYBRID: - return compareValues([ "val", "state", "cursor" ]); + case DropDownType.HYBRID: + return compareValues([ "val", "state", "cursor" ]); - case DropDownType.SINGLE: - return compareValues([ "val", "state", "dir" ]); + case DropDownType.SINGLE: + return compareValues([ "val", "state", "dir" ]); - default: - return false; + default: + return false; } } diff --git a/src/ui/egg-gacha-ui-handler.ts b/src/ui/egg-gacha-ui-handler.ts index 3aa009b1b31..b14f5381a84 100644 --- a/src/ui/egg-gacha-ui-handler.ts +++ b/src/ui/egg-gacha-ui-handler.ts @@ -107,7 +107,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { let pokemonIconX = -20; let pokemonIconY = 6; - if ([ "de", "es", "fr", "ko", "pt-BR" ].includes(currentLanguage)) { + if ([ "de", "es-ES", "fr", "ko", "pt-BR" ].includes(currentLanguage)) { gachaTextStyle = TextStyle.SMALLER_WINDOW_ALT; gachaX = 2; gachaY = 2; @@ -115,7 +115,7 @@ export default class EggGachaUiHandler extends MessageUiHandler { let legendaryLabelX = gachaX; let legendaryLabelY = gachaY; - if ([ "de", "es" ].includes(currentLanguage)) { + if ([ "de", "es-ES" ].includes(currentLanguage)) { pokemonIconX = -25; pokemonIconY = 10; legendaryLabelX = -6; @@ -127,47 +127,47 @@ export default class EggGachaUiHandler extends MessageUiHandler { gachaInfoContainer.add(gachaUpLabel); switch (gachaType as GachaType) { - case GachaType.LEGENDARY: - if ([ "de", "es" ].includes(currentLanguage)) { - gachaUpLabel.setAlign("center"); - gachaUpLabel.setY(0); - } - if ([ "pt-BR" ].includes(currentLanguage)) { - gachaUpLabel.setX(legendaryLabelX - 2); - } else { - gachaUpLabel.setX(legendaryLabelX); - } - gachaUpLabel.setY(legendaryLabelY); + case GachaType.LEGENDARY: + if ([ "de", "es-ES" ].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } + if ([ "pt-BR" ].includes(currentLanguage)) { + gachaUpLabel.setX(legendaryLabelX - 2); + } else { + gachaUpLabel.setX(legendaryLabelX); + } + gachaUpLabel.setY(legendaryLabelY); - const pokemonIcon = this.scene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); - if ([ "pt-BR" ].includes(currentLanguage)) { - pokemonIcon.setX(pokemonIconX - 2); - } - pokemonIcon.setScale(0.5); - pokemonIcon.setOrigin(0, 0.5); + const pokemonIcon = this.scene.add.sprite(pokemonIconX, pokemonIconY, "pokemon_icons_0"); + if ([ "pt-BR" ].includes(currentLanguage)) { + pokemonIcon.setX(pokemonIconX - 2); + } + pokemonIcon.setScale(0.5); + pokemonIcon.setOrigin(0, 0.5); - gachaInfoContainer.add(pokemonIcon); - break; - case GachaType.MOVE: - if ([ "de", "es", "fr", "pt-BR" ].includes(currentLanguage)) { - gachaUpLabel.setAlign("center"); - gachaUpLabel.setY(0); - } + gachaInfoContainer.add(pokemonIcon); + break; + case GachaType.MOVE: + if ([ "de", "es-ES", "fr", "pt-BR" ].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } - gachaUpLabel.setText(i18next.t("egg:moveUPGacha")); - gachaUpLabel.setX(0); - gachaUpLabel.setOrigin(0.5, 0); - break; - case GachaType.SHINY: - if ([ "de", "fr", "ko" ].includes(currentLanguage)) { - gachaUpLabel.setAlign("center"); - gachaUpLabel.setY(0); - } + gachaUpLabel.setText(i18next.t("egg:moveUPGacha")); + gachaUpLabel.setX(0); + gachaUpLabel.setOrigin(0.5, 0); + break; + case GachaType.SHINY: + if ([ "de", "fr", "ko" ].includes(currentLanguage)) { + gachaUpLabel.setAlign("center"); + gachaUpLabel.setY(0); + } - gachaUpLabel.setText(i18next.t("egg:shinyUPGacha")); - gachaUpLabel.setX(0); - gachaUpLabel.setOrigin(0.5, 0); - break; + gachaUpLabel.setText(i18next.t("egg:shinyUPGacha")); + gachaUpLabel.setX(0); + gachaUpLabel.setOrigin(0.5, 0); + break; } const gachaKnob = this.scene.add.sprite(191, 89, "gacha_knob"); @@ -470,12 +470,12 @@ export default class EggGachaUiHandler extends MessageUiHandler { getGuaranteedEggTierFromPullCount(pullCount: number): EggTier { switch (pullCount) { - case 10: - return EggTier.RARE; - case 25: - return EggTier.EPIC; - default: - return EggTier.COMMON; + case 10: + return EggTier.RARE; + case 25: + return EggTier.EPIC; + default: + return EggTier.COMMON; } } @@ -567,11 +567,11 @@ export default class EggGachaUiHandler extends MessageUiHandler { updateGachaInfo(gachaType: GachaType): void { const infoContainer = this.gachaInfoContainers[gachaType]; switch (gachaType as GachaType) { - case GachaType.LEGENDARY: - const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.scene, new Date().getTime())); - const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; - pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); - break; + case GachaType.LEGENDARY: + const species = getPokemonSpecies(getLegendaryGachaSpeciesForTimestamp(this.scene, new Date().getTime())); + const pokemonIcon = infoContainer.getAt(1) as Phaser.GameObjects.Sprite; + pokemonIcon.setTexture(species.getIconAtlasKey(), species.getIconId(false)); + break; } } @@ -638,106 +638,106 @@ export default class EggGachaUiHandler extends MessageUiHandler { } } else { switch (button) { - case Button.ACTION: - switch (this.cursor) { - case 0: - 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 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { - if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - this.consumeVouchers(VoucherType.REGULAR, 1); - } - this.pull(); - success = true; - } else { - error = true; - this.showError(i18next.t("egg:tooManyEggs")); - } - break; - case 2: - if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - error = true; - this.showError(i18next.t("egg:notEnoughVouchers")); - } else if (this.scene.gameData.eggs.length < 95 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { - if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - this.consumeVouchers(VoucherType.PLUS, 1); - } - this.pull(5); - success = true; - } else { - error = true; - this.showError(i18next.t("egg:tooManyEggs")); - } - break; - case 1: - case 3: - if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) + case Button.ACTION: + switch (this.cursor) { + case 0: + 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 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 1); + } + this.pull(); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); + } + break; + case 2: + if (!this.scene.gameData.voucherCounts[VoucherType.PLUS] && !Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 95 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PLUS, 1); + } + this.pull(5); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); + } + break; + case 1: + case 3: + if ((this.cursor === 1 && this.scene.gameData.voucherCounts[VoucherType.REGULAR] < 10 && !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 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { - if (this.cursor === 3) { - if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - this.consumeVouchers(VoucherType.PREMIUM, 1); + error = true; + this.showError(i18next.t("egg:notEnoughVouchers")); + } else if (this.scene.gameData.eggs.length < 90 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + if (this.cursor === 3) { + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.PREMIUM, 1); + } + } else { + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.REGULAR, 10); + } + } + this.pull(10); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); } - } else { - if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - this.consumeVouchers(VoucherType.REGULAR, 10); + break; + case 4: + 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 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { + if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { + this.consumeVouchers(VoucherType.GOLDEN, 1); + } + this.pull(25); + success = true; + } else { + error = true; + this.showError(i18next.t("egg:tooManyEggs")); } - } - this.pull(10); - success = true; - } else { - error = true; - this.showError(i18next.t("egg:tooManyEggs")); + break; + case 5: + ui.revertMode(); + success = true; + break; } break; - case 4: - 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 || Overrides.UNLIMITED_EGG_COUNT_OVERRIDE) { - if (!Overrides.EGG_FREE_GACHA_PULLS_OVERRIDE) { - this.consumeVouchers(VoucherType.GOLDEN, 1); - } - this.pull(25); - success = true; - } else { - error = true; - this.showError(i18next.t("egg:tooManyEggs")); - } - break; - case 5: - ui.revertMode(); + case Button.CANCEL: + this.getUi().revertMode(); success = true; break; - } - break; - case Button.CANCEL: - this.getUi().revertMode(); - success = true; - break; - case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.DOWN: - if (this.cursor < 5) { - success = this.setCursor(this.cursor + 1); - } - break; - case Button.LEFT: - if (this.gachaCursor) { - success = this.setGachaCursor(this.gachaCursor - 1); - } - break; - case Button.RIGHT: - if (this.gachaCursor < Utils.getEnumKeys(GachaType).length - 1) { - success = this.setGachaCursor(this.gachaCursor + 1); - } - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < 5) { + success = this.setCursor(this.cursor + 1); + } + break; + case Button.LEFT: + if (this.gachaCursor) { + success = this.setGachaCursor(this.gachaCursor - 1); + } + break; + case Button.RIGHT: + if (this.gachaCursor < Utils.getEnumKeys(GachaType).length - 1) { + success = this.setGachaCursor(this.gachaCursor + 1); + } + break; } } } diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts index 78894a7bf00..ee6641a1a27 100644 --- a/src/ui/fight-ui-handler.ts +++ b/src/ui/fight-ui-handler.ts @@ -152,26 +152,26 @@ export default class FightUiHandler extends UiHandler implements InfoToggle { } } else { switch (button) { - case Button.UP: - if (cursor >= 2) { - success = this.setCursor(cursor - 2); - } - break; - case Button.DOWN: - if (cursor < 2) { - success = this.setCursor(cursor + 2); - } - break; - case Button.LEFT: - if (cursor % 2 === 1) { - success = this.setCursor(cursor - 1); - } - break; - case Button.RIGHT: - if (cursor % 2 === 0) { - success = this.setCursor(cursor + 1); - } - break; + case Button.UP: + if (cursor >= 2) { + success = this.setCursor(cursor - 2); + } + break; + case Button.DOWN: + if (cursor < 2) { + success = this.setCursor(cursor + 2); + } + break; + case Button.LEFT: + if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor % 2 === 0) { + success = this.setCursor(cursor + 1); + } + break; } } diff --git a/src/ui/form-modal-ui-handler.ts b/src/ui/form-modal-ui-handler.ts index 331154263ad..65ee9f2db10 100644 --- a/src/ui/form-modal-ui-handler.ts +++ b/src/ui/form-modal-ui-handler.ts @@ -5,7 +5,6 @@ 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 "i18next"; import { Button } from "#enums/buttons"; export interface FormModalConfig extends ModalConfig { @@ -19,6 +18,7 @@ export abstract class FormModalUiHandler extends ModalUiHandler { protected errorMessage: Phaser.GameObjects.Text; protected submitAction: Function | null; protected tween: Phaser.Tweens.Tween; + protected formLabels: Phaser.GameObjects.Text[]; constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); @@ -26,12 +26,18 @@ export abstract class FormModalUiHandler extends ModalUiHandler { this.editing = false; this.inputContainers = []; this.inputs = []; + this.formLabels = []; } - abstract getFields(): string[]; + /** + * Get configuration for all fields that should be part of the modal + * Gets used by {@linkcode updateFields} to add the proper text inputs and labels to the view + * @returns array of {@linkcode InputFieldConfig} + */ + abstract getInputFieldConfigs(): InputFieldConfig[]; getHeight(config?: ModalConfig): number { - return 20 * this.getFields().length + (this.getModalTitle() ? 26 : 0) + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + this.getButtonTopMargin() + 28; + return 20 * this.getInputFieldConfigs().length + (this.getModalTitle() ? 26 : 0) + ((config as FormModalConfig)?.errorMessage ? 12 : 0) + this.getButtonTopMargin() + 28; } getReadableErrorMessage(error: string): string { @@ -45,37 +51,50 @@ export abstract class FormModalUiHandler extends ModalUiHandler { setup(): void { super.setup(); - const fields = this.getFields(); + const config = this.getInputFieldConfigs(); const hasTitle = !!this.getModalTitle(); - fields.forEach((field, f) => { - const label = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * f, field, TextStyle.TOOLTIP_CONTENT); + if (config.length >= 1) { + this.updateFields(config, hasTitle); + } - this.modalContainer.add(label); + this.errorMessage = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * (config.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT); + this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); + this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); + this.errorMessage.setVisible(false); + this.modalContainer.add(this.errorMessage); + } + + protected updateFields(fieldsConfig: InputFieldConfig[], hasTitle: boolean) { + this.inputContainers = []; + this.inputs = []; + this.formLabels = []; + fieldsConfig.forEach((config, f) => { + const label = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * f, config.label, TextStyle.TOOLTIP_CONTENT); + label.name = "formLabel" + f; + + this.formLabels.push(label); + this.modalContainer.add(this.formLabels[this.formLabels.length - 1]); const inputContainer = this.scene.add.container(70, (hasTitle ? 28 : 2) + 20 * f); inputContainer.setVisible(false); const inputBg = addWindow(this.scene, 0, 0, 80, 16, false, false, 0, 0, WindowVariant.XTHIN); - const isPassword = field.includes(i18next.t("menu:password")) || field.includes(i18next.t("menu:confirmPassword")); - const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20 }); + const isPassword = config?.isPassword; + const isReadOnly = config?.isReadOnly; + const input = addTextInputObject(this.scene, 4, -2, 440, 116, TextStyle.TOOLTIP_CONTENT, { type: isPassword ? "password" : "text", maxLength: isPassword ? 64 : 20, readOnly: isReadOnly }); input.setOrigin(0, 0); inputContainer.add(inputBg); inputContainer.add(input); - this.modalContainer.add(inputContainer); this.inputContainers.push(inputContainer); + this.modalContainer.add(inputContainer); + this.inputs.push(input); }); - - this.errorMessage = addTextObject(this.scene, 10, (hasTitle ? 31 : 5) + 20 * (fields.length - 1) + 16 + this.getButtonTopMargin(), "", TextStyle.TOOLTIP_CONTENT); - this.errorMessage.setColor(this.getTextColor(TextStyle.SUMMARY_PINK)); - this.errorMessage.setShadowColor(this.getTextColor(TextStyle.SUMMARY_PINK, true)); - this.errorMessage.setVisible(false); - this.modalContainer.add(this.errorMessage); } show(args: any[]): boolean { @@ -149,3 +168,9 @@ export abstract class FormModalUiHandler extends ModalUiHandler { } } } + +export interface InputFieldConfig { + label: string, + isPassword?: boolean, + isReadOnly?: boolean +} diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 4d7b0855092..671bed29036 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -351,16 +351,16 @@ export default class GameStatsUiHandler extends UiHandler { this.scene.ui.revertMode(); } else { switch (button) { - case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.DOWN: - if (this.cursor < Math.ceil((Object.keys(displayStats).length - 18) / 2)) { - success = this.setCursor(this.cursor + 1); - } - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.DOWN: + if (this.cursor < Math.ceil((Object.keys(displayStats).length - 18) / 2)) { + success = this.setCursor(this.cursor + 1); + } + break; } } diff --git a/src/ui/login-form-ui-handler.ts b/src/ui/login-form-ui-handler.ts index 192a6cefa7a..26a2a225ec6 100644 --- a/src/ui/login-form-ui-handler.ts +++ b/src/ui/login-form-ui-handler.ts @@ -1,4 +1,4 @@ -import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; @@ -17,9 +17,9 @@ interface BuildInteractableImageOpts { export default class LoginFormUiHandler extends FormModalUiHandler { private readonly ERR_USERNAME: string = "invalid username"; - private readonly ERR_PASSWORD: string = "invalid password"; - private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; - private readonly ERR_PASSWORD_MATCH: string = "password doesn't match"; + private readonly ERR_PASSWORD: string = "invalid password"; + private readonly ERR_ACCOUNT_EXIST: string = "account doesn't exist"; + private readonly ERR_PASSWORD_MATCH: string = "password doesn't match"; private readonly ERR_NO_SAVES: string = "No save files found"; private readonly ERR_TOO_MANY_SAVES: string = "Too many save files found"; @@ -75,10 +75,6 @@ export default class LoginFormUiHandler extends FormModalUiHandler { return i18next.t("menu:login"); } - override getFields(_config?: ModalConfig): string[] { - return [ i18next.t("menu:username"), i18next.t("menu:password") ]; - } - override getWidth(_config?: ModalConfig): number { return 160; } @@ -97,23 +93,30 @@ export default class LoginFormUiHandler extends FormModalUiHandler { error = error.slice(0, colonIndex); } switch (error) { - case this.ERR_USERNAME: - return i18next.t("menu:invalidLoginUsername"); - case this.ERR_PASSWORD: - return i18next.t("menu:invalidLoginPassword"); - case this.ERR_ACCOUNT_EXIST: - return i18next.t("menu:accountNonExistent"); - case this.ERR_PASSWORD_MATCH: - return i18next.t("menu:unmatchingPassword"); - case this.ERR_NO_SAVES: - return i18next.t("menu:noSaves"); - case this.ERR_TOO_MANY_SAVES: - return i18next.t("menu:tooManySaves"); + case this.ERR_USERNAME: + return i18next.t("menu:invalidLoginUsername"); + case this.ERR_PASSWORD: + return i18next.t("menu:invalidLoginPassword"); + case this.ERR_ACCOUNT_EXIST: + return i18next.t("menu:accountNonExistent"); + case this.ERR_PASSWORD_MATCH: + return i18next.t("menu:unmatchingPassword"); + case this.ERR_NO_SAVES: + return "P01: " + i18next.t("menu:noSaves"); + case this.ERR_TOO_MANY_SAVES: + return "P02: " + i18next.t("menu:tooManySaves"); } return super.getReadableErrorMessage(error); } + override getInputFieldConfigs(): InputFieldConfig[] { + const inputFieldConfigs: InputFieldConfig[] = []; + inputFieldConfigs.push({ label: i18next.t("menu:username") }); + inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); + return inputFieldConfigs; + } + override show(args: any[]): boolean { if (super.show(args)) { @@ -164,7 +167,7 @@ export default class LoginFormUiHandler extends FormModalUiHandler { [ this.discordImage, this.googleImage, this.usernameInfoImage ].forEach((img) => img.off("pointerdown")); } - private processExternalProvider(config: ModalConfig) : void { + private processExternalProvider(config: ModalConfig): void { this.externalPartyTitle.setText(i18next.t("menu:orUse") ?? ""); this.externalPartyTitle.setX(20 + this.externalPartyTitle.text.length); this.externalPartyTitle.setVisible(true); diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts index adebf9fb912..fea0a70af91 100644 --- a/src/ui/menu-ui-handler.ts +++ b/src/ui/menu-ui-handler.ts @@ -13,6 +13,7 @@ import { GameDataType } from "#enums/game-data-type"; import BgmBar from "#app/ui/bgm-bar"; import AwaitableUiHandler from "./awaitable-ui-handler"; import { SelectModifierPhase } from "#app/phases/select-modifier-phase"; +import { AdminMode, getAdminModeName } from "./admin-ui-handler"; enum MenuOptions { GAME_SETTINGS, @@ -31,7 +32,7 @@ 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"; -const donateUrl = "https://github.com/sponsors/patapancakes"; +const donateUrl = "https://github.com/sponsors/pagefaultgames"; export default class MenuUiHandler extends MessageUiHandler { private readonly textPadding = 8; @@ -387,16 +388,41 @@ export default class MenuUiHandler extends MessageUiHandler { communityOptions.push({ label: "Admin", handler: () => { - ui.playSelect(); - ui.setOverlayMode(Mode.ADMIN, { - buttonActions: [ - () => { - ui.revertMode(); - }, - () => { - ui.revertMode(); + + const skippedAdminModes: AdminMode[] = [ AdminMode.ADMIN ]; // this is here so that we can skip the menu populating enums that aren't meant for the menu, such as the AdminMode.ADMIN + const options: OptionSelectItem[] = []; + Object.values(AdminMode).filter((v) => !isNaN(Number(v)) && !skippedAdminModes.includes(v as AdminMode)).forEach((mode) => { // this gets all the enums in a way we can use + options.push({ + label: getAdminModeName(mode as AdminMode), + handler: () => { + ui.playSelect(); + ui.setOverlayMode(Mode.ADMIN, { + buttonActions: [ + // we double revert here and below to go back 2 layers of menus + () => { + ui.revertMode(); + ui.revertMode(); + }, + () => { + ui.revertMode(); + ui.revertMode(); + } + ] + }, mode); // mode is our AdminMode enum + return true; } - ] + }); + }); + options.push({ + label: "Cancel", + handler: () => { + ui.revertMode(); + return true; + } + }); + this.scene.ui.setOverlayMode(Mode.OPTION_SELECT, { + options: options, + delay: 0 }); return true; }, @@ -468,148 +494,148 @@ export default class MenuUiHandler extends MessageUiHandler { } this.showText("", 0); switch (adjustedCursor) { - case MenuOptions.GAME_SETTINGS: - ui.setOverlayMode(Mode.SETTINGS); - success = true; - break; - case MenuOptions.ACHIEVEMENTS: - ui.setOverlayMode(Mode.ACHIEVEMENTS); - success = true; - break; - case MenuOptions.STATS: - ui.setOverlayMode(Mode.GAME_STATS); - success = true; - break; - case MenuOptions.RUN_HISTORY: - ui.setOverlayMode(Mode.RUN_HISTORY); - success = true; - break; - case MenuOptions.EGG_LIST: - if (this.scene.gameData.eggs.length) { + case MenuOptions.GAME_SETTINGS: + ui.setOverlayMode(Mode.SETTINGS); + success = true; + break; + case MenuOptions.ACHIEVEMENTS: + ui.setOverlayMode(Mode.ACHIEVEMENTS); + success = true; + break; + case MenuOptions.STATS: + ui.setOverlayMode(Mode.GAME_STATS); + success = true; + break; + case MenuOptions.RUN_HISTORY: + ui.setOverlayMode(Mode.RUN_HISTORY); + success = true; + break; + case MenuOptions.EGG_LIST: + if (this.scene.gameData.eggs.length) { + ui.revertMode(); + ui.setOverlayMode(Mode.EGG_LIST); + success = true; + } else { + ui.showText(i18next.t("menuUiHandler:noEggs"), null, () => ui.showText(""), Utils.fixedInt(1500)); + error = true; + } + break; + case MenuOptions.EGG_GACHA: ui.revertMode(); - ui.setOverlayMode(Mode.EGG_LIST); + ui.setOverlayMode(Mode.EGG_GACHA); success = true; - } else { - ui.showText(i18next.t("menuUiHandler:noEggs"), null, () => ui.showText(""), Utils.fixedInt(1500)); - error = true; - } - break; - case MenuOptions.EGG_GACHA: - ui.revertMode(); - ui.setOverlayMode(Mode.EGG_GACHA); - success = true; - break; - case MenuOptions.MANAGE_DATA: - if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { - this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, - { - label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), - handler: () => { - if (loggedInUser?.discordId === "") { - const token = Utils.getCookie(Utils.sessionIdKey); - const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); - const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; - const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&state=${token}&prompt=none`; - window.open(discordUrl, "_self"); - return true; - } else { - Utils.apiPost("/auth/discord/logout", undefined, undefined, true).then(res => { - if (!res.ok) { - console.error(`Unlink failed (${res.status}: ${res.statusText})`); - } - updateUserInfo().then(() => this.scene.reset(true, true)); - }); - return true; + break; + case MenuOptions.MANAGE_DATA: + if (!bypassLogin && !this.manageDataConfig.options.some(o => o.label === i18next.t("menuUiHandler:linkDiscord") || o.label === i18next.t("menuUiHandler:unlinkDiscord"))) { + this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0, + { + label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"), + handler: () => { + if (loggedInUser?.discordId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/discord/callback`); + const discordId = import.meta.env.VITE_DISCORD_CLIENT_ID; + const discordUrl = `https://discord.com/api/oauth2/authorize?client_id=${discordId}&redirect_uri=${redirectUri}&response_type=code&scope=identify&state=${token}&prompt=none`; + window.open(discordUrl, "_self"); + return true; + } else { + Utils.apiPost("/auth/discord/logout", undefined, undefined, true).then(res => { + if (!res.ok) { + console.error(`Unlink failed (${res.status}: ${res.statusText})`); + } + updateUserInfo().then(() => this.scene.reset(true, true)); + }); + return true; + } } - } - }, - { - label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), - handler: () => { - if (loggedInUser?.googleId === "") { - const token = Utils.getCookie(Utils.sessionIdKey); - const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); - const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; - const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&response_type=code&redirect_uri=${redirectUri}&scope=openid&state=${token}`; - window.open(googleUrl, "_self"); - return true; - } else { - Utils.apiPost("/auth/google/logout", undefined, undefined, true).then(res => { - if (!res.ok) { - console.error(`Unlink failed (${res.status}: ${res.statusText})`); - } - updateUserInfo().then(() => this.scene.reset(true, true)); - }); - return true; + }, + { + label: loggedInUser?.googleId === "" ? i18next.t("menuUiHandler:linkGoogle") : i18next.t("menuUiHandler:unlinkGoogle"), + handler: () => { + if (loggedInUser?.googleId === "") { + const token = Utils.getCookie(Utils.sessionIdKey); + const redirectUri = encodeURIComponent(`${import.meta.env.VITE_SERVER_URL}/auth/google/callback`); + const googleId = import.meta.env.VITE_GOOGLE_CLIENT_ID; + const googleUrl = `https://accounts.google.com/o/oauth2/auth?client_id=${googleId}&response_type=code&redirect_uri=${redirectUri}&scope=openid&state=${token}`; + window.open(googleUrl, "_self"); + return true; + } else { + Utils.apiPost("/auth/google/logout", undefined, undefined, true).then(res => { + if (!res.ok) { + console.error(`Unlink failed (${res.status}: ${res.statusText})`); + } + updateUserInfo().then(() => this.scene.reset(true, true)); + }); + return true; + } } - } - }); - } - ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); - success = true; - break; - case MenuOptions.COMMUNITY: - ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.communityConfig); - success = true; - break; - case MenuOptions.SAVE_AND_QUIT: - if (this.scene.currentBattle) { + }); + } + ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.manageDataConfig); success = true; - const doSaveQuit = () => { - ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => - this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => { + break; + case MenuOptions.COMMUNITY: + ui.setOverlayMode(Mode.MENU_OPTION_SELECT, this.communityConfig); + success = true; + break; + case MenuOptions.SAVE_AND_QUIT: + if (this.scene.currentBattle) { + success = true; + const doSaveQuit = () => { + ui.setMode(Mode.LOADING, { + buttonActions: [], fadeOut: () => + this.scene.gameData.saveAll(this.scene, true, true, true, true).then(() => { - this.scene.reset(true); - }) + this.scene.reset(true); + }) + }); + }; + if (this.scene.currentBattle.turn > 1) { + ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { + if (!this.active) { + this.showText("", 0); + return; + } + ui.setOverlayMode(Mode.CONFIRM, doSaveQuit, () => { + ui.revertMode(); + this.showText("", 0); + }, false, -98); + }); + } else { + doSaveQuit(); + } + } else { + error = true; + } + break; + case MenuOptions.LOG_OUT: + success = true; + const doLogout = () => { + ui.setMode(Mode.LOADING, { + buttonActions: [], fadeOut: () => Utils.apiFetch("account/logout", true).then(res => { + if (!res.ok) { + console.error(`Log out failed (${res.status}: ${res.statusText})`); + } + Utils.removeCookie(Utils.sessionIdKey); + updateUserInfo().then(() => this.scene.reset(true, true)); + }) }); }; - if (this.scene.currentBattle.turn > 1) { + if (this.scene.currentBattle) { ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { if (!this.active) { this.showText("", 0); return; } - ui.setOverlayMode(Mode.CONFIRM, doSaveQuit, () => { + ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { ui.revertMode(); this.showText("", 0); }, false, -98); }); } else { - doSaveQuit(); + doLogout(); } - } else { - error = true; - } - break; - case MenuOptions.LOG_OUT: - success = true; - const doLogout = () => { - ui.setMode(Mode.LOADING, { - buttonActions: [], fadeOut: () => Utils.apiFetch("account/logout", true).then(res => { - if (!res.ok) { - console.error(`Log out failed (${res.status}: ${res.statusText})`); - } - Utils.removeCookie(Utils.sessionIdKey); - updateUserInfo().then(() => this.scene.reset(true, true)); - }) - }); - }; - if (this.scene.currentBattle) { - ui.showText(i18next.t("menuUiHandler:losingProgressionWarning"), null, () => { - if (!this.active) { - this.showText("", 0); - return; - } - ui.setOverlayMode(Mode.CONFIRM, doLogout, () => { - ui.revertMode(); - this.showText("", 0); - }, false, -98); - }); - } else { - doLogout(); - } - break; + break; } } else if (button === Button.CANCEL) { success = true; @@ -620,20 +646,20 @@ export default class MenuUiHandler extends MessageUiHandler { }); } else { switch (button) { - case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else { - success = this.setCursor(this.menuOptions.length - 1); - } - break; - case Button.DOWN: - if (this.cursor + 1 < this.menuOptions.length) { - success = this.setCursor(this.cursor + 1); - } else { - success = this.setCursor(0); - } - break; + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else { + success = this.setCursor(this.menuOptions.length - 1); + } + break; + case Button.DOWN: + if (this.cursor + 1 < this.menuOptions.length) { + success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(0); + } + break; } } diff --git a/src/ui/message-ui-handler.ts b/src/ui/message-ui-handler.ts index f1b8ed981ee..5ae4707e329 100644 --- a/src/ui/message-ui-handler.ts +++ b/src/ui/message-ui-handler.ts @@ -56,18 +56,18 @@ export default abstract class MessageUiHandler extends AwaitableUiHandler { let actionMatch: RegExpExecArray | null; while ((actionMatch = actionPattern.exec(text))) { switch (actionMatch[1]) { - case "c": - charVarMap.set(actionMatch.index, actionMatch[2]); - break; - case "d": - delayMap.set(actionMatch.index, parseInt(actionMatch[2])); - break; - case "s": - soundMap.set(actionMatch.index, actionMatch[2]); - break; - case "f": - fadeMap.set(actionMatch.index, parseInt(actionMatch[2])); - break; + case "c": + charVarMap.set(actionMatch.index, actionMatch[2]); + break; + case "d": + delayMap.set(actionMatch.index, parseInt(actionMatch[2])); + break; + case "s": + soundMap.set(actionMatch.index, actionMatch[2]); + break; + case "f": + fadeMap.set(actionMatch.index, parseInt(actionMatch[2])); + break; } text = text.slice(0, actionMatch.index) + text.slice(actionMatch.index + actionMatch[2].length + 4); } diff --git a/src/ui/modal-ui-handler.ts b/src/ui/modal-ui-handler.ts index 60204f18c4a..79f1e8afeed 100644 --- a/src/ui/modal-ui-handler.ts +++ b/src/ui/modal-ui-handler.ts @@ -15,12 +15,14 @@ export abstract class ModalUiHandler extends UiHandler { protected titleText: Phaser.GameObjects.Text; protected buttonContainers: Phaser.GameObjects.Container[]; protected buttonBgs: Phaser.GameObjects.NineSlice[]; + protected buttonLabels: Phaser.GameObjects.Text[]; constructor(scene: BattleScene, mode: Mode | null = null) { super(scene, mode); this.buttonContainers = []; this.buttonBgs = []; + this.buttonLabels = []; } abstract getModalTitle(config?: ModalConfig): string; @@ -75,6 +77,7 @@ export abstract class ModalUiHandler extends UiHandler { const buttonContainer = this.scene.add.container(0, buttonTopMargin); + this.buttonLabels.push(buttonLabel); this.buttonBgs.push(buttonBg); this.buttonContainers.push(buttonContainer); diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts index 1948d75ac4c..3f89ebe415f 100644 --- a/src/ui/modifier-select-ui-handler.ts +++ b/src/ui/modifier-select-ui-handler.ts @@ -357,79 +357,79 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { } } else { switch (button) { - case Button.UP: - if (this.rowCursor === 0 && this.cursor === 3) { - success = this.setCursor(0); - } else if (this.rowCursor < this.shopOptionsRows.length + 1) { - success = this.setRowCursor(this.rowCursor + 1); - } - break; - case Button.DOWN: - if (this.rowCursor) { - success = this.setRowCursor(this.rowCursor - 1); - } else if (this.lockRarityButtonContainer.visible && this.cursor === 0) { - success = this.setCursor(3); - } - break; - case Button.LEFT: - if (!this.rowCursor) { - switch (this.cursor) { - case 0: - success = false; - break; - case 1: - if (this.lockRarityButtonContainer.visible) { - success = this.setCursor(3); - } else { - success = this.rerollButtonContainer.visible && this.setCursor(0); - } - break; - case 2: - if (this.transferButtonContainer.visible) { - success = this.setCursor(1); - } else if (this.rerollButtonContainer.visible) { - success = this.setCursor(0); - } else { - success = false; - } - break; + case Button.UP: + if (this.rowCursor === 0 && this.cursor === 3) { + success = this.setCursor(0); + } else if (this.rowCursor < this.shopOptionsRows.length + 1) { + success = this.setRowCursor(this.rowCursor + 1); } - } else if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else if (this.rowCursor === 1 && this.rerollButtonContainer.visible) { - success = this.setRowCursor(0); - } - break; - case Button.RIGHT: - if (!this.rowCursor) { - switch (this.cursor) { - case 0: - if (this.transferButtonContainer.visible) { - success = this.setCursor(1); - } else { - success = this.setCursor(2); - } - break; - case 1: - success = this.setCursor(2); - break; - case 2: - success = false; - break; - case 3: - if (this.transferButtonContainer.visible) { - success = this.setCursor(1); - } else { - success = this.setCursor(2); - } - break; + break; + case Button.DOWN: + if (this.rowCursor) { + success = this.setRowCursor(this.rowCursor - 1); + } else if (this.lockRarityButtonContainer.visible && this.cursor === 0) { + success = this.setCursor(3); } - } else if (this.cursor < this.getRowItems(this.rowCursor) - 1) { - success = this.setCursor(this.cursor + 1); - } else if (this.rowCursor === 1 && this.transferButtonContainer.visible) { - success = this.setRowCursor(0); - } - break; + break; + case Button.LEFT: + if (!this.rowCursor) { + switch (this.cursor) { + case 0: + success = false; + break; + case 1: + if (this.lockRarityButtonContainer.visible) { + success = this.setCursor(3); + } else { + success = this.rerollButtonContainer.visible && this.setCursor(0); + } + break; + case 2: + if (this.transferButtonContainer.visible) { + success = this.setCursor(1); + } else if (this.rerollButtonContainer.visible) { + success = this.setCursor(0); + } else { + success = false; + } + break; + } + } else if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.rowCursor === 1 && this.rerollButtonContainer.visible) { + success = this.setRowCursor(0); + } + break; + case Button.RIGHT: + if (!this.rowCursor) { + switch (this.cursor) { + case 0: + if (this.transferButtonContainer.visible) { + success = this.setCursor(1); + } else { + success = this.setCursor(2); + } + break; + case 1: + success = this.setCursor(2); + break; + case 2: + success = false; + break; + case 3: + if (this.transferButtonContainer.visible) { + success = this.setCursor(1); + } else { + success = this.setCursor(2); + } + break; + } + } else if (this.cursor < this.getRowItems(this.rowCursor) - 1) { + success = this.setCursor(this.cursor + 1); + } else if (this.rowCursor === 1 && this.transferButtonContainer.visible) { + success = this.setRowCursor(0); + } + break; } } @@ -527,12 +527,12 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler { private getRowItems(rowCursor: integer): integer { switch (rowCursor) { - case 0: - return 3; - case 1: - return this.options.length; - default: - return this.shopOptionsRows[this.shopOptionsRows.length - (rowCursor - 1)].length; + case 0: + return 3; + case 1: + return this.options.length; + default: + return this.shopOptionsRows[this.shopOptionsRows.length - (rowCursor - 1)].length; } } diff --git a/src/ui/mystery-encounter-ui-handler.ts b/src/ui/mystery-encounter-ui-handler.ts index 0a838707432..b568f8b71de 100644 --- a/src/ui/mystery-encounter-ui-handler.ts +++ b/src/ui/mystery-encounter-ui-handler.ts @@ -159,16 +159,16 @@ export default class MysteryEncounterUiHandler extends UiHandler { } } else { switch (this.optionsContainer.getAll()?.length) { - default: - case 3: - success = this.handleTwoOptionMoveInput(button); - break; - case 4: - success = this.handleThreeOptionMoveInput(button); - break; - case 5: - success = this.handleFourOptionMoveInput(button); - break; + default: + case 3: + success = this.handleTwoOptionMoveInput(button); + break; + case 4: + success = this.handleThreeOptionMoveInput(button); + break; + case 5: + success = this.handleFourOptionMoveInput(button); + break; } this.displayOptionTooltip(); @@ -185,26 +185,26 @@ export default class MysteryEncounterUiHandler extends UiHandler { let success = false; const cursor = this.getCursor(); switch (button) { - case Button.UP: - if (cursor < this.viewPartyIndex) { - success = this.setCursor(this.viewPartyIndex); - } - break; - case Button.DOWN: - if (cursor === this.viewPartyIndex) { - success = this.setCursor(1); - } - break; - case Button.LEFT: - if (cursor > 0) { - success = this.setCursor(cursor - 1); - } - break; - case Button.RIGHT: - if (cursor < this.viewPartyIndex) { - success = this.setCursor(cursor + 1); - } - break; + case Button.UP: + if (cursor < this.viewPartyIndex) { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } + break; + case Button.LEFT: + if (cursor > 0) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor < this.viewPartyIndex) { + success = this.setCursor(cursor + 1); + } + break; } return success; @@ -214,34 +214,34 @@ export default class MysteryEncounterUiHandler extends UiHandler { let success = false; const cursor = this.getCursor(); switch (button) { - case Button.UP: - if (cursor === 2) { - success = this.setCursor(cursor - 2); - } else { - success = this.setCursor(this.viewPartyIndex); - } - break; - case Button.DOWN: - if (cursor === this.viewPartyIndex) { - success = this.setCursor(1); - } else { - success = this.setCursor(2); - } - break; - case Button.LEFT: - if (cursor === this.viewPartyIndex) { - success = this.setCursor(1); - } else if (cursor === 1) { - success = this.setCursor(cursor - 1); - } - break; - case Button.RIGHT: - if (cursor === 1) { - success = this.setCursor(this.viewPartyIndex); - } else if (cursor < 1) { - success = this.setCursor(cursor + 1); - } - break; + case Button.UP: + if (cursor === 2) { + success = this.setCursor(cursor - 2); + } else { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else { + success = this.setCursor(2); + } + break; + case Button.LEFT: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else if (cursor === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor === 1) { + success = this.setCursor(this.viewPartyIndex); + } else if (cursor < 1) { + success = this.setCursor(cursor + 1); + } + break; } return success; @@ -251,34 +251,34 @@ export default class MysteryEncounterUiHandler extends UiHandler { let success = false; const cursor = this.getCursor(); switch (button) { - case Button.UP: - if (cursor >= 2 && cursor !== this.viewPartyIndex) { - success = this.setCursor(cursor - 2); - } else { - success = this.setCursor(this.viewPartyIndex); - } - break; - case Button.DOWN: - if (cursor <= 1) { - success = this.setCursor(cursor + 2); - } else if (cursor === this.viewPartyIndex) { - success = this.setCursor(1); - } - break; - case Button.LEFT: - if (cursor === this.viewPartyIndex) { - success = this.setCursor(1); - } else if (cursor % 2 === 1) { - success = this.setCursor(cursor - 1); - } - break; - case Button.RIGHT: - if (cursor === 1) { - success = this.setCursor(this.viewPartyIndex); - } else if (cursor % 2 === 0 && cursor !== this.viewPartyIndex) { - success = this.setCursor(cursor + 1); - } - break; + case Button.UP: + if (cursor >= 2 && cursor !== this.viewPartyIndex) { + success = this.setCursor(cursor - 2); + } else { + success = this.setCursor(this.viewPartyIndex); + } + break; + case Button.DOWN: + if (cursor <= 1) { + success = this.setCursor(cursor + 2); + } else if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } + break; + case Button.LEFT: + if (cursor === this.viewPartyIndex) { + success = this.setCursor(1); + } else if (cursor % 2 === 1) { + success = this.setCursor(cursor - 1); + } + break; + case Button.RIGHT: + if (cursor === 1) { + success = this.setCursor(this.viewPartyIndex); + } else if (cursor % 2 === 0 && cursor !== this.viewPartyIndex) { + success = this.setCursor(cursor + 1); + } + break; } return success; @@ -351,16 +351,16 @@ export default class MysteryEncounterUiHandler extends UiHandler { let optionText: BBCodeText; switch (this.encounterOptions.length) { - default: - case 2: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); - break; - case 3: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); - break; - case 4: - optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); - break; + default: + case 2: + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, 8, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + break; + case 3: + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + break; + case 4: + optionText = addBBCodeTextObject(this.scene, i % 2 === 0 ? 0 : 100, i < 2 ? 0 : 16, "-", TextStyle.WINDOW, { fontSize: "80px", lineSpacing: -8 }); + break; } this.optionsMeetsReqs.push(option.meetsRequirements(this.scene)); diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts index cfc5e146f08..e96fde8d54f 100644 --- a/src/ui/party-ui-handler.ts +++ b/src/ui/party-ui-handler.ts @@ -539,42 +539,42 @@ export default class PartyUiHandler extends MessageUiHandler { return true; } else { switch (button) { - case Button.LEFT: + case Button.LEFT: /** Decrease quantity for the current item and update UI */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === 1 ? this.transferQuantitiesMax[option] : this.transferQuantities[option] - 1; - this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ - } - break; - case Button.RIGHT: + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + this.transferQuantities[option] = this.transferQuantities[option] === 1 ? this.transferQuantitiesMax[option] : this.transferQuantities[option] - 1; + this.updateOptions(); + success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ + } + break; + case Button.RIGHT: /** Increase quantity for the current item and update UI */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - this.transferQuantities[option] = this.transferQuantities[option] === this.transferQuantitiesMax[option] ? 1 : this.transferQuantities[option] + 1; - this.updateOptions(); - success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ - } - break; - case Button.UP: - /** If currently selecting items to transfer, reset quantity selection */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - if (option !== PartyOption.ALL) { - this.transferQuantities[option] = this.transferQuantitiesMax[option]; + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + this.transferQuantities[option] = this.transferQuantities[option] === this.transferQuantitiesMax[option] ? 1 : this.transferQuantities[option] + 1; + this.updateOptions(); + success = this.setCursor(this.optionsCursor); /** Place again the cursor at the same position. Necessary, otherwise the cursor disappears */ } - this.updateOptions(); - } - success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); /** Move cursor */ - break; - case Button.DOWN: + break; + case Button.UP: /** If currently selecting items to transfer, reset quantity selection */ - if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { - if (option !== PartyOption.ALL) { - this.transferQuantities[option] = this.transferQuantitiesMax[option]; + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + if (option !== PartyOption.ALL) { + this.transferQuantities[option] = this.transferQuantitiesMax[option]; + } + this.updateOptions(); } - this.updateOptions(); - } - success = this.setCursor(this.optionsCursor < this.options.length - 1 ? this.optionsCursor + 1 : 0); /** Move cursor */ - break; + success = this.setCursor(this.optionsCursor ? this.optionsCursor - 1 : this.options.length - 1); /** Move cursor */ + break; + case Button.DOWN: + /** If currently selecting items to transfer, reset quantity selection */ + if (this.partyUiMode === PartyUiMode.MODIFIER_TRANSFER) { + 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 */ + break; } // show move description @@ -631,28 +631,28 @@ export default class PartyUiHandler extends MessageUiHandler { const battlerCount = this.scene.currentBattle.getBattlerCount(); switch (button) { - case Button.UP: - success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); - break; - case Button.DOWN: - success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); - break; - case Button.LEFT: - if (this.cursor >= battlerCount && this.cursor <= 6) { - success = this.setCursor(0); - } - break; - case Button.RIGHT: - if (slotCount === battlerCount) { - success = this.setCursor(6); + case Button.UP: + success = this.setCursor(this.cursor ? this.cursor < 6 ? this.cursor - 1 : slotCount - 1 : 6); break; - } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { - success = this.setCursor(2); + case Button.DOWN: + success = this.setCursor(this.cursor < 6 ? this.cursor < slotCount - 1 ? this.cursor + 1 : 6 : 0); break; - } else if (slotCount > battlerCount && this.cursor < battlerCount) { - success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + case Button.LEFT: + if (this.cursor >= battlerCount && this.cursor <= 6) { + success = this.setCursor(0); + } break; - } + case Button.RIGHT: + if (slotCount === battlerCount) { + success = this.setCursor(6); + break; + } else if (battlerCount >= 2 && slotCount > battlerCount && this.getCursor() === 0 && this.lastCursor === 1) { + success = this.setCursor(2); + break; + } else if (slotCount > battlerCount && this.cursor < battlerCount) { + success = this.setCursor(this.lastCursor < 6 ? this.lastCursor || battlerCount : battlerCount); + break; + } } } @@ -773,19 +773,19 @@ export default class PartyUiHandler extends MessageUiHandler { let optionsMessage = i18next.t("partyUiHandler:doWhatWithThisPokemon"); switch (this.partyUiMode) { - case PartyUiMode.MOVE_MODIFIER: - optionsMessage = i18next.t("partyUiHandler:selectAMove"); - break; - case PartyUiMode.MODIFIER_TRANSFER: - if (!this.transferMode) { - optionsMessage = i18next.t("partyUiHandler:changeQuantity"); - } - break; - case PartyUiMode.SPLICE: - if (!this.transferMode) { - optionsMessage = i18next.t("partyUiHandler:selectAnotherPokemonToSplice"); - } - break; + case PartyUiMode.MOVE_MODIFIER: + optionsMessage = i18next.t("partyUiHandler:selectAMove"); + break; + case PartyUiMode.MODIFIER_TRANSFER: + if (!this.transferMode) { + optionsMessage = i18next.t("partyUiHandler:changeQuantity"); + } + break; + case PartyUiMode.SPLICE: + if (!this.transferMode) { + optionsMessage = i18next.t("partyUiHandler:selectAnotherPokemonToSplice"); + } + break; } this.showText(optionsMessage, 0); @@ -829,64 +829,64 @@ export default class PartyUiHandler extends MessageUiHandler { if (this.partyUiMode !== PartyUiMode.MOVE_MODIFIER && this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.transferMode || this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER)) { switch (this.partyUiMode) { - case PartyUiMode.SWITCH: - case PartyUiMode.FAINT_SWITCH: - case PartyUiMode.POST_BATTLE_SWITCH: - if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { - const allowBatonModifierSwitch = + case PartyUiMode.SWITCH: + case PartyUiMode.FAINT_SWITCH: + case PartyUiMode.POST_BATTLE_SWITCH: + if (this.cursor >= this.scene.currentBattle.getBattlerCount()) { + const allowBatonModifierSwitch = this.partyUiMode !== PartyUiMode.FAINT_SWITCH && this.scene.findModifier(m => m instanceof SwitchEffectTransferModifier && (m as SwitchEffectTransferModifier).pokemonId === this.scene.getPlayerField()[this.fieldIndex].id); - const moveHistory = this.scene.getPlayerField()[this.fieldIndex].getMoveHistory(); - const isBatonPassMove = this.partyUiMode === PartyUiMode.FAINT_SWITCH && moveHistory.length && allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; + const moveHistory = this.scene.getPlayerField()[this.fieldIndex].getMoveHistory(); + const isBatonPassMove = this.partyUiMode === PartyUiMode.FAINT_SWITCH && moveHistory.length && allMoves[moveHistory[moveHistory.length - 1].move].getAttrs(ForceSwitchOutAttr)[0]?.isBatonPass() && moveHistory[moveHistory.length - 1].result === MoveResult.SUCCESS; - // isBatonPassMove and allowBatonModifierSwitch shouldn't ever be true - // at the same time, because they both explicitly check for a mutually - // exclusive partyUiMode. But better safe than sorry. - this.options.push(isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT); - if (allowBatonModifierSwitch && !isBatonPassMove) { + // isBatonPassMove and allowBatonModifierSwitch shouldn't ever be true + // at the same time, because they both explicitly check for a mutually + // exclusive partyUiMode. But better safe than sorry. + this.options.push(isBatonPassMove && !allowBatonModifierSwitch ? PartyOption.PASS_BATON : PartyOption.SEND_OUT); + if (allowBatonModifierSwitch && !isBatonPassMove) { // the BATON modifier gives an extra switch option for // pokemon-command switches, allowing buffs to be optionally passed - this.options.push(PartyOption.PASS_BATON); + this.options.push(PartyOption.PASS_BATON); + } } - } - break; - case PartyUiMode.REVIVAL_BLESSING: - this.options.push(PartyOption.REVIVE); - break; - case PartyUiMode.MODIFIER: - this.options.push(PartyOption.APPLY); - break; - case PartyUiMode.TM_MODIFIER: - this.options.push(PartyOption.TEACH); - break; - case PartyUiMode.MODIFIER_TRANSFER: - this.options.push(PartyOption.TRANSFER); - break; - case PartyUiMode.SPLICE: - if (this.transferMode) { - if (this.cursor !== this.transferCursor) { - this.options.push(PartyOption.SPLICE); - } - } else { + break; + case PartyUiMode.REVIVAL_BLESSING: + this.options.push(PartyOption.REVIVE); + break; + case PartyUiMode.MODIFIER: this.options.push(PartyOption.APPLY); - } - break; - case PartyUiMode.RELEASE: - this.options.push(PartyOption.RELEASE); - break; - case PartyUiMode.CHECK: - if (this.scene.getCurrentPhase() instanceof SelectModifierPhase) { - formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); - for (let i = 0; i < formChangeItemModifiers.length; i++) { - this.options.push(PartyOption.FORM_CHANGE_ITEM + i); + break; + case PartyUiMode.TM_MODIFIER: + this.options.push(PartyOption.TEACH); + break; + case PartyUiMode.MODIFIER_TRANSFER: + this.options.push(PartyOption.TRANSFER); + break; + case PartyUiMode.SPLICE: + if (this.transferMode) { + if (this.cursor !== this.transferCursor) { + this.options.push(PartyOption.SPLICE); + } + } else { + this.options.push(PartyOption.APPLY); } - } - break; - case PartyUiMode.SELECT: - this.options.push(PartyOption.SELECT); - break; + break; + case PartyUiMode.RELEASE: + this.options.push(PartyOption.RELEASE); + break; + case PartyUiMode.CHECK: + if (this.scene.getCurrentPhase() instanceof SelectModifierPhase) { + formChangeItemModifiers = this.getFormChangeItemsModifiers(pokemon); + for (let i = 0; i < formChangeItemModifiers.length; i++) { + this.options.push(PartyOption.FORM_CHANGE_ITEM + i); + } + } + break; + case PartyUiMode.SELECT: + this.options.push(PartyOption.SELECT); + break; } this.options.push(PartyOption.SUMMARY); @@ -962,33 +962,33 @@ export default class PartyUiHandler extends MessageUiHandler { optionName = "↓"; } else if ((this.partyUiMode !== PartyUiMode.REMEMBER_MOVE_MODIFIER && (this.partyUiMode !== PartyUiMode.MODIFIER_TRANSFER || this.transferMode)) || option === PartyOption.CANCEL) { switch (option) { - case PartyOption.MOVE_1: - case PartyOption.MOVE_2: - case PartyOption.MOVE_3: - case PartyOption.MOVE_4: - const move = pokemon.moveset[option - PartyOption.MOVE_1]!; // TODO: is the bang correct? - if (this.showMovePp) { - const maxPP = move.getMovePp(); - const currPP = maxPP - move.ppUsed; - optionName = `${move.getName()} ${currPP}/${maxPP}`; - } else { - optionName = move.getName(); - } - break; - default: - if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { - const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; - optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; - } else if (option === PartyOption.UNPAUSE_EVOLUTION) { - optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:UNPAUSE_EVOLUTION") : i18next.t("partyUiHandler:PAUSE_EVOLUTION")}`; - } else { - if (this.localizedOptions.includes(option)) { - optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); + case PartyOption.MOVE_1: + case PartyOption.MOVE_2: + case PartyOption.MOVE_3: + case PartyOption.MOVE_4: + const move = pokemon.moveset[option - PartyOption.MOVE_1]!; // TODO: is the bang correct? + if (this.showMovePp) { + const maxPP = move.getMovePp(); + const currPP = maxPP - move.ppUsed; + optionName = `${move.getName()} ${currPP}/${maxPP}`; } else { - optionName = Utils.toReadableString(PartyOption[option]); + optionName = move.getName(); } - } - break; + break; + default: + if (formChangeItemModifiers && option >= PartyOption.FORM_CHANGE_ITEM) { + const modifier = formChangeItemModifiers[option - PartyOption.FORM_CHANGE_ITEM]; + optionName = `${modifier.active ? i18next.t("partyUiHandler:DEACTIVATE") : i18next.t("partyUiHandler:ACTIVATE")} ${modifier.type.name}`; + } else if (option === PartyOption.UNPAUSE_EVOLUTION) { + optionName = `${pokemon.pauseEvolutions ? i18next.t("partyUiHandler:UNPAUSE_EVOLUTION") : i18next.t("partyUiHandler:PAUSE_EVOLUTION")}`; + } else { + if (this.localizedOptions.includes(option)) { + optionName = i18next.t(`partyUiHandler:${PartyOption[option]}`); + } else { + optionName = Utils.toReadableString(PartyOption[option]); + } + } + break; } } else if (this.partyUiMode === PartyUiMode.REMEMBER_MOVE_MODIFIER) { const move = learnableLevelMoves[option]; diff --git a/src/ui/pokemon-icon-anim-handler.ts b/src/ui/pokemon-icon-anim-handler.ts index d6796d5cb5d..c7a24f69200 100644 --- a/src/ui/pokemon-icon-anim-handler.ts +++ b/src/ui/pokemon-icon-anim-handler.ts @@ -39,12 +39,12 @@ export default class PokemonIconAnimHandler { getModeYDelta(mode: PokemonIconAnimMode): number { switch (mode) { - case PokemonIconAnimMode.NONE: - return 0; - case PokemonIconAnimMode.PASSIVE: - return -1; - case PokemonIconAnimMode.ACTIVE: - return -2; + case PokemonIconAnimMode.NONE: + return 0; + case PokemonIconAnimMode.PASSIVE: + return -1; + case PokemonIconAnimMode.ACTIVE: + return -2; } } diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 242e59c599b..5b11aff43b1 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -21,24 +21,6 @@ interface LanguageSetting { } const languageSettings: { [key: string]: LanguageSetting } = { - "en": { - infoContainerTextSize: "64px" - }, - "de": { - infoContainerTextSize: "64px", - }, - "es": { - infoContainerTextSize: "64px" - }, - "fr": { - infoContainerTextSize: "64px" - }, - "it": { - infoContainerTextSize: "64px" - }, - "zh": { - infoContainerTextSize: "64px" - }, "pt": { infoContainerTextSize: "60px", infoContainerLabelXPos: -15, @@ -237,14 +219,20 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { const formKey = (pokemon.species?.forms?.[pokemon.formIndex!]?.formKey); const formText = Utils.capitalizeString(formKey, "-", false, false) || ""; - const speciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false); + const speciesName = Utils.capitalizeString(Species[pokemon.species.speciesId], "_", true, false); let formName = ""; if (pokemon.species.speciesId === Species.ARCEUS) { formName = i18next.t(`pokemonInfo:Type.${formText?.toUpperCase()}`); } else { const i18key = `pokemonForm:${speciesName}${formText}`; - formName = i18next.exists(i18key) ? i18next.t(i18key) : formText; + if (i18next.exists(i18key)) { + formName = i18next.t(i18key); + } else { + const rootSpeciesName = Utils.capitalizeString(Species[pokemon.species.getRootSpeciesId()], "_", true, false); + const i18RootKey = `pokemonForm:${rootSpeciesName}${formText}`; + formName = i18next.exists(i18RootKey) ? i18next.t(i18RootKey) : formText; + } } if (formName) { @@ -279,11 +267,8 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, this.scene.uiTheme)); this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, this.scene.uiTheme)); - - const ownedAbilityAttrs = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr; - // Check if the player owns ability for the root form - const playerOwnsThisAbility = pokemon.checkIfPlayerHasAbilityOfStarter(ownedAbilityAttrs); + const playerOwnsThisAbility = pokemon.checkIfPlayerHasAbilityOfStarter(starterEntry.abilityAttr); if (!playerOwnsThisAbility) { this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme)); diff --git a/src/ui/registration-form-ui-handler.ts b/src/ui/registration-form-ui-handler.ts index c94d060c0b7..2c35ff8ee7f 100644 --- a/src/ui/registration-form-ui-handler.ts +++ b/src/ui/registration-form-ui-handler.ts @@ -1,4 +1,4 @@ -import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import * as Utils from "../utils"; import { Mode } from "./ui"; @@ -13,7 +13,7 @@ interface LanguageSetting { } const languageSettings: { [key: string]: LanguageSetting } = { - "es":{ + "es-ES": { inputFieldFontSize: "50px", errorMessageFontSize: "40px", } @@ -24,10 +24,6 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { return i18next.t("menu:register"); } - getFields(config?: ModalConfig): string[] { - return [ i18next.t("menu:username"), i18next.t("menu:password"), i18next.t("menu:confirmPassword") ]; - } - getWidth(config?: ModalConfig): number { return 160; } @@ -50,17 +46,25 @@ export default class RegistrationFormUiHandler extends FormModalUiHandler { error = error.slice(0, colonIndex); } switch (error) { - case "invalid username": - return i18next.t("menu:invalidRegisterUsername"); - case "invalid password": - return i18next.t("menu:invalidRegisterPassword"); - case "failed to add account record": - return i18next.t("menu:usernameAlreadyUsed"); + case "invalid username": + return i18next.t("menu:invalidRegisterUsername"); + case "invalid password": + return i18next.t("menu:invalidRegisterPassword"); + case "failed to add account record": + return i18next.t("menu:usernameAlreadyUsed"); } return super.getReadableErrorMessage(error); } + override getInputFieldConfigs(): InputFieldConfig[] { + const inputFieldConfigs: InputFieldConfig[] = []; + inputFieldConfigs.push({ label: i18next.t("menu:username") }); + inputFieldConfigs.push({ label: i18next.t("menu:password"), isPassword: true }); + inputFieldConfigs.push({ label: i18next.t("menu:confirmPassword"), isPassword: true }); + return inputFieldConfigs; + } + setup(): void { super.setup(); diff --git a/src/ui/rename-form-ui-handler.ts b/src/ui/rename-form-ui-handler.ts index 078177cafb1..6e4c4c6809d 100644 --- a/src/ui/rename-form-ui-handler.ts +++ b/src/ui/rename-form-ui-handler.ts @@ -1,4 +1,4 @@ -import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import i18next from "i18next"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -8,10 +8,6 @@ export default class RenameFormUiHandler extends FormModalUiHandler { return i18next.t("menu:renamePokemon"); } - getFields(config?: ModalConfig): string[] { - return [ i18next.t("menu:nickname") ]; - } - getWidth(config?: ModalConfig): number { return 160; } @@ -33,6 +29,10 @@ export default class RenameFormUiHandler extends FormModalUiHandler { return super.getReadableErrorMessage(error); } + override getInputFieldConfigs(): InputFieldConfig[] { + return [{ label: i18next.t("menu:nickname") }]; + } + show(args: any[]): boolean { if (super.show(args)) { const config = args[0] as ModalConfig; diff --git a/src/ui/run-history-ui-handler.ts b/src/ui/run-history-ui-handler.ts index 20de7fd832c..061f15d0956 100644 --- a/src/ui/run-history-ui-handler.ts +++ b/src/ui/run-history-ui-handler.ts @@ -118,28 +118,28 @@ export default class RunHistoryUiHandler extends MessageUiHandler { } } else if (this.runs.length > 0) { switch (button) { - case Button.UP: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else if (this.scrollCursor) { - success = this.setScrollCursor(this.scrollCursor - 1); - } else if (this.runs.length > 1) { + case Button.UP: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1); + } else if (this.runs.length > 1) { // wrap around to the bottom - success = this.setCursor(Math.min(this.runs.length - 1, this.maxRows - 1)); - success = this.setScrollCursor(Math.max(0, this.runs.length - this.maxRows)) || success; - } - break; - case Button.DOWN: - if (this.cursor < Math.min(this.maxRows - 1, this.runs.length - this.scrollCursor - 1)) { - success = this.setCursor(this.cursor + 1); - } else if (this.scrollCursor < this.runs.length - this.maxRows) { - success = this.setScrollCursor(this.scrollCursor + 1); - } else if (this.runs.length > 1) { + success = this.setCursor(Math.min(this.runs.length - 1, this.maxRows - 1)); + success = this.setScrollCursor(Math.max(0, this.runs.length - this.maxRows)) || success; + } + break; + case Button.DOWN: + if (this.cursor < Math.min(this.maxRows - 1, this.runs.length - this.scrollCursor - 1)) { + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < this.runs.length - this.maxRows) { + success = this.setScrollCursor(this.scrollCursor + 1); + } else if (this.runs.length > 1) { // wrap around to the top - success = this.setCursor(0); - success = this.setScrollCursor(0) || success; - } - break; + success = this.setCursor(0); + success = this.setScrollCursor(0) || success; + } + break; } } @@ -333,19 +333,19 @@ class RunEntryContainer extends Phaser.GameObjects.Container { const gameModeLabel = addTextObject(this.scene, 8, 19, "", TextStyle.WINDOW); let mode = ""; switch (data.gameMode) { - case GameModes.DAILY: - mode = i18next.t("gameMode:dailyRun"); - break; - case GameModes.SPLICED_ENDLESS: - case GameModes.ENDLESS: - mode = i18next.t("gameMode:endless"); - break; - case GameModes.CLASSIC: - mode = i18next.t("gameMode:classic"); - break; - case GameModes.CHALLENGE: - mode = i18next.t("gameMode:challenge"); - break; + case GameModes.DAILY: + mode = i18next.t("gameMode:dailyRun"); + break; + case GameModes.SPLICED_ENDLESS: + case GameModes.ENDLESS: + mode = i18next.t("gameMode:endless"); + break; + case GameModes.CLASSIC: + mode = i18next.t("gameMode:classic"); + break; + case GameModes.CHALLENGE: + mode = i18next.t("gameMode:challenge"); + break; } gameModeLabel.appendText(mode, false); if (data.gameMode === GameModes.SPLICED_ENDLESS) { diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index 1976d5a997b..4975f05b8a3 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -229,14 +229,14 @@ export default class RunInfoUiHandler extends UiHandler { // Wild - Single and Doubles if (this.runInfo.battleType === BattleType.WILD || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && !this.runInfo.trainer)) { switch (this.runInfo.enemyParty.length) { - case 1: + case 1: // Wild - Singles - this.parseWildSingleDefeat(enemyContainer); - break; - case 2: + this.parseWildSingleDefeat(enemyContainer); + break; + case 2: //Wild - Doubles - this.parseWildDoubleDefeat(enemyContainer); - break; + this.parseWildDoubleDefeat(enemyContainer); + break; } } else if (this.runInfo.battleType === BattleType.TRAINER || (this.runInfo.battleType === BattleType.MYSTERY_ENCOUNTER && this.runInfo.trainer)) { this.parseTrainerDefeat(enemyContainer); @@ -474,33 +474,33 @@ export default class RunInfoUiHandler extends UiHandler { modeText.setPosition(7, 5); modeText.appendText(i18next.t("runHistory:mode") + ": ", false); switch (this.runInfo.gameMode) { - case GameModes.DAILY: - modeText.appendText(`${i18next.t("gameMode:dailyRun")}`, false); - break; - case GameModes.SPLICED_ENDLESS: - modeText.appendText(`${i18next.t("gameMode:endlessSpliced")}`, false); - break; - case GameModes.CHALLENGE: - modeText.appendText(`${i18next.t("gameMode:challenge")}`, false); - modeText.appendText(`${i18next.t("runHistory:challengeRules")}: `); - modeText.setWrapMode(1); // wrap by word - modeText.setWrapWidth(500); - const rules: string[] = this.challengeParser(); - if (rules) { - for (let i = 0; i < rules.length; i++) { - if (i > 0) { - modeText.appendText(" + ", false); + case GameModes.DAILY: + modeText.appendText(`${i18next.t("gameMode:dailyRun")}`, false); + break; + case GameModes.SPLICED_ENDLESS: + modeText.appendText(`${i18next.t("gameMode:endlessSpliced")}`, false); + break; + case GameModes.CHALLENGE: + modeText.appendText(`${i18next.t("gameMode:challenge")}`, false); + modeText.appendText(`${i18next.t("runHistory:challengeRules")}: `); + modeText.setWrapMode(1); // wrap by word + modeText.setWrapWidth(500); + const rules: string[] = this.challengeParser(); + if (rules) { + for (let i = 0; i < rules.length; i++) { + if (i > 0) { + modeText.appendText(" + ", false); + } + modeText.appendText(rules[i], false); } - modeText.appendText(rules[i], false); } - } - break; - case GameModes.ENDLESS: - modeText.appendText(`${i18next.t("gameMode:endless")}`, false); - break; - case GameModes.CLASSIC: - modeText.appendText(`${i18next.t("gameMode:classic")}`, false); - break; + break; + case GameModes.ENDLESS: + modeText.appendText(`${i18next.t("gameMode:endless")}`, false); + break; + case GameModes.CLASSIC: + modeText.appendText(`${i18next.t("gameMode:classic")}`, false); + break; } // If the player achieves a personal best in Endless, the mode text will be tinted similarly to SSS luck to celebrate their achievement. @@ -577,23 +577,23 @@ export default class RunInfoUiHandler extends UiHandler { for (let i = 0; i < this.runInfo.challenges.length; i++) { if (this.runInfo.challenges[i].value !== 0) { switch (this.runInfo.challenges[i].id) { - case Challenges.SINGLE_GENERATION: - rules.push(i18next.t(`runHistory:challengeMonoGen${this.runInfo.challenges[i].value}`)); - break; - case Challenges.SINGLE_TYPE: - const typeRule = Type[this.runInfo.challenges[i].value - 1]; - const typeTextColor = `[color=${TypeColor[typeRule]}]`; - const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; - const typeText = typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; - rules.push(typeText); - break; - case Challenges.INVERSE_BATTLE: - rules.push(i18next.t("challenges:inverseBattle.shortName")); - break; - default: - const localisationKey = Challenges[this.runInfo.challenges[i].id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); - rules.push(i18next.t(`challenges:${localisationKey}.name`)); - break; + case Challenges.SINGLE_GENERATION: + rules.push(i18next.t(`runHistory:challengeMonoGen${this.runInfo.challenges[i].value}`)); + break; + case Challenges.SINGLE_TYPE: + const typeRule = Type[this.runInfo.challenges[i].value - 1]; + const typeTextColor = `[color=${TypeColor[typeRule]}]`; + const typeShadowColor = `[shadow=${TypeShadow[typeRule]}]`; + const typeText = typeTextColor + typeShadowColor + i18next.t(`pokemonInfo:Type.${typeRule}`)! + "[/color]" + "[/shadow]"; + rules.push(typeText); + break; + case Challenges.INVERSE_BATTLE: + rules.push(i18next.t("challenges:inverseBattle.shortName")); + break; + default: + const localisationKey = Challenges[this.runInfo.challenges[i].id].split("_").map((f, i) => i ? `${f[0]}${f.slice(1).toLowerCase()}` : f.toLowerCase()).join(""); + rules.push(i18next.t(`challenges:${localisationKey}.name`)); + break; } } } @@ -674,7 +674,7 @@ export default class RunInfoUiHandler extends UiHandler { const def = i18next.t("pokemonInfo:Stat.DEFshortened") + ": " + pStats[2]; const spatk = i18next.t("pokemonInfo:Stat.SPATKshortened") + ": " + pStats[3]; const spdef = i18next.t("pokemonInfo:Stat.SPDEFshortened") + ": " + pStats[4]; - const speedLabel = (currentLanguage === "es" || currentLanguage === "pt_BR") ? i18next.t("runHistory:SPDshortened") : i18next.t("pokemonInfo:Stat.SPDshortened"); + const speedLabel = (currentLanguage === "es-ES" || currentLanguage === "pt_BR") ? i18next.t("runHistory:SPDshortened") : i18next.t("pokemonInfo:Stat.SPDshortened"); const speed = speedLabel + ": " + pStats[5]; // Column 1: HP Atk Def const pokeStatText1 = addBBCodeTextObject(this.scene, -5, 0, hp, TextStyle.SUMMARY, { fontSize: textContainerFontSize, lineSpacing: lineSpacing }); @@ -911,36 +911,36 @@ export default class RunInfoUiHandler extends UiHandler { const error = false; switch (button) { - case Button.CANCEL: - success = true; - if (this.pageMode === RunInfoUiMode.MAIN) { - this.runInfoContainer.removeAll(true); - this.runResultContainer.removeAll(true); - this.partyContainer.removeAll(true); - this.runContainer.removeAll(true); - if (this.isVictory) { - this.hallofFameContainer.removeAll(true); + case Button.CANCEL: + success = true; + if (this.pageMode === RunInfoUiMode.MAIN) { + this.runInfoContainer.removeAll(true); + this.runResultContainer.removeAll(true); + this.partyContainer.removeAll(true); + this.runContainer.removeAll(true); + if (this.isVictory) { + this.hallofFameContainer.removeAll(true); + } + super.clear(); + this.runContainer.setVisible(false); + ui.revertMode(); + } else if (this.pageMode === RunInfoUiMode.HALL_OF_FAME) { + this.hallofFameContainer.setVisible(false); + this.pageMode = RunInfoUiMode.MAIN; + } else if (this.pageMode === RunInfoUiMode.ENDING_ART) { + this.endCardContainer.setVisible(false); + this.runContainer.remove(this.endCardContainer); + this.pageMode = RunInfoUiMode.MAIN; } - super.clear(); - this.runContainer.setVisible(false); - ui.revertMode(); - } else if (this.pageMode === RunInfoUiMode.HALL_OF_FAME) { - this.hallofFameContainer.setVisible(false); - this.pageMode = RunInfoUiMode.MAIN; - } else if (this.pageMode === RunInfoUiMode.ENDING_ART) { - this.endCardContainer.setVisible(false); - this.runContainer.remove(this.endCardContainer); - this.pageMode = RunInfoUiMode.MAIN; - } - break; - case Button.DOWN: - case Button.UP: - break; - case Button.CYCLE_FORM: - case Button.CYCLE_SHINY: - case Button.CYCLE_ABILITY: - this.buttonCycleOption(button); - break; + break; + case Button.DOWN: + case Button.UP: + break; + case Button.CYCLE_FORM: + case Button.CYCLE_SHINY: + case Button.CYCLE_ABILITY: + this.buttonCycleOption(button); + break; } if (success) { @@ -960,40 +960,40 @@ export default class RunInfoUiHandler extends UiHandler { */ private buttonCycleOption(button: Button) { switch (button) { - case Button.CYCLE_FORM: - if (this.isVictory && this.pageMode !== RunInfoUiMode.HALL_OF_FAME) { - if (!this.endCardContainer || !this.endCardContainer.visible) { - this.createVictorySplash(); - this.endCardContainer.setVisible(true); - this.runContainer.add(this.endCardContainer); - this.pageMode = RunInfoUiMode.ENDING_ART; - } else { - this.endCardContainer.setVisible(false); - this.runContainer.remove(this.endCardContainer); - this.pageMode = RunInfoUiMode.MAIN; + case Button.CYCLE_FORM: + if (this.isVictory && this.pageMode !== RunInfoUiMode.HALL_OF_FAME) { + if (!this.endCardContainer || !this.endCardContainer.visible) { + this.createVictorySplash(); + this.endCardContainer.setVisible(true); + this.runContainer.add(this.endCardContainer); + this.pageMode = RunInfoUiMode.ENDING_ART; + } else { + this.endCardContainer.setVisible(false); + this.runContainer.remove(this.endCardContainer); + this.pageMode = RunInfoUiMode.MAIN; + } } - } - break; - case Button.CYCLE_SHINY: - if (this.isVictory && this.pageMode !== RunInfoUiMode.ENDING_ART) { - if (!this.hallofFameContainer.visible) { - this.hallofFameContainer.setVisible(true); - this.pageMode = RunInfoUiMode.HALL_OF_FAME; - } else { - this.hallofFameContainer.setVisible(false); - this.pageMode = RunInfoUiMode.MAIN; + break; + case Button.CYCLE_SHINY: + if (this.isVictory && this.pageMode !== RunInfoUiMode.ENDING_ART) { + if (!this.hallofFameContainer.visible) { + this.hallofFameContainer.setVisible(true); + this.pageMode = RunInfoUiMode.HALL_OF_FAME; + } else { + this.hallofFameContainer.setVisible(false); + this.pageMode = RunInfoUiMode.MAIN; + } } - } - break; - case Button.CYCLE_ABILITY: - if (this.runInfo.modifiers.length !== 0 && this.pageMode === RunInfoUiMode.MAIN) { - if (this.partyVisibility) { - this.showParty(false); - } else { - this.showParty(true); + break; + case Button.CYCLE_ABILITY: + if (this.runInfo.modifiers.length !== 0 && this.pageMode === RunInfoUiMode.MAIN) { + if (this.partyVisibility) { + this.showParty(false); + } else { + this.showParty(true); + } } - } - break; + break; } } } diff --git a/src/ui/save-slot-select-ui-handler.ts b/src/ui/save-slot-select-ui-handler.ts index 2e664db8d43..7bfecb1f99b 100644 --- a/src/ui/save-slot-select-ui-handler.ts +++ b/src/ui/save-slot-select-ui-handler.ts @@ -106,40 +106,40 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { error = true; } else { switch (this.uiMode) { - case SaveSlotUiMode.LOAD: - this.saveSlotSelectCallback = null; - originalCallback && originalCallback(cursor); - break; - case SaveSlotUiMode.SAVE: - const saveAndCallback = () => { - const originalCallback = this.saveSlotSelectCallback; + case SaveSlotUiMode.LOAD: this.saveSlotSelectCallback = null; - ui.revertMode(); - ui.showText("", 0); - ui.setMode(Mode.MESSAGE); originalCallback && originalCallback(cursor); - }; - if (this.sessionSlots[cursor].hasData) { - ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { - ui.setOverlayMode(Mode.CONFIRM, () => { - this.scene.gameData.deleteSession(cursor).then(response => { - if (response === false) { - this.scene.reset(true); - } else { - saveAndCallback(); - } - }); - }, () => { - ui.revertMode(); - ui.showText("", 0); - }, false, 0, 19, 2000); - }); - } else if (this.sessionSlots[cursor].hasData === false) { - saveAndCallback(); - } else { - return false; - } - break; + break; + case SaveSlotUiMode.SAVE: + const saveAndCallback = () => { + const originalCallback = this.saveSlotSelectCallback; + this.saveSlotSelectCallback = null; + ui.revertMode(); + ui.showText("", 0); + ui.setMode(Mode.MESSAGE); + originalCallback && originalCallback(cursor); + }; + if (this.sessionSlots[cursor].hasData) { + ui.showText(i18next.t("saveSlotSelectUiHandler:overwriteData"), null, () => { + ui.setOverlayMode(Mode.CONFIRM, () => { + this.scene.gameData.deleteSession(cursor).then(response => { + if (response === false) { + this.scene.reset(true); + } else { + saveAndCallback(); + } + }); + }, () => { + ui.revertMode(); + ui.showText("", 0); + }, false, 0, 19, 2000); + }); + } else if (this.sessionSlots[cursor].hasData === false) { + saveAndCallback(); + } else { + return false; + } + break; } success = true; } @@ -151,26 +151,26 @@ export default class SaveSlotSelectUiHandler extends MessageUiHandler { } else { const cursorPosition = this.cursor + this.scrollCursor; switch (button) { - case Button.UP: - if (this.cursor) { + case Button.UP: + if (this.cursor) { // Check to prevent cursor from accessing a negative index - success = (this.cursor === 0) ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); - } else if (this.scrollCursor) { - success = this.setScrollCursor(this.scrollCursor - 1, cursorPosition); - } - break; - case Button.DOWN: - if (this.cursor < (SLOTS_ON_SCREEN - 1)) { - success = this.setCursor(this.cursor + 1, cursorPosition); - } else if (this.scrollCursor < SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN) { - success = this.setScrollCursor(this.scrollCursor + 1, cursorPosition); - } - break; - case Button.RIGHT: - if (this.sessionSlots[cursorPosition].hasData && this.sessionSlots[cursorPosition].saveData) { - this.scene.ui.setOverlayMode(Mode.RUN_INFO, this.sessionSlots[cursorPosition].saveData, RunDisplayMode.SESSION_PREVIEW); - success = true; - } + success = (this.cursor === 0) ? this.setCursor(this.cursor) : this.setCursor(this.cursor - 1, cursorPosition); + } else if (this.scrollCursor) { + success = this.setScrollCursor(this.scrollCursor - 1, cursorPosition); + } + break; + case Button.DOWN: + if (this.cursor < (SLOTS_ON_SCREEN - 1)) { + success = this.setCursor(this.cursor + 1, cursorPosition); + } else if (this.scrollCursor < SESSION_SLOTS_COUNT - SLOTS_ON_SCREEN) { + success = this.setScrollCursor(this.scrollCursor + 1, cursorPosition); + } + break; + case Button.RIGHT: + if (this.sessionSlots[cursorPosition].hasData && this.sessionSlots[cursorPosition].saveData) { + this.scene.ui.setOverlayMode(Mode.RUN_INFO, this.sessionSlots[cursorPosition].saveData, RunDisplayMode.SESSION_PREVIEW); + success = true; + } } } diff --git a/src/ui/scrollable-grid-handler.ts b/src/ui/scrollable-grid-handler.ts index f96f3c995b7..cced92a2083 100644 --- a/src/ui/scrollable-grid-handler.ts +++ b/src/ui/scrollable-grid-handler.ts @@ -106,48 +106,48 @@ export default class ScrollableGridUiHandler { const itemOffset = this.scrollCursor * this.COLUMNS; const lastVisibleIndex = Math.min(this.totalElements - 1, this.totalElements - maxScrollCursor * this.COLUMNS - 1); switch (button) { - case Button.UP: - if (currentRowIndex > 0) { - success = this.setCursor(this.cursor - this.COLUMNS); - } else if (this.scrollCursor > 0) { - success = this.setScrollCursor(this.scrollCursor - 1); - } else { + case Button.UP: + if (currentRowIndex > 0) { + success = this.setCursor(this.cursor - this.COLUMNS); + } else if (this.scrollCursor > 0) { + success = this.setScrollCursor(this.scrollCursor - 1); + } else { // wrap around to the last row - let newCursor = this.cursor + (onScreenRows - 1) * this.COLUMNS; - if (newCursor > lastVisibleIndex) { - newCursor -= this.COLUMNS; + let newCursor = this.cursor + (onScreenRows - 1) * this.COLUMNS; + if (newCursor > lastVisibleIndex) { + newCursor -= this.COLUMNS; + } + success = this.setScrollCursor(maxScrollCursor, newCursor); } - success = this.setScrollCursor(maxScrollCursor, newCursor); - } - break; - case Button.DOWN: - if (currentRowIndex < onScreenRows - 1) { + break; + case Button.DOWN: + if (currentRowIndex < onScreenRows - 1) { // Go down one row - success = this.setCursor(Math.min(this.cursor + this.COLUMNS, this.totalElements - itemOffset - 1)); - } else if (this.scrollCursor < maxScrollCursor) { + success = this.setCursor(Math.min(this.cursor + this.COLUMNS, this.totalElements - itemOffset - 1)); + } else if (this.scrollCursor < maxScrollCursor) { // Scroll down one row - success = this.setScrollCursor(this.scrollCursor + 1); - } else { + success = this.setScrollCursor(this.scrollCursor + 1); + } else { // Wrap around to the top row - success = this.setScrollCursor(0, this.cursor % this.COLUMNS); - } - break; - case Button.LEFT: - if (currentColumnIndex > 0) { - success = this.setCursor(this.cursor - 1); - } else if (this.scrollCursor === maxScrollCursor && currentRowIndex === onScreenRows - 1) { - success = this.setCursor(lastVisibleIndex); - } else { - success = this.setCursor(this.cursor + this.COLUMNS - 1); - } - break; - case Button.RIGHT: - if (currentColumnIndex < this.COLUMNS - 1 && this.cursor + itemOffset < this.totalElements - 1) { - success = this.setCursor(this.cursor + 1); - } else { - success = this.setCursor(this.cursor - currentColumnIndex); - } - break; + success = this.setScrollCursor(0, this.cursor % this.COLUMNS); + } + break; + case Button.LEFT: + if (currentColumnIndex > 0) { + success = this.setCursor(this.cursor - 1); + } else if (this.scrollCursor === maxScrollCursor && currentRowIndex === onScreenRows - 1) { + success = this.setCursor(lastVisibleIndex); + } else { + success = this.setCursor(this.cursor + this.COLUMNS - 1); + } + break; + case Button.RIGHT: + if (currentColumnIndex < this.COLUMNS - 1 && this.cursor + itemOffset < this.totalElements - 1) { + success = this.setCursor(this.cursor + 1); + } else { + success = this.setCursor(this.cursor - currentColumnIndex); + } + break; } return success; } diff --git a/src/ui/settings/abstract-binding-ui-handler.ts b/src/ui/settings/abstract-binding-ui-handler.ts index 9ee741f7bd4..9ebc3c493a4 100644 --- a/src/ui/settings/abstract-binding-ui-handler.ts +++ b/src/ui/settings/abstract-binding-ui-handler.ts @@ -170,22 +170,22 @@ export default abstract class AbstractBindingUiHandler extends UiHandler { const ui = this.getUi(); let success = false; switch (button) { - case Button.LEFT: - case Button.RIGHT: + case Button.LEFT: + case Button.RIGHT: // Toggle between action and cancel options. - const cursor = this.cursor ? 0 : 1; - success = this.setCursor(cursor); - break; - case Button.ACTION: + const cursor = this.cursor ? 0 : 1; + success = this.setCursor(cursor); + break; + case Button.ACTION: // Process actions based on current cursor position. - if (this.cursor === 0) { - this.cancelFn && this.cancelFn(); - } else { - success = this.swapAction(); - NavigationManager.getInstance().updateIcons(); - this.cancelFn && this.cancelFn(success); - } - break; + if (this.cursor === 0) { + this.cancelFn && this.cancelFn(); + } else { + success = this.swapAction(); + NavigationManager.getInstance().updateIcons(); + this.cancelFn && this.cancelFn(success); + } + break; } // Plays a select sound effect if an action was successfully processed. diff --git a/src/ui/settings/abstract-control-settings-ui-handler.ts b/src/ui/settings/abstract-control-settings-ui-handler.ts index 477eaf0a68b..69f8eb241d3 100644 --- a/src/ui/settings/abstract-control-settings-ui-handler.ts +++ b/src/ui/settings/abstract-control-settings-ui-handler.ts @@ -449,78 +449,78 @@ export default abstract class AbstractControlSettingsUiHandler extends UiHandler const cursor = this.cursor + this.scrollCursor; // Calculate the absolute cursor position. const setting = this.setting[Object.keys(this.setting)[cursor]]; switch (button) { - case Button.ACTION: - if (!this.optionCursors || !this.optionValueLabels) { - return false; // TODO: is false correct as default? (previously was `undefined`) - } - if (this.settingBlacklisted.includes(setting) || !setting.includes("BUTTON_")) { - success = false; - } else { - success = this.setSetting(this.scene, setting, 1); - } - break; - case Button.UP: // Move up in the menu. - if (!this.optionValueLabels) { - return false; - } - if (cursor) { // If not at the top, move the cursor up. - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } else {// If at the top of the visible items, scroll up. - success = this.setScrollCursor(this.scrollCursor - 1); + case Button.ACTION: + if (!this.optionCursors || !this.optionValueLabels) { + return false; // TODO: is false correct as default? (previously was `undefined`) } - } else { + if (this.settingBlacklisted.includes(setting) || !setting.includes("BUTTON_")) { + success = false; + } else { + success = this.setSetting(this.scene, setting, 1); + } + break; + case Button.UP: // Move up in the menu. + if (!this.optionValueLabels) { + return false; + } + if (cursor) { // If not at the top, move the cursor up. + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else {// If at the top of the visible items, scroll up. + success = this.setScrollCursor(this.scrollCursor - 1); + } + } else { // When at the top of the menu and pressing UP, move to the bottommost item. // First, set the cursor to the last visible element, preparing for the scroll to the end. - const successA = this.setCursor(this.rowsToDisplay - 1); - // Then, adjust the scroll to display the bottommost elements of the menu. - const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); - success = successA && successB; // success is just there to play the little validation sound effect - } - break; - case Button.DOWN: // Move down in the menu. - if (!this.optionValueLabels) { - return false; - } - if (cursor < this.optionValueLabels.length - 1) { - if (this.cursor < this.rowsToDisplay - 1) { - success = this.setCursor(this.cursor + 1); - } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { - success = this.setScrollCursor(this.scrollCursor + 1); + const successA = this.setCursor(this.rowsToDisplay - 1); + // Then, adjust the scroll to display the bottommost elements of the menu. + const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); + success = successA && successB; // success is just there to play the little validation sound effect } - } else { + break; + case Button.DOWN: // Move down in the menu. + if (!this.optionValueLabels) { + return false; + } + if (cursor < this.optionValueLabels.length - 1) { + if (this.cursor < this.rowsToDisplay - 1) { + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + } else { // When at the bottom of the menu and pressing DOWN, move to the topmost item. // First, set the cursor to the first visible element, resetting the scroll to the top. - const successA = this.setCursor(0); - // Then, reset the scroll to start from the first element of the menu. - const successB = this.setScrollCursor(0); - success = successA && successB; // Indicates a successful cursor and scroll adjustment. - } - break; - case Button.LEFT: // Move selection left within the current option set. - if (!this.optionCursors || !this.optionValueLabels) { - return false; // TODO: is false correct as default? (previously was `undefined`) - } - if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { - success = false; - } else if (this.optionCursors[cursor]) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); - } - break; - case Button.RIGHT: // Move selection right within the current option set. - if (!this.optionCursors || !this.optionValueLabels) { - return false; // TODO: is false correct as default? (previously was `undefined`) - } - if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { - success = false; - } else if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); - } - break; - case Button.CYCLE_FORM: - case Button.CYCLE_SHINY: - success = this.navigationContainer.navigate(button); - break; + const successA = this.setCursor(0); + // Then, reset the scroll to start from the first element of the menu. + const successB = this.setScrollCursor(0); + success = successA && successB; // Indicates a successful cursor and scroll adjustment. + } + break; + case Button.LEFT: // Move selection left within the current option set. + if (!this.optionCursors || !this.optionValueLabels) { + return false; // TODO: is false correct as default? (previously was `undefined`) + } + if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { + success = false; + } else if (this.optionCursors[cursor]) { + success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); + } + break; + case Button.RIGHT: // Move selection right within the current option set. + if (!this.optionCursors || !this.optionValueLabels) { + return false; // TODO: is false correct as default? (previously was `undefined`) + } + if (this.settingBlacklisted.includes(setting) || setting.includes("BUTTON_")) { + success = false; + } else if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { + success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); + } + break; + case Button.CYCLE_FORM: + case Button.CYCLE_SHINY: + success = this.navigationContainer.navigate(button); + break; } } diff --git a/src/ui/settings/abstract-settings-ui-handler.ts b/src/ui/settings/abstract-settings-ui-handler.ts index 47eceddc813..83219e1ef5a 100644 --- a/src/ui/settings/abstract-settings-ui-handler.ts +++ b/src/ui/settings/abstract-settings-ui-handler.ts @@ -224,59 +224,59 @@ export default class AbstractSettingsUiHandler extends UiHandler { } else { const cursor = this.cursor + this.scrollCursor; switch (button) { - case Button.UP: - if (cursor) { - if (this.cursor) { - success = this.setCursor(this.cursor - 1); + case Button.UP: + if (cursor) { + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } else { + success = this.setScrollCursor(this.scrollCursor - 1); + } } else { - success = this.setScrollCursor(this.scrollCursor - 1); - } - } else { // When at the top of the menu and pressing UP, move to the bottommost item. // First, set the cursor to the last visible element, preparing for the scroll to the end. - const successA = this.setCursor(this.rowsToDisplay - 1); - // Then, adjust the scroll to display the bottommost elements of the menu. - const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); - success = successA && successB; // success is just there to play the little validation sound effect - } - break; - case Button.DOWN: - if (cursor < this.optionValueLabels.length - 1) { - if (this.cursor < this.rowsToDisplay - 1) {// if the visual cursor is in the frame of 0 to 8 - success = this.setCursor(this.cursor + 1); - } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { - success = this.setScrollCursor(this.scrollCursor + 1); + const successA = this.setCursor(this.rowsToDisplay - 1); + // Then, adjust the scroll to display the bottommost elements of the menu. + const successB = this.setScrollCursor(this.optionValueLabels.length - this.rowsToDisplay); + success = successA && successB; // success is just there to play the little validation sound effect } - } else { + break; + case Button.DOWN: + if (cursor < this.optionValueLabels.length - 1) { + if (this.cursor < this.rowsToDisplay - 1) {// if the visual cursor is in the frame of 0 to 8 + success = this.setCursor(this.cursor + 1); + } else if (this.scrollCursor < this.optionValueLabels.length - this.rowsToDisplay) { + success = this.setScrollCursor(this.scrollCursor + 1); + } + } else { // When at the bottom of the menu and pressing DOWN, move to the topmost item. // First, set the cursor to the first visible element, resetting the scroll to the top. - const successA = this.setCursor(0); - // Then, reset the scroll to start from the first element of the menu. - const successB = this.setScrollCursor(0); - success = successA && successB; // Indicates a successful cursor and scroll adjustment. - } - break; - case Button.LEFT: - if (this.optionCursors[cursor]) {// Moves the option cursor left, if possible. - success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); - } - break; - case Button.RIGHT: + const successA = this.setCursor(0); + // Then, reset the scroll to start from the first element of the menu. + const successB = this.setScrollCursor(0); + success = successA && successB; // Indicates a successful cursor and scroll adjustment. + } + break; + case Button.LEFT: + if (this.optionCursors[cursor]) {// Moves the option cursor left, if possible. + success = this.setOptionCursor(cursor, this.optionCursors[cursor] - 1, true); + } + break; + case Button.RIGHT: // Moves the option cursor right, if possible. - if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { - success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); - } - break; - case Button.CYCLE_FORM: - case Button.CYCLE_SHINY: - success = this.navigationContainer.navigate(button); - break; - case Button.ACTION: - const setting: Setting = this.settings[cursor]; - if (setting?.activatable) { - success = this.activateSetting(setting); - } - break; + if (this.optionCursors[cursor] < this.optionValueLabels[cursor].length - 1) { + success = this.setOptionCursor(cursor, this.optionCursors[cursor] + 1, true); + } + break; + case Button.CYCLE_FORM: + case Button.CYCLE_SHINY: + success = this.navigationContainer.navigate(button); + break; + case Button.ACTION: + const setting: Setting = this.settings[cursor]; + if (setting?.activatable) { + success = this.activateSetting(setting); + } + break; } } @@ -295,9 +295,9 @@ export default class AbstractSettingsUiHandler extends UiHandler { */ activateSetting(setting: Setting): boolean { switch (setting.key) { - case SettingKeys.Move_Touch_Controls: - this.scene.inputController.moveTouchControlsHandler.enableConfigurationMode(this.getUi(), this.scene); - return true; + case SettingKeys.Move_Touch_Controls: + this.scene.inputController.moveTouchControlsHandler.enableConfigurationMode(this.getUi(), this.scene); + return true; } return false; } diff --git a/src/ui/settings/navigationMenu.ts b/src/ui/settings/navigationMenu.ts index 45209c220fa..ab86fa1569a 100644 --- a/src/ui/settings/navigationMenu.ts +++ b/src/ui/settings/navigationMenu.ts @@ -198,12 +198,12 @@ export default class NavigationMenu extends Phaser.GameObjects.Container { navigate(button: Button): boolean { const navigationManager = NavigationManager.getInstance(); switch (button) { - case Button.CYCLE_FORM: - navigationManager.navigate(this.scene, LEFT); - return true; - case Button.CYCLE_SHINY: - navigationManager.navigate(this.scene, RIGHT); - return true; + case Button.CYCLE_FORM: + navigationManager.navigate(this.scene, LEFT); + return true; + case Button.CYCLE_SHINY: + navigationManager.navigate(this.scene, RIGHT); + return true; } return false; } diff --git a/src/ui/settings/settings-display-ui-handler.ts b/src/ui/settings/settings-display-ui-handler.ts index 4d9c010a315..5b2d7652152 100644 --- a/src/ui/settings/settings-display-ui-handler.ts +++ b/src/ui/settings/settings-display-ui-handler.ts @@ -23,85 +23,85 @@ export default class SettingsDisplayUiHandler extends AbstractSettingsUiHandler if (languageIndex >= 0) { const currentLocale = localStorage.getItem("prLang"); switch (currentLocale) { - case "en": - this.settings[languageIndex].options[0] = { - value: "English", - label: "English", - }; - break; - case "es": - this.settings[languageIndex].options[0] = { - value: "Español", - label: "Español", - }; - break; - case "it": - this.settings[languageIndex].options[0] = { - value: "Italiano", - label: "Italiano", - }; - break; - case "fr": - this.settings[languageIndex].options[0] = { - value: "Français", - label: "Français", - }; - break; - case "de": - this.settings[languageIndex].options[0] = { - value: "Deutsch", - label: "Deutsch", - }; - break; - case "pt-BR": - this.settings[languageIndex].options[0] = { - value: "Português (BR)", - label: "Português (BR)", - }; - break; - case "zh-CN": - this.settings[languageIndex].options[0] = { - value: "简体中文", - label: "简体中文", - }; - break; - case "zh-TW": - this.settings[languageIndex].options[0] = { - value: "繁體中文", - label: "繁體中文", - }; - break; - case "ko": - case "ko-KR": - this.settings[languageIndex].options[0] = { - value: "한국어", - label: "한국어", - }; - break; - case "ja": - this.settings[languageIndex].options[0] = { - value: "日本語", - label: "日本語", - }; - break; - case "ca-ES": - this.settings[languageIndex].options[0] = { - value: "Català", - label: "Català", - }; - break; - case "he": - this.settings[languageIndex].options[0] = { - value: "עברית", - label: "עברית", - }; - break; - default: - this.settings[languageIndex].options[0] = { - value: "English", - label: "English", - }; - break; + case "en": + this.settings[languageIndex].options[0] = { + value: "English", + label: "English", + }; + break; + case "es-ES": + this.settings[languageIndex].options[0] = { + value: "Español (ES)", + label: "Español (ES)", + }; + break; + case "it": + this.settings[languageIndex].options[0] = { + value: "Italiano", + label: "Italiano", + }; + break; + case "fr": + this.settings[languageIndex].options[0] = { + value: "Français", + label: "Français", + }; + break; + case "de": + this.settings[languageIndex].options[0] = { + value: "Deutsch", + label: "Deutsch", + }; + break; + case "pt-BR": + this.settings[languageIndex].options[0] = { + value: "Português (BR)", + label: "Português (BR)", + }; + break; + case "zh-CN": + this.settings[languageIndex].options[0] = { + value: "简体中文", + label: "简体中文", + }; + break; + case "zh-TW": + this.settings[languageIndex].options[0] = { + value: "繁體中文", + label: "繁體中文", + }; + break; + case "ko": + case "ko-KR": + this.settings[languageIndex].options[0] = { + value: "한국어", + label: "한국어", + }; + break; + case "ja": + this.settings[languageIndex].options[0] = { + value: "日本語", + label: "日本語", + }; + break; + case "ca-ES": + this.settings[languageIndex].options[0] = { + value: "Català", + label: "Català", + }; + break; + case "he": + this.settings[languageIndex].options[0] = { + value: "עברית", + label: "עברית", + }; + break; + default: + this.settings[languageIndex].options[0] = { + value: "English", + label: "English", + }; + break; } } diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index c18b00d3023..efb30e6f9d1 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -81,7 +81,7 @@ const languageSettings: { [key: string]: LanguageSetting } = { instructionTextSize: "35px", starterInfoXPos: 33, }, - "es":{ + "es-ES":{ starterInfoTextSize: "56px", instructionTextSize: "35px", }, @@ -1307,119 +1307,119 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } else if (this.startCursorObj.visible) { // this checks to see if the start button is selected switch (button) { - case Button.ACTION: - if (this.tryStart(true)) { - success = true; - } else { - error = true; - } - break; - case Button.UP: + case Button.ACTION: + if (this.tryStart(true)) { + success = true; + } else { + error = true; + } + break; + case Button.UP: // UP from start button: go to pokemon in team if any, otherwise filter - this.startCursorObj.setVisible(false); - if (this.starterSpecies.length > 0) { - this.starterIconsCursorIndex = this.starterSpecies.length - 1; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { + this.startCursorObj.setVisible(false); + if (this.starterSpecies.length > 0) { + this.starterIconsCursorIndex = this.starterSpecies.length - 1; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.startCursorObj.setVisible(false); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } + success = true; + break; + case Button.DOWN: + // DOWN from start button: Go to filters this.startCursorObj.setVisible(false); this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); this.setFilterMode(true); - } - success = true; - break; - case Button.DOWN: - // DOWN from start button: Go to filters - this.startCursorObj.setVisible(false); - this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); - this.setFilterMode(true); - success = true; - break; - case Button.LEFT: - if (numberOfStarters > 0) { - this.startCursorObj.setVisible(false); - this.cursorObj.setVisible(true); - this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows - 1) * 9 + 8); // set last column success = true; - } - break; - case Button.RIGHT: - if (numberOfStarters > 0) { - this.startCursorObj.setVisible(false); - this.cursorObj.setVisible(true); - this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows - 1) * 9); // set first column - success = true; - } - break; + break; + case Button.LEFT: + if (numberOfStarters > 0) { + this.startCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows - 1) * 9 + 8); // set last column + success = true; + } + break; + case Button.RIGHT: + if (numberOfStarters > 0) { + this.startCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(onScreenFirstIndex + (onScreenNumberOfRows - 1) * 9); // set first column + success = true; + } + break; } } else if (this.filterMode) { switch (button) { - case Button.LEFT: - if (this.filterBarCursor > 0) { - success = this.setCursor(this.filterBarCursor - 1); - } else { - success = this.setCursor(this.filterBar.numFilters - 1); - } - break; - case Button.RIGHT: - if (this.filterBarCursor < this.filterBar.numFilters - 1) { - success = this.setCursor(this.filterBarCursor + 1); - } else { - success = this.setCursor(0); - } - break; - case Button.UP: - if (this.filterBar.openDropDown) { - success = this.filterBar.decDropDownCursor(); - } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { - // UP from the last filter, move to start button - this.setFilterMode(false); - this.cursorObj.setVisible(false); - this.startCursorObj.setVisible(true); - success = true; - } else if (numberOfStarters > 0) { - // UP from filter bar to bottom of Pokemon list - this.setFilterMode(false); - this.scrollCursor = Math.max(0, numOfRows - 9); - this.updateScroll(); - const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; - const targetCol = Math.min(8, Math.floor(proportion * 11)); - if (numberOfStarters % 9 > targetCol) { - this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + case Button.LEFT: + if (this.filterBarCursor > 0) { + success = this.setCursor(this.filterBarCursor - 1); } else { - this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + success = this.setCursor(this.filterBar.numFilters - 1); + } + break; + case Button.RIGHT: + if (this.filterBarCursor < this.filterBar.numFilters - 1) { + success = this.setCursor(this.filterBarCursor + 1); + } else { + success = this.setCursor(0); + } + break; + case Button.UP: + if (this.filterBar.openDropDown) { + success = this.filterBar.decDropDownCursor(); + } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { + // UP from the last filter, move to start button + this.setFilterMode(false); + this.cursorObj.setVisible(false); + this.startCursorObj.setVisible(true); + success = true; + } else if (numberOfStarters > 0) { + // UP from filter bar to bottom of Pokemon list + this.setFilterMode(false); + this.scrollCursor = Math.max(0, numOfRows - 9); + this.updateScroll(); + const proportion = (this.filterBarCursor + 0.5) / this.filterBar.numFilters; + const targetCol = Math.min(8, Math.floor(proportion * 11)); + if (numberOfStarters % 9 > targetCol) { + this.setCursor(numberOfStarters - (numberOfStarters) % 9 + targetCol); + } else { + this.setCursor(Math.max(numberOfStarters - (numberOfStarters) % 9 + targetCol - 9, 0)); + } + success = true; + } + break; + case Button.DOWN: + if (this.filterBar.openDropDown) { + success = this.filterBar.incDropDownCursor(); + } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { + // DOWN from the last filter, move to Pokemon in party if any + this.setFilterMode(false); + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = 0; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + success = true; + } else if (numberOfStarters > 0) { + // DOWN from filter bar to top of Pokemon list + this.setFilterMode(false); + this.scrollCursor = 0; + this.updateScroll(); + const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); + const targetCol = Math.min(8, Math.floor(proportion * 11)); + this.setCursor(Math.min(targetCol, numberOfStarters)); + success = true; + } + break; + case Button.ACTION: + if (!this.filterBar.openDropDown) { + this.filterBar.toggleDropDown(this.filterBarCursor); + } else { + this.filterBar.toggleOptionState(); } success = true; - } - break; - case Button.DOWN: - if (this.filterBar.openDropDown) { - success = this.filterBar.incDropDownCursor(); - } else if (this.filterBarCursor === this.filterBar.numFilters - 1 && this.starterSpecies.length > 0) { - // DOWN from the last filter, move to Pokemon in party if any - this.setFilterMode(false); - this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = 0; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); - success = true; - } else if (numberOfStarters > 0) { - // DOWN from filter bar to top of Pokemon list - this.setFilterMode(false); - this.scrollCursor = 0; - this.updateScroll(); - const proportion = this.filterBarCursor / Math.max(1, this.filterBar.numFilters - 1); - const targetCol = Math.min(8, Math.floor(proportion * 11)); - this.setCursor(Math.min(targetCol, numberOfStarters)); - success = true; - } - break; - case Button.ACTION: - if (!this.filterBar.openDropDown) { - this.filterBar.toggleDropDown(this.filterBarCursor); - } else { - this.filterBar.toggleOptionState(); - } - success = true; - break; + break; } } else { @@ -1860,259 +1860,259 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } else { const props = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); switch (button) { - case Button.CYCLE_SHINY: - if (this.canCycleShiny) { - starterAttributes.shiny = starterAttributes.shiny !== undefined ? !starterAttributes.shiny : false; + case Button.CYCLE_SHINY: + if (this.canCycleShiny) { + starterAttributes.shiny = starterAttributes.shiny !== undefined ? !starterAttributes.shiny : false; - if (starterAttributes.shiny) { + if (starterAttributes.shiny) { // Change to shiny, we need to get the proper default variant - const newProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); - const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : newProps.variant; - this.setSpeciesDetails(this.lastSpecies, true, undefined, undefined, newVariant, undefined, undefined); + const newProps = this.scene.gameData.getSpeciesDexAttrProps(this.lastSpecies, this.getCurrentDexProps(this.lastSpecies.speciesId)); + const newVariant = starterAttributes.variant ? starterAttributes.variant as Variant : newProps.variant; + this.setSpeciesDetails(this.lastSpecies, true, undefined, undefined, newVariant, undefined, undefined); - this.scene.playSound("se/sparkle"); - // Set the variant label to the shiny tint - const tint = getVariantTint(newVariant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); - this.pokemonShinyIcon.setTint(tint); - this.pokemonShinyIcon.setVisible(true); - } else { - this.setSpeciesDetails(this.lastSpecies, false, undefined, undefined, 0, undefined, undefined); - this.pokemonShinyIcon.setVisible(false); - success = true; - } - } - break; - case Button.CYCLE_FORM: - if (this.canCycleForm) { - const formCount = this.lastSpecies.forms.length; - let newFormIndex = props.formIndex; - do { - newFormIndex = (newFormIndex + 1) % formCount; - if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr! & this.scene.gameData.getFormAttr(newFormIndex)) { // TODO: are those bangs correct? - break; + this.scene.playSound("se/sparkle"); + // Set the variant label to the shiny tint + const tint = getVariantTint(newVariant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant)); + this.pokemonShinyIcon.setTint(tint); + this.pokemonShinyIcon.setVisible(true); + } else { + this.setSpeciesDetails(this.lastSpecies, false, undefined, undefined, 0, undefined, undefined); + this.pokemonShinyIcon.setVisible(false); + success = true; } - } 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; - } - break; - case Button.CYCLE_ABILITY: - if (this.canCycleAbility) { - const abilityCount = this.lastSpecies.getAbilityCount(); - const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; - const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; - let newAbilityIndex = this.abilityCursor; - do { - newAbilityIndex = (newAbilityIndex + 1) % abilityCount; - if (newAbilityIndex === 0) { - if (hasAbility1) { + } + break; + case Button.CYCLE_FORM: + if (this.canCycleForm) { + const formCount = this.lastSpecies.forms.length; + let newFormIndex = props.formIndex; + do { + newFormIndex = (newFormIndex + 1) % formCount; + if (this.lastSpecies.forms[newFormIndex].isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr! & this.scene.gameData.getFormAttr(newFormIndex)) { // TODO: are those bangs correct? break; } - } else if (newAbilityIndex === 1) { + } 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; + } + break; + case Button.CYCLE_ABILITY: + if (this.canCycleAbility) { + const abilityCount = this.lastSpecies.getAbilityCount(); + const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + let newAbilityIndex = this.abilityCursor; + do { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; + if (newAbilityIndex === 0) { + if (hasAbility1) { + break; + } + } else if (newAbilityIndex === 1) { // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 - if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { - newAbilityIndex = (newAbilityIndex + 1) % abilityCount; - } - break; - } else { - if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { + if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { + newAbilityIndex = (newAbilityIndex + 1) % abilityCount; + } break; + } else { + if (abilityAttr & AbilityAttr.ABILITY_HIDDEN) { + break; + } } - } - } while (newAbilityIndex !== this.abilityCursor); - starterAttributes.ability = newAbilityIndex; // store the selected ability + } while (newAbilityIndex !== this.abilityCursor); + starterAttributes.ability = newAbilityIndex; // store the selected ability - const { visible: tooltipVisible } = this.scene.ui.getTooltip(); + const { visible: tooltipVisible } = this.scene.ui.getTooltip(); - if (tooltipVisible && this.activeTooltip === "ABILITY") { - const newAbility = allAbilities[this.lastSpecies.getAbility(newAbilityIndex)]; - this.scene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); - } + if (tooltipVisible && this.activeTooltip === "ABILITY") { + const newAbility = allAbilities[this.lastSpecies.getAbility(newAbilityIndex)]; + this.scene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); + } - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); - success = true; - } - break; - case Button.CYCLE_NATURE: - if (this.canCycleNature) { - const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); - const natureIndex = natures.indexOf(this.natureCursor); - const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; - // 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; - } - break; - case Button.V: - if (this.canCycleVariant) { - let newVariant = props.variant; - do { - newVariant = (newVariant + 1) % 3; - if (!newVariant) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { // TODO: is this bang correct? - break; - } - } else if (newVariant === 1) { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { // TODO: is this bang correct? - break; - } - } else { - if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { // TODO: is this bang correct? - break; - } - } - } while (newVariant !== props.variant); - starterAttributes.variant = newVariant; // store the selected variant - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant as Variant, undefined, undefined); - // Cycle tint based on current sprite tint - const tint = getVariantTint(newVariant as Variant); - this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); - this.pokemonShinyIcon.setTint(tint); - success = true; - } - break; - case Button.UP: - if (!this.starterIconsCursorObj.visible) { - if (currentRow > 0) { - if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { - this.scrollCursor--; - this.updateScroll(); - } - success = this.setCursor(this.cursor - 9); - } else { - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); - this.setFilterMode(true); + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); success = true; } - } else { - if (this.starterIconsCursorIndex === 0) { + break; + case Button.CYCLE_NATURE: + if (this.canCycleNature) { + const natures = this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr); + const natureIndex = natures.indexOf(this.natureCursor); + const newNature = natures[natureIndex < natures.length - 1 ? natureIndex + 1 : 0]; + // 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; + } + break; + case Button.V: + if (this.canCycleVariant) { + let newVariant = props.variant; + do { + newVariant = (newVariant + 1) % 3; + if (!newVariant) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT) { // TODO: is this bang correct? + break; + } + } else if (newVariant === 1) { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2) { // TODO: is this bang correct? + break; + } + } else { + if (this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3) { // TODO: is this bang correct? + break; + } + } + } while (newVariant !== props.variant); + starterAttributes.variant = newVariant; // store the selected variant + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, newVariant as Variant, undefined, undefined); + // Cycle tint based on current sprite tint + const tint = getVariantTint(newVariant as Variant); + this.pokemonShinyIcon.setFrame(getVariantIcon(newVariant as Variant)); + this.pokemonShinyIcon.setTint(tint); + success = true; + } + break; + case Button.UP: + if (!this.starterIconsCursorObj.visible) { + if (currentRow > 0) { + if (this.scrollCursor > 0 && currentRow - this.scrollCursor === 0) { + this.scrollCursor--; + this.updateScroll(); + } + success = this.setCursor(this.cursor - 9); + } else { + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } + } else { + if (this.starterIconsCursorIndex === 0) { // Up from first Pokemon in the team > go to filter - this.starterIconsCursorObj.setVisible(false); - this.setSpecies(null); - this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); - this.setFilterMode(true); - } else { - this.starterIconsCursorIndex--; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } - success = true; - } - break; - case Button.DOWN: - if (!this.starterIconsCursorObj.visible) { - if (currentRow < numOfRows - 1) { // not last row - if (currentRow - this.scrollCursor === 8) { // last row of visible starters - this.scrollCursor++; + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.filterBarCursor = Math.max(1, this.filterBar.numFilters - 1); + this.setFilterMode(true); + } else { + this.starterIconsCursorIndex--; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); } - success = this.setCursor(this.cursor + 9); - this.updateScroll(); - } else if (numOfRows > 1) { - // DOWN from last row of Pokemon > Wrap around to first row - this.scrollCursor = 0; - this.updateScroll(); - success = this.setCursor(this.cursor % 9); - } else { - // DOWN from single row of Pokemon > Go to filters - this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); - this.setFilterMode(true); success = true; } - } else { - if (this.starterIconsCursorIndex <= this.starterSpecies.length - 2) { - this.starterIconsCursorIndex++; - this.moveStarterIconsCursor(this.starterIconsCursorIndex); + break; + case Button.DOWN: + if (!this.starterIconsCursorObj.visible) { + if (currentRow < numOfRows - 1) { // not last row + if (currentRow - this.scrollCursor === 8) { // last row of visible starters + this.scrollCursor++; + } + success = this.setCursor(this.cursor + 9); + this.updateScroll(); + } else if (numOfRows > 1) { + // DOWN from last row of Pokemon > Wrap around to first row + this.scrollCursor = 0; + this.updateScroll(); + success = this.setCursor(this.cursor % 9); + } else { + // DOWN from single row of Pokemon > Go to filters + this.filterBarCursor = this.filterBar.getNearestFilter(this.filteredStarterContainers[this.cursor]); + this.setFilterMode(true); + success = true; + } } else { - this.starterIconsCursorObj.setVisible(false); - this.setSpecies(null); - this.startCursorObj.setVisible(true); + if (this.starterIconsCursorIndex <= this.starterSpecies.length - 2) { + this.starterIconsCursorIndex++; + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + } else { + this.starterIconsCursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = true; - } - break; - case Button.LEFT: - if (!this.starterIconsCursorObj.visible) { - if (this.cursor % 9 !== 0) { - success = this.setCursor(this.cursor - 1); - } else { + break; + case Button.LEFT: + if (!this.starterIconsCursorObj.visible) { + if (this.cursor % 9 !== 0) { + success = this.setCursor(this.cursor - 1); + } else { // LEFT from filtered Pokemon, on the left edge - if (this.starterSpecies.length === 0) { + if (this.starterSpecies.length === 0) { // no starter in team > wrap around to the last column - success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); + success = this.setCursor(this.cursor + Math.min(8, numberOfStarters - this.cursor)); - } else if (onScreenCurrentRow < 7) { + } else if (onScreenCurrentRow < 7) { // at least one pokemon in team > for the first 7 rows, go to closest starter - this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); - this.moveStarterIconsCursor(this.starterIconsCursorIndex); + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); - } else { + } else { // at least one pokemon in team > from the bottom 2 rows, go to start run button - this.cursorObj.setVisible(false); - this.setSpecies(null); - this.startCursorObj.setVisible(true); + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; } - success = true; - } - } else if (numberOfStarters > 0) { + } else if (numberOfStarters > 0) { // LEFT from team > Go to closest filtered Pokemon - const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); - this.starterIconsCursorObj.setVisible(false); - this.cursorObj.setVisible(true); - this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); - success = true; - } else { - // LEFT from team and no Pokemon in filter > do nothing - success = false; - } - break; - case Button.RIGHT: - if (!this.starterIconsCursorObj.visible) { - // is not right edge - if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { - success = this.setCursor(this.cursor + 1); - } else { - // RIGHT from filtered Pokemon, on the right edge - if (this.starterSpecies.length === 0) { - // no selected starter in team > wrap around to the first column - success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); - - } else if (onScreenCurrentRow < 7) { - // at least one pokemon in team > for the first 7 rows, go to closest starter - this.cursorObj.setVisible(false); - this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); - this.moveStarterIconsCursor(this.starterIconsCursorIndex); - - } else { - // at least one pokemon in team > from the bottom 2 rows, go to start run button - this.cursorObj.setVisible(false); - this.setSpecies(null); - this.startCursorObj.setVisible(true); - } + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9 + 8, onScreenLastIndex)); success = true; + } else { + // LEFT from team and no Pokemon in filter > do nothing + success = false; } - } else if (numberOfStarters > 0) { + break; + case Button.RIGHT: + if (!this.starterIconsCursorObj.visible) { + // is not right edge + if (this.cursor % 9 < (currentRow < numOfRows - 1 ? 8 : (numberOfStarters - 1) % 9)) { + success = this.setCursor(this.cursor + 1); + } else { + // RIGHT from filtered Pokemon, on the right edge + if (this.starterSpecies.length === 0) { + // no selected starter in team > wrap around to the first column + success = this.setCursor(this.cursor - Math.min(8, this.cursor % 9)); + + } else if (onScreenCurrentRow < 7) { + // at least one pokemon in team > for the first 7 rows, go to closest starter + this.cursorObj.setVisible(false); + this.starterIconsCursorIndex = findClosestStarterIndex(this.cursorObj.y - 1, this.starterSpecies.length); + this.moveStarterIconsCursor(this.starterIconsCursorIndex); + + } else { + // at least one pokemon in team > from the bottom 2 rows, go to start run button + this.cursorObj.setVisible(false); + this.setSpecies(null); + this.startCursorObj.setVisible(true); + } + success = true; + } + } else if (numberOfStarters > 0) { // RIGHT from team > Go to closest filtered Pokemon - const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); - this.starterIconsCursorObj.setVisible(false); - this.cursorObj.setVisible(true); - this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); - success = true; - } else { + const closestRowIndex = findClosestStarterRow(this.starterIconsCursorIndex, onScreenNumberOfRows); + this.starterIconsCursorObj.setVisible(false); + this.cursorObj.setVisible(true); + this.setCursor(Math.min(onScreenFirstIndex + closestRowIndex * 9, onScreenLastIndex - (onScreenLastIndex % 9))); + success = true; + } else { // RIGHT from team and no Pokemon in filter > do nothing - success = false; - } - break; + success = false; + } + break; } } } @@ -2214,29 +2214,29 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (gamepadType === "touch") { gamepadType = "keyboard"; switch (iconSetting) { - case SettingKeyboard.Button_Cycle_Shiny: - iconPath = "R.png"; - break; - case SettingKeyboard.Button_Cycle_Form: - iconPath = "F.png"; - break; - case SettingKeyboard.Button_Cycle_Gender: - iconPath = "G.png"; - break; - case SettingKeyboard.Button_Cycle_Ability: - iconPath = "E.png"; - break; - case SettingKeyboard.Button_Cycle_Nature: - iconPath = "N.png"; - break; - case SettingKeyboard.Button_Cycle_Variant: - iconPath = "V.png"; - break; - case SettingKeyboard.Button_Stats: - iconPath = "C.png"; - break; - default: - break; + case SettingKeyboard.Button_Cycle_Shiny: + iconPath = "R.png"; + break; + case SettingKeyboard.Button_Cycle_Form: + iconPath = "F.png"; + break; + case SettingKeyboard.Button_Cycle_Gender: + iconPath = "G.png"; + break; + case SettingKeyboard.Button_Cycle_Ability: + iconPath = "E.png"; + break; + case SettingKeyboard.Button_Cycle_Nature: + iconPath = "N.png"; + break; + case SettingKeyboard.Button_Cycle_Variant: + iconPath = "V.png"; + break; + case SettingKeyboard.Button_Stats: + iconPath = "C.png"; + break; + default: + break; } } else { iconPath = this.scene.inputController?.getIconForLatestInputRecorded(iconSetting); @@ -2327,12 +2327,12 @@ export default class StarterSelectUiHandler extends MessageUiHandler { getValueLimit(): integer { const valueLimit = new Utils.IntegerHolder(0); switch (this.scene.gameMode.modeId) { - case GameModes.ENDLESS: - case GameModes.SPLICED_ENDLESS: - valueLimit.value = 15; - break; - default: - valueLimit.value = 10; + case GameModes.ENDLESS: + case GameModes.SPLICED_ENDLESS: + valueLimit.value = 15; + break; + default: + valueLimit.value = 10; } Challenge.applyChallenges(this.scene.gameMode, Challenge.ChallengeType.STARTER_POINTS, valueLimit); @@ -2536,22 +2536,22 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const sort = this.filterBar.getVals(DropDownColumn.SORT)[0]; this.filteredStarterContainers.sort((a, b) => { switch (sort.val) { - default: - break; - case SortCriteria.NUMBER: - return (a.species.speciesId - b.species.speciesId) * -sort.dir; - case SortCriteria.COST: - return (a.cost - b.cost) * -sort.dir; - case SortCriteria.CANDY: - const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; - const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; - return (candyCountA - candyCountB) * -sort.dir; - case SortCriteria.IV: - const avgIVsA = this.scene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[a.species.speciesId].ivs.length; - const avgIVsB = this.scene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[b.species.speciesId].ivs.length; - return (avgIVsA - avgIVsB) * -sort.dir; - case SortCriteria.NAME: - return a.species.name.localeCompare(b.species.name) * -sort.dir; + default: + break; + case SortCriteria.NUMBER: + return (a.species.speciesId - b.species.speciesId) * -sort.dir; + case SortCriteria.COST: + return (a.cost - b.cost) * -sort.dir; + case SortCriteria.CANDY: + const candyCountA = this.scene.gameData.starterData[a.species.speciesId].candyCount; + const candyCountB = this.scene.gameData.starterData[b.species.speciesId].candyCount; + return (candyCountA - candyCountB) * -sort.dir; + case SortCriteria.IV: + const avgIVsA = this.scene.gameData.dexData[a.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[a.species.speciesId].ivs.length; + const avgIVsB = this.scene.gameData.dexData[b.species.speciesId].ivs.reduce((a, b) => a + b, 0) / this.scene.gameData.dexData[b.species.speciesId].ivs.length; + return (avgIVsA - avgIVsB) * -sort.dir; + case SortCriteria.NAME: + return a.species.name.localeCompare(b.species.name) * -sort.dir; } return 0; }); @@ -3366,16 +3366,16 @@ export default class StarterSelectUiHandler extends MessageUiHandler { starter.label.setText(valueStr); let textStyle: TextStyle; switch (baseStarterValue - starterValue) { - case 0: - textStyle = TextStyle.WINDOW; - break; - case 1: - case 0.5: - textStyle = TextStyle.SUMMARY_BLUE; - break; - default: - textStyle = TextStyle.SUMMARY_GOLD; - break; + case 0: + textStyle = TextStyle.WINDOW; + break; + case 1: + case 0.5: + textStyle = TextStyle.SUMMARY_BLUE; + break; + default: + textStyle = TextStyle.SUMMARY_GOLD; + break; } if (baseStarterValue - starterValue > 0) { starter.label.setColor(this.getTextColor(textStyle)); diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts index 86b00f512a9..b35c0ca3303 100644 --- a/src/ui/summary-ui-handler.ts +++ b/src/ui/summary-ui-handler.ts @@ -406,22 +406,22 @@ export default class SummaryUiHandler extends UiHandler { this.genderText.setShadowColor(getGenderColor(this.pokemon.getGender(true), true)); switch (this.summaryUiMode) { - case SummaryUiMode.DEFAULT: - const page = args.length < 2 ? Page.PROFILE : args[2] as Page; - this.hideMoveEffect(true); - this.setCursor(page); - if (args.length > 3) { - this.selectCallback = args[3]; - } - break; - case SummaryUiMode.LEARN_MOVE: - this.newMove = args[2] as Move; - this.moveSelectFunction = args[3] as Function; + case SummaryUiMode.DEFAULT: + const page = args.length < 2 ? Page.PROFILE : args[2] as Page; + this.hideMoveEffect(true); + this.setCursor(page); + if (args.length > 3) { + this.selectCallback = args[3]; + } + break; + case SummaryUiMode.LEARN_MOVE: + this.newMove = args[2] as Move; + this.moveSelectFunction = args[3] as Function; - this.showMoveEffect(true); - this.setCursor(Page.MOVES); - this.showMoveSelect(); - break; + this.showMoveEffect(true); + this.setCursor(Page.MOVES); + this.showMoveSelect(); + break; } const fromSummary = args.length >= 2; @@ -489,25 +489,25 @@ export default class SummaryUiHandler extends UiHandler { success = true; } else { switch (button) { - case Button.UP: - success = this.setCursor(this.moveCursor ? this.moveCursor - 1 : 4); - break; - case Button.DOWN: - success = this.setCursor(this.moveCursor < 4 ? this.moveCursor + 1 : 0); - break; - case Button.LEFT: - this.moveSelect = false; - this.setCursor(Page.STATS); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.hideMoveEffect(); - this.destroyBlinkCursor(); - success = true; + case Button.UP: + success = this.setCursor(this.moveCursor ? this.moveCursor - 1 : 4); break; - } else { - this.hideMoveSelect(); - success = true; + case Button.DOWN: + success = this.setCursor(this.moveCursor < 4 ? this.moveCursor + 1 : 0); break; - } + case Button.LEFT: + this.moveSelect = false; + this.setCursor(Page.STATS); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { + this.hideMoveEffect(); + this.destroyBlinkCursor(); + success = true; + break; + } else { + this.hideMoveSelect(); + success = true; + break; + } } } } else { @@ -546,35 +546,35 @@ export default class SummaryUiHandler extends UiHandler { } else { const pages = Utils.getEnumValues(Page); switch (button) { - case Button.UP: - case Button.DOWN: - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - break; - } else if (!fromPartyMode) { - break; - } - const isDown = button === Button.DOWN; - const party = this.scene.getParty(); - const partyMemberIndex = this.pokemon ? party.indexOf(this.pokemon) : -1; - if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { - const page = this.cursor; - this.clear(); - this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); - } - break; - case Button.LEFT: - if (this.cursor) { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.RIGHT: - if (this.cursor < pages.length - 1) { - success = this.setCursor(this.cursor + 1); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.cursor === Page.MOVES) { - this.moveSelect = true; + case Button.UP: + case Button.DOWN: + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { + break; + } else if (!fromPartyMode) { + break; } - } - break; + const isDown = button === Button.DOWN; + const party = this.scene.getParty(); + const partyMemberIndex = this.pokemon ? party.indexOf(this.pokemon) : -1; + if ((isDown && partyMemberIndex < party.length - 1) || (!isDown && partyMemberIndex)) { + const page = this.cursor; + this.clear(); + this.show([ party[partyMemberIndex + (isDown ? 1 : -1)], this.summaryUiMode, page ]); + } + break; + case Button.LEFT: + if (this.cursor) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (this.cursor < pages.length - 1) { + success = this.setCursor(this.cursor + 1); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.cursor === Page.MOVES) { + this.moveSelect = true; + } + } + break; } } } @@ -730,308 +730,308 @@ export default class SummaryUiHandler extends UiHandler { } switch (page) { - case Page.PROFILE: - const profileContainer = this.scene.add.container(0, -pageBg.height); - pageContainer.add(profileContainer); + case Page.PROFILE: + const profileContainer = this.scene.add.container(0, -pageBg.height); + pageContainer.add(profileContainer); - // TODO: should add field for original trainer name to Pokemon object, to support gift/traded Pokemon from MEs - const trainerText = addBBCodeTextObject(this.scene, 7, 12, `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, TextStyle.SUMMARY_ALT); - trainerText.setOrigin(0, 0); - profileContainer.add(trainerText); + // TODO: should add field for original trainer name to Pokemon object, to support gift/traded Pokemon from MEs + const trainerText = addBBCodeTextObject(this.scene, 7, 12, `${i18next.t("pokemonSummary:ot")}/${getBBCodeFrag(loggedInUser?.username || i18next.t("pokemonSummary:unknown"), this.scene.gameData.gender === PlayerGender.FEMALE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE)}`, TextStyle.SUMMARY_ALT); + trainerText.setOrigin(0, 0); + profileContainer.add(trainerText); - const trainerIdText = addTextObject(this.scene, 174, 12, this.scene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); - trainerIdText.setOrigin(0, 0); - profileContainer.add(trainerIdText); + const trainerIdText = addTextObject(this.scene, 174, 12, this.scene.gameData.trainerId.toString(), TextStyle.SUMMARY_ALT); + trainerIdText.setOrigin(0, 0); + profileContainer.add(trainerIdText); - const typeLabel = addTextObject(this.scene, 7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); - typeLabel.setOrigin(0, 0); - profileContainer.add(typeLabel); + const typeLabel = addTextObject(this.scene, 7, 28, `${i18next.t("pokemonSummary:type")}/`, TextStyle.WINDOW_ALT); + typeLabel.setOrigin(0, 0); + profileContainer.add(typeLabel); - const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { - const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; - const typeIcon = !tera - ? this.scene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) - : this.scene.add.sprite(xCoord, 42, "type_tera"); - if (tera) { - typeIcon.setScale(0.5); - const typeRgb = getTypeRgb(type); - typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2])); + const getTypeIcon = (index: integer, type: Type, tera: boolean = false) => { + const xCoord = typeLabel.width * typeLabel.scale + 9 + 34 * index; + const typeIcon = !tera + ? this.scene.add.sprite(xCoord, 42, Utils.getLocalizedSpriteKey("types"), Type[type].toLowerCase()) + : this.scene.add.sprite(xCoord, 42, "type_tera"); + if (tera) { + typeIcon.setScale(0.5); + const typeRgb = getTypeRgb(type); + typeIcon.setTint(Phaser.Display.Color.GetColor(typeRgb[0], typeRgb[1], typeRgb[2])); + } + typeIcon.setOrigin(0, 1); + return typeIcon; + }; + + const types = this.pokemon?.getTypes(false, false, true)!; // TODO: is this bang correct? + profileContainer.add(getTypeIcon(0, types[0])); + if (types.length > 1) { + profileContainer.add(getTypeIcon(1, types[1])); + } + if (this.pokemon?.isTerastallized()) { + profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); } - typeIcon.setOrigin(0, 1); - return typeIcon; - }; - const types = this.pokemon?.getTypes(false, false, true)!; // TODO: is this bang correct? - profileContainer.add(getTypeIcon(0, types[0])); - if (types.length > 1) { - profileContainer.add(getTypeIcon(1, types[1])); - } - if (this.pokemon?.isTerastallized()) { - profileContainer.add(getTypeIcon(types.length, this.pokemon.getTeraType(), true)); - } + if (this.pokemon?.getLuck()) { + const luckLabelText = addTextObject(this.scene, 141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); + luckLabelText.setOrigin(0, 0); + profileContainer.add(luckLabelText); - if (this.pokemon?.getLuck()) { - const luckLabelText = addTextObject(this.scene, 141, 28, i18next.t("common:luckIndicator"), TextStyle.SUMMARY_ALT); - luckLabelText.setOrigin(0, 0); - profileContainer.add(luckLabelText); + const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); + luckText.setOrigin(0, 0); + luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); + profileContainer.add(luckText); + } - const luckText = addTextObject(this.scene, 141 + luckLabelText.displayWidth + 2, 28, this.pokemon.getLuck().toString(), TextStyle.SUMMARY); - luckText.setOrigin(0, 0); - luckText.setTint(getVariantTint((Math.min(this.pokemon.getLuck() - 1, 2)) as Variant)); - profileContainer.add(luckText); - } - - this.abilityContainer = { - labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), - ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? - nameText: null, - descriptionText: null }; - - const allAbilityInfo = [ this.abilityContainer ]; // Creates an array to iterate through - // Only add to the array and set up displaying a passive if it's unlocked - if (this.pokemon?.hasPassive()) { - this.passiveContainer = { - labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), - ability: this.pokemon.getPassiveAbility(), + this.abilityContainer = { + labelImage: this.scene.add.image(0, 0, "summary_profile_ability"), + ability: this.pokemon?.getAbility(true)!, // TODO: is this bang correct? nameText: null, descriptionText: null }; - allAbilityInfo.push(this.passiveContainer); - // Sets up the pixel button prompt image - this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); - this.abilityPrompt.setPosition(8, 43); - this.abilityPrompt.setVisible(true); - this.abilityPrompt.setOrigin(0, 0); - profileContainer.add(this.abilityPrompt); - } + const allAbilityInfo = [ this.abilityContainer ]; // Creates an array to iterate through + // Only add to the array and set up displaying a passive if it's unlocked + if (this.pokemon?.hasPassive()) { + this.passiveContainer = { + labelImage: this.scene.add.image(0, 0, "summary_profile_passive"), + ability: this.pokemon.getPassiveAbility(), + nameText: null, + descriptionText: null }; + allAbilityInfo.push(this.passiveContainer); - allAbilityInfo.forEach(abilityInfo => { - abilityInfo.labelImage.setPosition(17, 43); - abilityInfo.labelImage.setVisible(true); - abilityInfo.labelImage.setOrigin(0, 0); - profileContainer.add(abilityInfo.labelImage); - - abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? - abilityInfo.nameText.setOrigin(0, 1); - profileContainer.add(abilityInfo.nameText); - - abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 }}); // TODO: is this bang correct? - abilityInfo.descriptionText.setOrigin(0, 0); - profileContainer.add(abilityInfo.descriptionText); - - // Sets up the mask that hides the description text to give an illusion of scrolling - const descriptionTextMaskRect = this.scene.make.graphics({}); - descriptionTextMaskRect.setScale(6); - descriptionTextMaskRect.fillStyle(0xFFFFFF); - descriptionTextMaskRect.beginPath(); - descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); - - const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); - - abilityInfo.descriptionText.setMask(abilityDescriptionTextMask); - - const abilityDescriptionLineCount = Math.floor(abilityInfo.descriptionText.displayHeight / 14.83); - - // Animates the description text moving upwards - if (abilityDescriptionLineCount > 2) { - abilityInfo.descriptionText.setY(69); - this.descriptionScrollTween = this.scene.tweens.add({ - targets: abilityInfo.descriptionText, - delay: Utils.fixedInt(2000), - loop: -1, - hold: Utils.fixedInt(2000), - duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), - y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` - }); + // Sets up the pixel button prompt image + this.abilityPrompt = this.scene.add.image(0, 0, !this.scene.inputController?.gamepadSupport ? "summary_profile_prompt_z" : "summary_profile_prompt_a"); + this.abilityPrompt.setPosition(8, 43); + this.abilityPrompt.setVisible(true); + this.abilityPrompt.setOrigin(0, 0); + profileContainer.add(this.abilityPrompt); } - }); - // Turn off visibility of passive info by default - this.passiveContainer?.labelImage.setVisible(false); - this.passiveContainer?.nameText?.setVisible(false); - this.passiveContainer?.descriptionText?.setVisible(false); - const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); - const rawNature = Utils.toReadableString(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? - const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? + allAbilityInfo.forEach(abilityInfo => { + abilityInfo.labelImage.setPosition(17, 43); + abilityInfo.labelImage.setVisible(true); + abilityInfo.labelImage.setOrigin(0, 0); + profileContainer.add(abilityInfo.labelImage); - const memoString = i18next.t("pokemonSummary:memoString", { - metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, { - biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? - wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, - }), - natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) - }); + abilityInfo.nameText = addTextObject(this.scene, 7, 66, abilityInfo.ability?.name!, TextStyle.SUMMARY_ALT); // TODO: is this bang correct? + abilityInfo.nameText.setOrigin(0, 1); + profileContainer.add(abilityInfo.nameText); - const memoText = addBBCodeTextObject(this.scene, 7, 113, String(memoString), TextStyle.WINDOW_ALT); - memoText.setOrigin(0, 0); - profileContainer.add(memoText); - break; - case Page.STATS: - const statsContainer = this.scene.add.container(0, -pageBg.height); - pageContainer.add(statsContainer); + abilityInfo.descriptionText = addTextObject(this.scene, 7, 69, abilityInfo.ability?.description!, TextStyle.WINDOW_ALT, { wordWrap: { width: 1224 }}); // TODO: is this bang correct? + abilityInfo.descriptionText.setOrigin(0, 0); + profileContainer.add(abilityInfo.descriptionText); - PERMANENT_STATS.forEach((stat, s) => { - const statName = i18next.t(getStatKey(stat)); - const rowIndex = s % 3; - const colIndex = Math.floor(s / 3); + // Sets up the mask that hides the description text to give an illusion of scrolling + const descriptionTextMaskRect = this.scene.make.graphics({}); + descriptionTextMaskRect.setScale(6); + descriptionTextMaskRect.fillStyle(0xFFFFFF); + descriptionTextMaskRect.beginPath(); + descriptionTextMaskRect.fillRect(110, 90.5, 206, 31); - const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? + const abilityDescriptionTextMask = descriptionTextMaskRect.createGeometryMask(); - const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); - statLabel.setOrigin(0.5, 0); - statsContainer.add(statLabel); + abilityInfo.descriptionText.setMask(abilityDescriptionTextMask); - const statValueText = stat !== Stat.HP - ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? - : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + const abilityDescriptionLineCount = Math.floor(abilityInfo.descriptionText.displayHeight / 14.83); - const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); - statValue.setOrigin(1, 0); - statsContainer.add(statValue); - }); + // Animates the description text moving upwards + if (abilityDescriptionLineCount > 2) { + abilityInfo.descriptionText.setY(69); + this.descriptionScrollTween = this.scene.tweens.add({ + targets: abilityInfo.descriptionText, + delay: Utils.fixedInt(2000), + loop: -1, + hold: Utils.fixedInt(2000), + duration: Utils.fixedInt((abilityDescriptionLineCount - 2) * 2000), + y: `-=${14.83 * (abilityDescriptionLineCount - 2)}` + }); + } + }); + // Turn off visibility of passive info by default + this.passiveContainer?.labelImage.setVisible(false); + this.passiveContainer?.nameText?.setVisible(false); + this.passiveContainer?.descriptionText?.setVisible(false); - const itemModifiers = (this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier + const closeFragment = getBBCodeFrag("", TextStyle.WINDOW_ALT); + const rawNature = Utils.toReadableString(Nature[this.pokemon?.getNature()!]); // TODO: is this bang correct? + const nature = `${getBBCodeFrag(Utils.toReadableString(getNatureName(this.pokemon?.getNature()!)), TextStyle.SUMMARY_RED)}${closeFragment}`; // TODO: is this bang correct? + + const memoString = i18next.t("pokemonSummary:memoString", { + metFragment: i18next.t(`pokemonSummary:metFragment.${this.pokemon?.metBiome === -1 ? "apparently" : "normal"}`, { + biome: `${getBBCodeFrag(getBiomeName(this.pokemon?.metBiome!), TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + level: `${getBBCodeFrag(this.pokemon?.metLevel.toString()!, TextStyle.SUMMARY_RED)}${closeFragment}`, // TODO: is this bang correct? + wave: `${getBBCodeFrag((this.pokemon?.metWave ? this.pokemon.metWave.toString()! : i18next.t("pokemonSummary:unknownTrainer")), TextStyle.SUMMARY_RED)}${closeFragment}`, + }), + natureFragment: i18next.t(`pokemonSummary:natureFragment.${rawNature}`, { nature: nature }) + }); + + const memoText = addBBCodeTextObject(this.scene, 7, 113, String(memoString), TextStyle.WINDOW_ALT); + memoText.setOrigin(0, 0); + profileContainer.add(memoText); + break; + case Page.STATS: + const statsContainer = this.scene.add.container(0, -pageBg.height); + pageContainer.add(statsContainer); + + PERMANENT_STATS.forEach((stat, s) => { + const statName = i18next.t(getStatKey(stat)); + const rowIndex = s % 3; + const colIndex = Math.floor(s / 3); + + const natureStatMultiplier = getNatureStatMultiplier(this.pokemon?.getNature()!, s); // TODO: is this bang correct? + + const statLabel = addTextObject(this.scene, 27 + 115 * colIndex + (colIndex === 1 ? 5 : 0), 56 + 16 * rowIndex, statName, natureStatMultiplier === 1 ? TextStyle.SUMMARY : natureStatMultiplier > 1 ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY_BLUE); + statLabel.setOrigin(0.5, 0); + statsContainer.add(statLabel); + + const statValueText = stat !== Stat.HP + ? Utils.formatStat(this.pokemon?.getStat(stat)!) // TODO: is this bang correct? + : `${Utils.formatStat(this.pokemon?.hp!, true)}/${Utils.formatStat(this.pokemon?.getMaxHp()!, true)}`; // TODO: are those bangs correct? + + const statValue = addTextObject(this.scene, 120 + 88 * colIndex, 56 + 16 * rowIndex, statValueText, TextStyle.WINDOW_ALT); + statValue.setOrigin(1, 0); + statsContainer.add(statValue); + }); + + const itemModifiers = (this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier && m.pokemonId === this.pokemon?.id, this.playerParty) as PokemonHeldItemModifier[]) - .sort(modifierSortFunc); + .sort(modifierSortFunc); - itemModifiers.forEach((item, i) => { - const icon = item.getIcon(this.scene, true); + itemModifiers.forEach((item, i) => { + const icon = item.getIcon(this.scene, true); - icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); - statsContainer.add(icon); + icon.setPosition((i % 17) * 12 + 3, 14 * Math.floor(i / 17) + 15); + statsContainer.add(icon); - icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); - icon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); - icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); - }); + icon.setInteractive(new Phaser.Geom.Rectangle(0, 0, 32, 32), Phaser.Geom.Rectangle.Contains); + icon.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip(item.type.name, item.type.getDescription(this.scene), true)); + icon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + }); - const pkmLvl = this.pokemon?.level!; // TODO: is this bang correct? - const pkmLvlExp = this.pokemon?.levelExp!; // TODO: is this bang correct? - const pkmExp = this.pokemon?.exp!; // TODO: is this bang correct? - const pkmSpeciesGrowthRate = this.pokemon?.species.growthRate!; // TODO: is this bang correct? - const relLvExp = getLevelRelExp(pkmLvl + 1, pkmSpeciesGrowthRate); - const expRatio = pkmLvl < this.scene.getMaxExpLevel() ? pkmLvlExp / relLvExp : 0; + const pkmLvl = this.pokemon?.level!; // TODO: is this bang correct? + const pkmLvlExp = this.pokemon?.levelExp!; // TODO: is this bang correct? + const pkmExp = this.pokemon?.exp!; // TODO: is this bang correct? + const pkmSpeciesGrowthRate = this.pokemon?.species.growthRate!; // TODO: is this bang correct? + const relLvExp = getLevelRelExp(pkmLvl + 1, pkmSpeciesGrowthRate); + const expRatio = pkmLvl < this.scene.getMaxExpLevel() ? pkmLvlExp / relLvExp : 0; - const expLabel = addTextObject(this.scene, 6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); - expLabel.setOrigin(0, 0); - statsContainer.add(expLabel); + const expLabel = addTextObject(this.scene, 6, 112, i18next.t("pokemonSummary:expPoints"), TextStyle.SUMMARY); + expLabel.setOrigin(0, 0); + statsContainer.add(expLabel); - const nextLvExpLabel = addTextObject(this.scene, 6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); - nextLvExpLabel.setOrigin(0, 0); - statsContainer.add(nextLvExpLabel); + const nextLvExpLabel = addTextObject(this.scene, 6, 128, i18next.t("pokemonSummary:nextLv"), TextStyle.SUMMARY); + nextLvExpLabel.setOrigin(0, 0); + statsContainer.add(nextLvExpLabel); - const expText = addTextObject(this.scene, 208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); - expText.setOrigin(1, 0); - statsContainer.add(expText); + const expText = addTextObject(this.scene, 208, 112, pkmExp.toString(), TextStyle.WINDOW_ALT); + expText.setOrigin(1, 0); + statsContainer.add(expText); - const nextLvExp = pkmLvl < this.scene.getMaxExpLevel() - ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp - : 0; - const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); - nextLvExpText.setOrigin(1, 0); - statsContainer.add(nextLvExpText); + const nextLvExp = pkmLvl < this.scene.getMaxExpLevel() + ? getLevelTotalExp(pkmLvl + 1, pkmSpeciesGrowthRate) - pkmExp + : 0; + const nextLvExpText = addTextObject(this.scene, 208, 128, nextLvExp.toString(), TextStyle.WINDOW_ALT); + nextLvExpText.setOrigin(1, 0); + statsContainer.add(nextLvExpText); - const expOverlay = this.scene.add.image(140, 145, "summary_stats_overlay_exp"); - expOverlay.setOrigin(0, 0); - statsContainer.add(expOverlay); + const expOverlay = this.scene.add.image(140, 145, "summary_stats_overlay_exp"); + expOverlay.setOrigin(0, 0); + statsContainer.add(expOverlay); - const expMaskRect = this.scene.make.graphics({}); - expMaskRect.setScale(6); - expMaskRect.fillStyle(0xFFFFFF); - expMaskRect.beginPath(); - expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); + const expMaskRect = this.scene.make.graphics({}); + expMaskRect.setScale(6); + expMaskRect.fillStyle(0xFFFFFF); + expMaskRect.beginPath(); + expMaskRect.fillRect(140 + pageContainer.x, 145 + pageContainer.y + 21, Math.floor(expRatio * 64), 3); - const expMask = expMaskRect.createGeometryMask(); + const expMask = expMaskRect.createGeometryMask(); - expOverlay.setMask(expMask); - break; - case Page.MOVES: - this.movesContainer = this.scene.add.container(5, -pageBg.height + 26); - pageContainer.add(this.movesContainer); + expOverlay.setMask(expMask); + break; + case Page.MOVES: + this.movesContainer = this.scene.add.container(5, -pageBg.height + 26); + pageContainer.add(this.movesContainer); - this.extraMoveRowContainer = this.scene.add.container(0, 64); - this.extraMoveRowContainer.setVisible(false); - this.movesContainer.add(this.extraMoveRowContainer); + this.extraMoveRowContainer = this.scene.add.container(0, 64); + this.extraMoveRowContainer.setVisible(false); + this.movesContainer.add(this.extraMoveRowContainer); - const extraRowOverlay = this.scene.add.image(-2, 1, "summary_moves_overlay_row"); - extraRowOverlay.setOrigin(0, 1); - this.extraMoveRowContainer.add(extraRowOverlay); + const extraRowOverlay = this.scene.add.image(-2, 1, "summary_moves_overlay_row"); + extraRowOverlay.setOrigin(0, 1); + this.extraMoveRowContainer.add(extraRowOverlay); - const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove ? this.newMove.name : i18next.t("pokemonSummary:cancel"), - this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); - extraRowText.setOrigin(0, 1); - this.extraMoveRowContainer.add(extraRowText); + const extraRowText = addTextObject(this.scene, 35, 0, this.summaryUiMode === SummaryUiMode.LEARN_MOVE && this.newMove ? this.newMove.name : i18next.t("pokemonSummary:cancel"), + this.summaryUiMode === SummaryUiMode.LEARN_MOVE ? TextStyle.SUMMARY_PINK : TextStyle.SUMMARY); + extraRowText.setOrigin(0, 1); + this.extraMoveRowContainer.add(extraRowText); - if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { - this.extraMoveRowContainer.setVisible(true); + if (this.summaryUiMode === SummaryUiMode.LEARN_MOVE) { + this.extraMoveRowContainer.setVisible(true); - if (this.newMove && this.pokemon) { - const spriteKey = Utils.getLocalizedSpriteKey("types"); - const moveType = this.pokemon.getMoveType(this.newMove); - const newMoveTypeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); - newMoveTypeIcon.setOrigin(0, 1); - this.extraMoveRowContainer.add(newMoveTypeIcon); - } - const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); - ppOverlay.setOrigin(0, 1); - this.extraMoveRowContainer.add(ppOverlay); + if (this.newMove && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(this.newMove); + const newMoveTypeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + newMoveTypeIcon.setOrigin(0, 1); + this.extraMoveRowContainer.add(newMoveTypeIcon); + } + const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + ppOverlay.setOrigin(0, 1); + this.extraMoveRowContainer.add(ppOverlay); - const pp = Utils.padInt(this.newMove?.pp!, 2, " "); // TODO: is this bang correct? - const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); - ppText.setOrigin(0, 1); - this.extraMoveRowContainer.add(ppText); - } - - this.moveRowsContainer = this.scene.add.container(0, 0); - this.movesContainer.add(this.moveRowsContainer); - - for (let m = 0; m < 4; m++) { - const move: PokemonMove | null = this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; - const moveRowContainer = this.scene.add.container(0, 16 * m); - this.moveRowsContainer.add(moveRowContainer); - - if (move && this.pokemon) { - const spriteKey = Utils.getLocalizedSpriteKey("types"); - const moveType = this.pokemon.getMoveType(move.getMove()); - const typeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); - typeIcon.setOrigin(0, 1); - moveRowContainer.add(typeIcon); + const pp = Utils.padInt(this.newMove?.pp!, 2, " "); // TODO: is this bang correct? + const ppText = addTextObject(this.scene, 173, 1, `${pp}/${pp}`, TextStyle.WINDOW); + ppText.setOrigin(0, 1); + this.extraMoveRowContainer.add(ppText); } - const moveText = addTextObject(this.scene, 35, 0, move ? move.getName() : "-", TextStyle.SUMMARY); - moveText.setOrigin(0, 1); - moveRowContainer.add(moveText); + this.moveRowsContainer = this.scene.add.container(0, 0); + this.movesContainer.add(this.moveRowsContainer); - const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); - ppOverlay.setOrigin(0, 1); - moveRowContainer.add(ppOverlay); + for (let m = 0; m < 4; m++) { + const move: PokemonMove | null = this.pokemon && this.pokemon.moveset.length > m ? this.pokemon?.moveset[m] : null; + const moveRowContainer = this.scene.add.container(0, 16 * m); + this.moveRowsContainer.add(moveRowContainer); - const ppText = addTextObject(this.scene, 173, 1, "--/--", TextStyle.WINDOW); - ppText.setOrigin(0, 1); + if (move && this.pokemon) { + const spriteKey = Utils.getLocalizedSpriteKey("types"); + const moveType = this.pokemon.getMoveType(move.getMove()); + const typeIcon = this.scene.add.sprite(0, 0, spriteKey, Type[moveType].toLowerCase()); + typeIcon.setOrigin(0, 1); + moveRowContainer.add(typeIcon); + } - if (move) { - const maxPP = move.getMovePp(); - const pp = maxPP - move.ppUsed; - ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); + const moveText = addTextObject(this.scene, 35, 0, move ? move.getName() : "-", TextStyle.SUMMARY); + moveText.setOrigin(0, 1); + moveRowContainer.add(moveText); + + const ppOverlay = this.scene.add.image(163, -1, "summary_moves_overlay_pp"); + ppOverlay.setOrigin(0, 1); + moveRowContainer.add(ppOverlay); + + const ppText = addTextObject(this.scene, 173, 1, "--/--", TextStyle.WINDOW); + ppText.setOrigin(0, 1); + + if (move) { + const maxPP = move.getMovePp(); + const pp = maxPP - move.ppUsed; + ppText.setText(`${Utils.padInt(pp, 2, " ")}/${Utils.padInt(maxPP, 2, " ")}`); + } + + moveRowContainer.add(ppText); } - moveRowContainer.add(ppText); - } + this.moveDescriptionText = addTextObject(this.scene, 2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 }}); + this.movesContainer.add(this.moveDescriptionText); - this.moveDescriptionText = addTextObject(this.scene, 2, 84, "", TextStyle.WINDOW_ALT, { wordWrap: { width: 1212 }}); - this.movesContainer.add(this.moveDescriptionText); + const moveDescriptionTextMaskRect = this.scene.make.graphics({}); + moveDescriptionTextMaskRect.setScale(6); + moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); + moveDescriptionTextMaskRect.beginPath(); + moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); - const moveDescriptionTextMaskRect = this.scene.make.graphics({}); - moveDescriptionTextMaskRect.setScale(6); - moveDescriptionTextMaskRect.fillStyle(0xFFFFFF); - moveDescriptionTextMaskRect.beginPath(); - moveDescriptionTextMaskRect.fillRect(112, 130, 202, 46); + const moveDescriptionTextMask = moveDescriptionTextMaskRect.createGeometryMask(); - const moveDescriptionTextMask = moveDescriptionTextMaskRect.createGeometryMask(); - - this.moveDescriptionText.setMask(moveDescriptionTextMask); - break; + this.moveDescriptionText.setMask(moveDescriptionTextMask); + break; } } diff --git a/src/ui/target-select-ui-handler.ts b/src/ui/target-select-ui-handler.ts index 85b671c2617..ecc15e5985e 100644 --- a/src/ui/target-select-ui-handler.ts +++ b/src/ui/target-select-ui-handler.ts @@ -71,26 +71,26 @@ export default class TargetSelectUiHandler extends UiHandler { success = false; } else { switch (button) { - case Button.UP: - if (this.cursor < BattlerIndex.ENEMY && this.targets.findIndex(t => t >= BattlerIndex.ENEMY) > -1) { - success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)!); // TODO: is the bang correct here? - } - break; - case Button.DOWN: - if (this.cursor >= BattlerIndex.ENEMY && this.targets.findIndex(t => t < BattlerIndex.ENEMY) > -1) { - success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)!); // TODO: is the bang correct here? - } - break; - case Button.LEFT: - if (this.cursor % 2 && this.targets.findIndex(t => t === this.cursor - 1) > -1) { - success = this.setCursor(this.cursor - 1); - } - break; - case Button.RIGHT: - if (!(this.cursor % 2) && this.targets.findIndex(t => t === this.cursor + 1) > -1) { - success = this.setCursor(this.cursor + 1); - } - break; + case Button.UP: + if (this.cursor < BattlerIndex.ENEMY && this.targets.findIndex(t => t >= BattlerIndex.ENEMY) > -1) { + success = this.setCursor(this.targets.find(t => t >= BattlerIndex.ENEMY)!); // TODO: is the bang correct here? + } + break; + case Button.DOWN: + if (this.cursor >= BattlerIndex.ENEMY && this.targets.findIndex(t => t < BattlerIndex.ENEMY) > -1) { + success = this.setCursor(this.targets.find(t => t < BattlerIndex.ENEMY)!); // TODO: is the bang correct here? + } + break; + case Button.LEFT: + if (this.cursor % 2 && this.targets.findIndex(t => t === this.cursor - 1) > -1) { + success = this.setCursor(this.cursor - 1); + } + break; + case Button.RIGHT: + if (!(this.cursor % 2) && this.targets.findIndex(t => t === this.cursor + 1) > -1) { + success = this.setCursor(this.cursor + 1); + } + break; } } @@ -184,6 +184,7 @@ export default class TargetSelectUiHandler extends UiHandler { } clear() { + this.cursor = -1; super.clear(); this.eraseCursor(); } diff --git a/src/ui/test-dialogue-ui-handler.ts b/src/ui/test-dialogue-ui-handler.ts index 34fb80ecc89..bf0e7f6723f 100644 --- a/src/ui/test-dialogue-ui-handler.ts +++ b/src/ui/test-dialogue-ui-handler.ts @@ -1,4 +1,4 @@ -import { FormModalUiHandler } from "./form-modal-ui-handler"; +import { FormModalUiHandler, InputFieldConfig } from "./form-modal-ui-handler"; import { ModalConfig } from "./modal-ui-handler"; import i18next from "i18next"; import { PlayerPokemon } from "#app/field/pokemon"; @@ -43,10 +43,6 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { return "Test Dialogue"; } - getFields(config?: ModalConfig): string[] { - return [ "Dialogue" ]; - } - getWidth(config?: ModalConfig): number { return 300; } @@ -68,8 +64,15 @@ export default class TestDialogueUiHandler extends FormModalUiHandler { return super.getReadableErrorMessage(error); } + override getInputFieldConfigs(): InputFieldConfig[] { + return [{ label: "Dialogue" }]; + } + show(args: any[]): boolean { const ui = this.getUi(); + const hasTitle = !!this.getModalTitle(); + this.updateFields(this.getInputFieldConfigs(), hasTitle); + this.updateContainer(args[0] as ModalConfig); const input = this.inputs[0]; input.setMaxLength(255); diff --git a/src/ui/text.ts b/src/ui/text.ts index 22dd3f4cd6a..069aa8680fc 100644 --- a/src/ui/text.ts +++ b/src/ui/text.ts @@ -129,84 +129,84 @@ export function getTextStyleOptions(style: TextStyle, uiTheme: UiTheme, extraSty } switch (style) { - case TextStyle.SUMMARY: - case TextStyle.SUMMARY_ALT: - case TextStyle.SUMMARY_BLUE: - case TextStyle.SUMMARY_RED: - case TextStyle.SUMMARY_PINK: - case TextStyle.SUMMARY_GOLD: - case TextStyle.SUMMARY_GRAY: - case TextStyle.SUMMARY_GREEN: - case TextStyle.WINDOW: - case TextStyle.WINDOW_ALT: - shadowXpos = 3; - shadowYpos = 3; - break; - case TextStyle.STATS_LABEL: - let fontSizeLabel = "96px"; - switch (lang) { - case "de": + case TextStyle.SUMMARY: + case TextStyle.SUMMARY_ALT: + case TextStyle.SUMMARY_BLUE: + case TextStyle.SUMMARY_RED: + case TextStyle.SUMMARY_PINK: + case TextStyle.SUMMARY_GOLD: + case TextStyle.SUMMARY_GRAY: + case TextStyle.SUMMARY_GREEN: + case TextStyle.WINDOW: + case TextStyle.WINDOW_ALT: shadowXpos = 3; shadowYpos = 3; - fontSizeLabel = "80px"; break; - default: - fontSizeLabel = "96px"; + case TextStyle.STATS_LABEL: + let fontSizeLabel = "96px"; + switch (lang) { + case "de": + shadowXpos = 3; + shadowYpos = 3; + fontSizeLabel = "80px"; + break; + default: + fontSizeLabel = "96px"; + break; + } + styleOptions.fontSize = fontSizeLabel; break; - } - styleOptions.fontSize = fontSizeLabel; - break; - case TextStyle.STATS_VALUE: - shadowXpos = 3; - shadowYpos = 3; - let fontSizeValue = "96px"; - switch (lang) { - case "de": - fontSizeValue = "80px"; + case TextStyle.STATS_VALUE: + shadowXpos = 3; + shadowYpos = 3; + let fontSizeValue = "96px"; + switch (lang) { + case "de": + fontSizeValue = "80px"; + break; + default: + fontSizeValue = "96px"; + break; + } + styleOptions.fontSize = fontSizeValue; break; - default: - fontSizeValue = "96px"; + case TextStyle.MESSAGE: + case TextStyle.SETTINGS_LABEL: + case TextStyle.SETTINGS_LOCKED: + case TextStyle.SETTINGS_SELECTED: + break; + case TextStyle.BATTLE_INFO: + case TextStyle.MONEY: + case TextStyle.TOOLTIP_TITLE: + styleOptions.fontSize = defaultFontSize - 24; + shadowXpos = 3.5; + shadowYpos = 3.5; + break; + case TextStyle.PARTY: + case TextStyle.PARTY_RED: + styleOptions.fontSize = defaultFontSize - 30; + styleOptions.fontFamily = "pkmnems"; + break; + case TextStyle.TOOLTIP_CONTENT: + styleOptions.fontSize = defaultFontSize - 32; + shadowXpos = 3; + shadowYpos = 3; + break; + case TextStyle.MOVE_INFO_CONTENT: + styleOptions.fontSize = defaultFontSize - 40; + shadowXpos = 3; + shadowYpos = 3; + break; + case TextStyle.SMALLER_WINDOW_ALT: + styleOptions.fontSize = defaultFontSize - 36; + shadowXpos = 3; + shadowYpos = 3; + break; + case TextStyle.BGM_BAR: + styleOptions.fontSize = defaultFontSize - 24; + shadowXpos = 3; + shadowYpos = 3; break; - } - styleOptions.fontSize = fontSizeValue; - break; - case TextStyle.MESSAGE: - case TextStyle.SETTINGS_LABEL: - case TextStyle.SETTINGS_LOCKED: - case TextStyle.SETTINGS_SELECTED: - break; - case TextStyle.BATTLE_INFO: - case TextStyle.MONEY: - case TextStyle.TOOLTIP_TITLE: - styleOptions.fontSize = defaultFontSize - 24; - shadowXpos = 3.5; - shadowYpos = 3.5; - break; - case TextStyle.PARTY: - case TextStyle.PARTY_RED: - styleOptions.fontSize = defaultFontSize - 30; - styleOptions.fontFamily = "pkmnems"; - break; - case TextStyle.TOOLTIP_CONTENT: - styleOptions.fontSize = defaultFontSize - 32; - shadowXpos = 3; - shadowYpos = 3; - break; - case TextStyle.MOVE_INFO_CONTENT: - styleOptions.fontSize = defaultFontSize - 40; - shadowXpos = 3; - shadowYpos = 3; - break; - case TextStyle.SMALLER_WINDOW_ALT: - styleOptions.fontSize = defaultFontSize - 36; - shadowXpos = 3; - shadowYpos = 3; - break; - case TextStyle.BGM_BAR: - styleOptions.fontSize = defaultFontSize - 24; - shadowXpos = 3; - shadowYpos = 3; - break; } const shadowColor = getTextColor(style, true, uiTheme); @@ -257,110 +257,110 @@ export function getTextWithColors(content: string, primaryStyle: TextStyle, uiTh export function getTextColor(textStyle: TextStyle, shadow?: boolean, uiTheme: UiTheme = UiTheme.DEFAULT): string { const isLegacyTheme = uiTheme === UiTheme.LEGACY; switch (textStyle) { - case TextStyle.MESSAGE: - return !shadow ? "#f8f8f8" : "#6b5a73"; - case TextStyle.WINDOW: - case TextStyle.MOVE_INFO_CONTENT: - case TextStyle.MOVE_PP_FULL: - case TextStyle.TOOLTIP_CONTENT: - case TextStyle.SETTINGS_VALUE: - if (isLegacyTheme) { + case TextStyle.MESSAGE: + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.WINDOW: + case TextStyle.MOVE_INFO_CONTENT: + case TextStyle.MOVE_PP_FULL: + case TextStyle.TOOLTIP_CONTENT: + case TextStyle.SETTINGS_VALUE: + if (isLegacyTheme) { + return !shadow ? "#484848" : "#d0d0c8"; + } + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.MOVE_PP_HALF_FULL: + if (isLegacyTheme) { + return !shadow ? "#a68e17" : "#ebd773"; + } + return !shadow ? "#ccbe00" : "#6e672c"; + case TextStyle.MOVE_PP_NEAR_EMPTY: + if (isLegacyTheme) { + return !shadow ? "#d64b00" : "#f7b18b"; + } + return !shadow ? "#d64b00" : "#69402a"; + case TextStyle.MOVE_PP_EMPTY: + if (isLegacyTheme) { + return !shadow ? "#e13d3d" : "#fca2a2"; + } + return !shadow ? "#e13d3d" : "#632929"; + case TextStyle.WINDOW_ALT: return !shadow ? "#484848" : "#d0d0c8"; - } - return !shadow ? "#f8f8f8" : "#6b5a73"; - case TextStyle.MOVE_PP_HALF_FULL: - if (isLegacyTheme) { - return !shadow ? "#a68e17" : "#ebd773"; - } - return !shadow ? "#ccbe00" : "#6e672c"; - case TextStyle.MOVE_PP_NEAR_EMPTY: - if (isLegacyTheme) { - return !shadow ? "#d64b00" : "#f7b18b"; - } - return !shadow ? "#d64b00" : "#69402a"; - case TextStyle.MOVE_PP_EMPTY: - if (isLegacyTheme) { - return !shadow ? "#e13d3d" : "#fca2a2"; - } - return !shadow ? "#e13d3d" : "#632929"; - case TextStyle.WINDOW_ALT: - return !shadow ? "#484848" : "#d0d0c8"; - case TextStyle.BATTLE_INFO: - if (isLegacyTheme) { - return !shadow ? "#404040" : "#ded6b5"; - } - return !shadow ? "#f8f8f8" : "#6b5a73"; - case TextStyle.PARTY: - return !shadow ? "#f8f8f8" : "#707070"; - case TextStyle.PARTY_RED: - return !shadow ? "#f89890" : "#984038"; - case TextStyle.SUMMARY: - return !shadow ? "#f8f8f8" : "#636363"; - case TextStyle.SUMMARY_ALT: - if (isLegacyTheme) { + case TextStyle.BATTLE_INFO: + if (isLegacyTheme) { + return !shadow ? "#404040" : "#ded6b5"; + } + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.PARTY: + return !shadow ? "#f8f8f8" : "#707070"; + case TextStyle.PARTY_RED: + return !shadow ? "#f89890" : "#984038"; + case TextStyle.SUMMARY: return !shadow ? "#f8f8f8" : "#636363"; - } - return !shadow ? "#484848" : "#d0d0c8"; - case TextStyle.SUMMARY_RED: - case TextStyle.TOOLTIP_TITLE: - return !shadow ? "#e70808" : "#ffbd73"; - case TextStyle.SUMMARY_BLUE: - return !shadow ? "#40c8f8" : "#006090"; - case TextStyle.SUMMARY_PINK: - return !shadow ? "#f89890" : "#984038"; - case TextStyle.SUMMARY_GOLD: - case TextStyle.MONEY: - return !shadow ? "#e8e8a8" : "#a0a060"; - case TextStyle.SETTINGS_LOCKED: - case TextStyle.SUMMARY_GRAY: - return !shadow ? "#a0a0a0" : "#636363"; - case TextStyle.STATS_LABEL: - return !shadow ? "#f8b050" : "#c07800"; - case TextStyle.STATS_VALUE: - if (isLegacyTheme) { + case TextStyle.SUMMARY_ALT: + if (isLegacyTheme) { + return !shadow ? "#f8f8f8" : "#636363"; + } return !shadow ? "#484848" : "#d0d0c8"; - } - return !shadow ? "#f8f8f8" : "#6b5a73"; - case TextStyle.SUMMARY_GREEN: - return !shadow ? "#78c850" : "#306850"; - case TextStyle.SETTINGS_LABEL: - case TextStyle.PERFECT_IV: - return !shadow ? "#f8b050" : "#c07800"; - case TextStyle.SETTINGS_SELECTED: - return !shadow ? "#f88880" : "#f83018"; - case TextStyle.SMALLER_WINDOW_ALT: - return !shadow ? "#484848" : "#d0d0c8"; - case TextStyle.BGM_BAR: - return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.SUMMARY_RED: + case TextStyle.TOOLTIP_TITLE: + return !shadow ? "#e70808" : "#ffbd73"; + case TextStyle.SUMMARY_BLUE: + return !shadow ? "#40c8f8" : "#006090"; + case TextStyle.SUMMARY_PINK: + return !shadow ? "#f89890" : "#984038"; + case TextStyle.SUMMARY_GOLD: + case TextStyle.MONEY: + return !shadow ? "#e8e8a8" : "#a0a060"; + case TextStyle.SETTINGS_LOCKED: + case TextStyle.SUMMARY_GRAY: + return !shadow ? "#a0a0a0" : "#636363"; + case TextStyle.STATS_LABEL: + return !shadow ? "#f8b050" : "#c07800"; + case TextStyle.STATS_VALUE: + if (isLegacyTheme) { + return !shadow ? "#484848" : "#d0d0c8"; + } + return !shadow ? "#f8f8f8" : "#6b5a73"; + case TextStyle.SUMMARY_GREEN: + return !shadow ? "#78c850" : "#306850"; + case TextStyle.SETTINGS_LABEL: + case TextStyle.PERFECT_IV: + return !shadow ? "#f8b050" : "#c07800"; + case TextStyle.SETTINGS_SELECTED: + return !shadow ? "#f88880" : "#f83018"; + case TextStyle.SMALLER_WINDOW_ALT: + return !shadow ? "#484848" : "#d0d0c8"; + case TextStyle.BGM_BAR: + return !shadow ? "#f8f8f8" : "#6b5a73"; } } export function getModifierTierTextTint(tier: ModifierTier): integer { switch (tier) { - case ModifierTier.COMMON: - return 0xf8f8f8; - case ModifierTier.GREAT: - return 0x4998f8; - case ModifierTier.ULTRA: - return 0xf8d038; - case ModifierTier.ROGUE: - return 0xdb4343; - case ModifierTier.MASTER: - return 0xe331c5; - case ModifierTier.LUXURY: - return 0xe74c18; + case ModifierTier.COMMON: + return 0xf8f8f8; + case ModifierTier.GREAT: + return 0x4998f8; + case ModifierTier.ULTRA: + return 0xf8d038; + case ModifierTier.ROGUE: + return 0xdb4343; + case ModifierTier.MASTER: + return 0xe331c5; + case ModifierTier.LUXURY: + return 0xe74c18; } } export function getEggTierTextTint(tier: EggTier): integer { switch (tier) { - case EggTier.COMMON: - return getModifierTierTextTint(ModifierTier.COMMON); - case EggTier.RARE: - return getModifierTierTextTint(ModifierTier.GREAT); - case EggTier.EPIC: - return getModifierTierTextTint(ModifierTier.ULTRA); - case EggTier.LEGENDARY: - return getModifierTierTextTint(ModifierTier.MASTER); + case EggTier.COMMON: + return getModifierTierTextTint(ModifierTier.COMMON); + case EggTier.RARE: + return getModifierTierTextTint(ModifierTier.GREAT); + case EggTier.EPIC: + return getModifierTierTextTint(ModifierTier.ULTRA); + case EggTier.LEGENDARY: + return getModifierTierTextTint(ModifierTier.MASTER); } } diff --git a/src/ui/title-ui-handler.ts b/src/ui/title-ui-handler.ts index f7972af2cc2..3bfba71ef08 100644 --- a/src/ui/title-ui-handler.ts +++ b/src/ui/title-ui-handler.ts @@ -103,6 +103,7 @@ export default class TitleUiHandler extends OptionSelectUiHandler { const ui = this.getUi(); if (this.scene.eventManager.isEventActive()) { + this.eventDisplay.setWidth(this.scene.scaledCanvas.width - this.optionSelectBg.width - this.optionSelectBg.x); this.eventDisplay.show(); } diff --git a/src/ui/ui-theme.ts b/src/ui/ui-theme.ts index 8ff50667248..89c56384bd0 100644 --- a/src/ui/ui-theme.ts +++ b/src/ui/ui-theme.ts @@ -10,12 +10,12 @@ export enum WindowVariant { export function getWindowVariantSuffix(windowVariant: WindowVariant): string { switch (windowVariant) { - case WindowVariant.THIN: - return "_thin"; - case WindowVariant.XTHIN: - return "_xthin"; - default: - return ""; + case WindowVariant.THIN: + return "_thin"; + case WindowVariant.XTHIN: + return "_xthin"; + default: + return ""; } } diff --git a/src/utils.ts b/src/utils.ts index e9dc8267809..4c0f0a379c8 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -194,23 +194,23 @@ export function formatLargeNumber(count: integer, threshold: integer): string { const ret = count.toString(); let suffix = ""; switch (Math.ceil(ret.length / 3) - 1) { - case 1: - suffix = "K"; - break; - case 2: - suffix = "M"; - break; - case 3: - suffix = "B"; - break; - case 4: - suffix = "T"; - break; - case 5: - suffix = "q"; - break; - default: - return "?"; + case 1: + suffix = "K"; + break; + case 2: + suffix = "M"; + break; + case 3: + suffix = "B"; + break; + case 4: + suffix = "T"; + break; + case 5: + suffix = "q"; + break; + default: + return "?"; } const digits = ((ret.length + 2) % 3) + 1; let decimalNumber = ret.slice(digits, digits + 2); @@ -487,19 +487,19 @@ export function verifyLang(lang?: string): boolean { } switch (lang) { - case "es": - case "fr": - case "de": - case "he": - case "it": - case "zh-CN": - case "zh-TW": - case "pt-BR": - case "ko": - case "ja": - return true; - default: - return false; + case "es-ES": + case "fr": + case "de": + case "he": + case "it": + case "zh-CN": + case "zh-TW": + case "pt-BR": + case "ko": + case "ja": + return true; + default: + return false; } }