diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 3e6b8bf6d0d..a30cb642a46 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -30,7 +30,7 @@
- [ ] The PR is self-contained and cannot be split into smaller PRs?
- [ ] Have I provided a clear explanation of the changes?
- [ ] Have I considered writing automated tests for the issue?
-- [ ] If I have text, did I add make it translatable and added a key in the English language?
+- [ ] If I have text, did I make it translatable and add a key in the English locale file(s)?
- [ ] Have I tested the changes (manually)?
- [ ] Are all unit tests still passing? (`npm run test`)
- [ ] Are the changes visual?
diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml
index 9068f1ae9a2..2850418bc59 100644
--- a/.github/workflows/eslint.yml
+++ b/.github/workflows/eslint.yml
@@ -11,6 +11,8 @@ on:
branches:
- main # Trigger on pull request events targeting the main branch
- beta # Trigger on pull request events targeting the beta branch
+ merge_group:
+ types: [checks_requested]
jobs:
run-linters: # Define a job named "run-linters"
diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml
index 3b7617c45f4..a092ccb425a 100644
--- a/.github/workflows/github-pages.yml
+++ b/.github/workflows/github-pages.yml
@@ -8,6 +8,8 @@ on:
branches:
- main
- beta
+ merge_group:
+ types: [checks_requested]
jobs:
pages:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 9ce1d1c5038..adac45519ab 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -11,6 +11,8 @@ on:
branches:
- main # Trigger on pull request events targeting the main branch
- beta # Trigger on pull request events targeting the beta branch
+ merge_group:
+ types: [checks_requested]
jobs:
run-tests: # Define a job named "run-tests"
diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js
new file mode 100644
index 00000000000..bf68258f321
--- /dev/null
+++ b/create-test-boilerplate.js
@@ -0,0 +1,101 @@
+import fs from 'fs';
+import path from 'path';
+import { fileURLToPath } from 'url';
+
+/**
+ * This script creates a test boilerplate file for a move or ability.
+ * @param {string} type - The type of test to create. Either "move" or "ability".
+ * @param {string} fileName - The name of the file to create.
+ * @example npm run create-test move tackle
+ */
+
+// Get the directory name of the current module file
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+
+// Get the arguments from the command line
+const args = process.argv.slice(2);
+const type = args[0]; // "move" or "ability"
+let fileName = args[1]; // The file name
+
+if (!type || !fileName) {
+ console.error('Please provide both a type ("move" or "ability") and a file name.');
+ process.exit(1);
+}
+
+// Convert fileName from to snake_case if camelCase is given
+fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();
+
+// Format the description for the test case
+const formattedName = fileName
+ .replace(/_/g, ' ')
+ .replace(/\b\w/g, char => char.toUpperCase());
+
+// Determine the directory based on the type
+let dir;
+let description;
+if (type === 'move') {
+ dir = path.join(__dirname, 'src', 'test', 'moves');
+ description = `Moves - ${formattedName}`;
+} else if (type === 'ability') {
+ dir = path.join(__dirname, 'src', 'test', 'abilities');
+ description = `Abilities - ${formattedName}`;
+} else {
+ console.error('Invalid type. Please use "move" or "ability".');
+ process.exit(1);
+}
+
+// Ensure the directory exists
+if (!fs.existsSync(dir)) {
+ fs.mkdirSync(dir, { recursive: true });
+}
+
+// Create the file with the given name
+const filePath = path.join(dir, `${fileName}.test.ts`);
+
+if (fs.existsSync(filePath)) {
+ console.error(`File "${fileName}.test.ts" already exists.`);
+ process.exit(1);
+}
+
+// Define the content template
+const content = `import { Abilities } from "#enums/abilities";
+import GameManager from "#test/utils/gameManager";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, it } from "vitest";
+
+describe("${description}", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(SPLASH_ONLY);
+ });
+
+ it("test case", async () => {
+ // await game.classicMode.startBattle();
+ // game.move.select();
+ }, TIMEOUT);
+});
+`;
+
+// Write the template content to the file
+fs.writeFileSync(filePath, content, 'utf8');
+
+console.log(`File created at: ${filePath}`);
\ No newline at end of file
diff --git a/docs/enemy-ai.md b/docs/enemy-ai.md
index f53a8511893..46482f56a90 100644
--- a/docs/enemy-ai.md
+++ b/docs/enemy-ai.md
@@ -191,15 +191,15 @@ Now that the enemy Pokémon with the best matchup score is on the field (assumin
We then need to apply a 2x multiplier for the move's type effectiveness and a 1.5x multiplier since STAB applies. After applying these multipliers, the final score for this move is **75**.
-- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
+- **Swords Dance**: As a non-attacking move, this move's benefit score is derived entirely from the sum of its attributes' benefit scores. Swords Dance's `StatStageChangeAttr` has a user benefit score of 0 and a target benefit score that, in this case, simplifies to
$\text{TBS}=4\times \text{levels} + (-2\times \text{sign(levels)})$
where `levels` is the number of stat stages added by the attribute (in this case, +2). The final score for this move is **6** (Note: because this move is self-targeted, we don't flip the sign of TBS when computing the target score).
-- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
+- **Crush Claw**: This move is a 75-power Normal-type physical attack with a 50 percent chance to lower the target's Defense by one stage. The additional effect is implemented by the same `StatStageChangeAttr` as Swords Dance, so we can use the same formulas from before to compute the total TBS and base target score.
- $\text{TBS}=\text{getTargetBenefitScore(StatChangeAttr)}-\text{attackScore}$
+ $\text{TBS}=\text{getTargetBenefitScore(StatStageChangeAttr)}-\text{attackScore}$
$\text{TBS}=(-4 + 2)-(-2\times 2 + \lfloor \frac{75}{5} \rfloor)=-2-11=-13$
@@ -221,4 +221,4 @@ When implementing a new move attribute, it's important to override `MoveAttr`'s
- A move's **user benefit score (UBS)** incentivizes (or discourages) the move's usage in general. A positive UBS gives the move more incentive to be used, while a negative UBS gives the move less incentive.
- A move's **target benefit score (TBS)** incentivizes (or discourages) the move's usage on a specific target. A positive TBS indicates the move is better used on the user or its allies, while a negative TBS indicates the move is better used on enemies.
- **The total benefit score (UBS + TBS) of a move should never be 0.** The move selection algorithm assumes the move's benefit score is unimplemented if the total score is 0 and penalizes the move's usage as a result. With status moves especially, it's important to have some form of implementation among the move's attributes to avoid this scenario.
-- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
\ No newline at end of file
+- **Score functions that use formulas should include comments.** If your attribute requires complex logic or formulas to calculate benefit scores, please add comments to explain how the logic works and its intended effect on the enemy's decision making.
diff --git a/index.css b/index.css
index 8034c1a4b38..1274f2fcead 100644
--- a/index.css
+++ b/index.css
@@ -23,15 +23,6 @@ body {
}
}
-#links {
- width: 90%;
- text-align: center;
- position: fixed;
- bottom: 0;
- display: flex;
- justify-content: space-around;
-}
-
#app {
display: flex;
justify-content: center;
@@ -93,7 +84,7 @@ input:-internal-autofill-selected {
@media (orientation: landscape) {
#touchControls {
- --controls-size: 20vh;
+ --controls-size: 20vh;
--text-shadow-size: 1.3vh;
--small-button-offset: 4vh;
}
@@ -148,10 +139,10 @@ input:-internal-autofill-selected {
/* Show cycle buttons only on STARTER_SELECT and on touch configuration panel */
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadOpenFilters,
-#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleForm,
-#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleShiny,
+#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleForm,
+#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleShiny,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleNature,
-#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleAbility,
+#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT'], [data-ui-mode='RUN_INFO']) #apadCycleAbility,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleGender,
#touchControls:not(.config-mode):not([data-ui-mode='STARTER_SELECT']) #apadCycleVariant {
display: none;
diff --git a/index.html b/index.html
index 29b4c0d1a6e..390a29fb365 100644
--- a/index.html
+++ b/index.html
@@ -39,7 +39,6 @@
-
diff --git a/package.json b/package.json
index b85ac639a1b..83e82585d1e 100644
--- a/package.json
+++ b/package.json
@@ -18,7 +18,8 @@
"eslint-ci": "eslint .",
"docs": "typedoc",
"depcruise": "depcruise src",
- "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg"
+ "depcruise:graph": "depcruise src --output-type dot | node dependency-graph.js > dependency-graph.svg",
+ "create-test": "node ./create-test-boilerplate.js"
},
"devDependencies": {
"@eslint/js": "^9.3.0",
diff --git a/public/battle-anims/baddy-bad.json b/public/battle-anims/baddy-bad.json
new file mode 100644
index 00000000000..0cf840ff8b9
--- /dev/null
+++ b/public/battle-anims/baddy-bad.json
@@ -0,0 +1,2186 @@
+{
+ "id": 822,
+ "graphic": "GEN8- Fiery",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -18.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -18.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -18.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 181,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 3,
+ "y": -19,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 15,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 17,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 17,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 18,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 23,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 25,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 26,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 27,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 129,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 129.5,
+ "y": -65.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 31,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 32,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 33,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 34,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 35,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 36,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 37,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 38,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 39,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "GEN8- Fiery_bg",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Dark Pulse1.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "21": [
+ {
+ "frameIndex": 21,
+ "resourceName": "PRSFX- Fire Pledge.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "35": [
+ {
+ "frameIndex": 35,
+ "resourceName": "PRSFX- Fire Pledge.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/blazing-torque.json b/public/battle-anims/blazing-torque.json
new file mode 100644
index 00000000000..354aa5f1a8c
--- /dev/null
+++ b/public/battle-anims/blazing-torque.json
@@ -0,0 +1,2109 @@
+{
+ "id": 394,
+ "graphic": "PRAS- Fire",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 28,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 108,
+ "zoomY": 108,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 56,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 117,
+ "zoomY": 117,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 85,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 126,
+ "zoomY": 126,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -20,
+ "y": -6.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 113,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -48,
+ "y": 2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -8,
+ "y": 24,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -16,
+ "y": 4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 141,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -64,
+ "y": 14,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -20,
+ "y": 38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -32,
+ "y": 11,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 8,
+ "y": 8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -16,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 170,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -84,
+ "y": 19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -28,
+ "y": 54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 142,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -48,
+ "y": 23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 4,
+ "y": 27,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -44,
+ "y": -9,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -12,
+ "y": 2.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 19,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 198,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -64,
+ "y": 29.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 135,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 39,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -68,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -32,
+ "y": 10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 20,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 226,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -16,
+ "y": 53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -84,
+ "y": 2.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 135,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -48,
+ "y": 22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 21,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -64,
+ "y": 27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 22,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 24.5,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24.5,
+ "y": -12,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 49.5,
+ "y": -24,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 49.5,
+ "y": -24,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 74,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 74,
+ "y": -36,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 99,
+ "y": -48,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -48,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 124,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -60,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 124,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 51,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -60,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 130,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 112,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 102,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -65.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -50,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -58.5,
+ "zoomX": 135,
+ "zoomY": 135,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 100,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 153,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -69.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 51,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144.5,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 51,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 121,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 51,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -55,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -61.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 88,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 204,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 102,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 157,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 102,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 126,
+ "y": -86.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 102,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -71.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 156,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 76,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 164,
+ "y": -83,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 153,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 169.5,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 153,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 131,
+ "y": -97,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 153,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 164,
+ "y": -67.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 172,
+ "y": -34.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 60,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 160,
+ "y": -48,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 176,
+ "y": -89.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 205,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 182,
+ "y": -47,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 205,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136.5,
+ "y": -107.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 205,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 176,
+ "y": -73.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -94,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 184,
+ "y": -31,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 48,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 188,
+ "y": -96.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 256,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 194.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 256,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 141.5,
+ "y": -118,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 256,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 188,
+ "y": -83,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -103.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 196,
+ "y": -29.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 28,
+ "y": -48,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 200,
+ "y": -103,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 307,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 207,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 307,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 146.5,
+ "y": -128.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 307,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 200,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -113,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 208,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 160,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 16,
+ "y": -40,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 212,
+ "y": -109.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 75,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 220,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -138.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 66,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 212,
+ "y": -94,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 78,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -122.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 78,
+ "priority": 3,
+ "focus": 3
+ },
+ {
+ "x": 220,
+ "y": -30,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 24,
+ "opacity": 78,
+ "priority": 3,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 8,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 191,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 191,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 127,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 127,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 63,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 63,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Flare Blitz1.wav",
+ "volume": 100,
+ "pitch": 75,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "9": [
+ {
+ "frameIndex": 9,
+ "resourceName": "PRAS- Outrage BG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 9,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 5,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "13": [
+ {
+ "frameIndex": 13,
+ "resourceName": "PRSFX- Flare Blitz3.wav",
+ "volume": 100,
+ "pitch": 80,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "14": [
+ {
+ "frameIndex": 14,
+ "resourceName": "PRSFX- Flare Blitz2.wav",
+ "volume": 100,
+ "pitch": 80,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "16": [
+ {
+ "frameIndex": 16,
+ "resourceName": "PRSFX- Flare Blitz3.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "19": [
+ {
+ "frameIndex": 19,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 19,
+ "resourceName": "PRSFX- Flare Blitz3.wav",
+ "volume": 100,
+ "pitch": 120,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/bouncy-bubble.json b/public/battle-anims/bouncy-bubble.json
new file mode 100644
index 00000000000..b1d931b62fa
--- /dev/null
+++ b/public/battle-anims/bouncy-bubble.json
@@ -0,0 +1,3322 @@
+{
+ "id": 61,
+ "graphic": "PRAS- Water",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 44.5,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 65.5,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 44,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 86,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 107,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 84,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68.5,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 41.5,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 104,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 91,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 59,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 45.5,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 22,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 113.5,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 76.5,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 67,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46.5,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 44.5,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 26,
+ "y": -10,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 88.5,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 70,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 65.5,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 42,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 110,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 93.5,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 126,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 86,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 60.5,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 47,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116.5,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 79,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 70,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 43.5,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 26,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 122,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 97.5,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 93.5,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 63.5,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 44.5,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116.5,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 83,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 65.5,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 44,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 44.5,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 103,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 122,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 65.5,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 26,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 123,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 84,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 126,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 86,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68.5,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 48,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 22,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 123,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 104,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 107,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 91,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 72,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 123,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 123,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 96,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68.5,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 44.5,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 113.5,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 24,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 91,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 65.5,
+ "y": -26,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 41.5,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 130,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 40.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 113.5,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86,
+ "y": -34.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 59,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 129,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 57.5,
+ "y": -32,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 42,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 76.5,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 127,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 74,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 60.5,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 44.5,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 26,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 125,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 91,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 79,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 65.5,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 123,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 108,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68.5,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 47,
+ "y": -19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 97.5,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 123,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 91,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 70,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 45.5,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 125,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 108,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 113.5,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 93.5,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 67,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 127,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116.5,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 88.5,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 127,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 110,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 29,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 30,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Bubblebeam.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/buzzy-buzz.json b/public/battle-anims/buzzy-buzz.json
new file mode 100644
index 00000000000..b1cd7daa82d
--- /dev/null
+++ b/public/battle-anims/buzzy-buzz.json
@@ -0,0 +1,1419 @@
+{
+ "id": 570,
+ "graphic": "PRAS- Electric",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 105,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 110,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 53,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 105,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12,
+ "y": -25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 53,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 43,
+ "y": -7.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 48,
+ "y": 8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 19,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 44,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 37,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 54,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 53,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 59.5,
+ "y": 2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 26.5,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 44,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 54,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 63.5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 71,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 34,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 43,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 54.5,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 55,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 74,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 83,
+ "y": -10,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 41.5,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 43,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 63.5,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 55,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 84.5,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94.5,
+ "y": -16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 49,
+ "y": -67.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 42,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 72.5,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 56,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 95,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 106.5,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 56,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 42,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 81,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 56,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 105.5,
+ "y": -49.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 118,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 63.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 41,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 90,
+ "y": -75,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 53,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 116,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 130,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 71,
+ "y": -92.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 41,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -83,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 53,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 126.5,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 141.5,
+ "y": -40,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 78.5,
+ "y": -100.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 40,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107.5,
+ "y": -90.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 54,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 137,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 153.5,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 86,
+ "y": -109,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 40,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116.5,
+ "y": -98.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 54,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 147.5,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 165,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 93.5,
+ "y": -117,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 40,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 125.5,
+ "y": -106,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 55,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 158,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 177,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 55,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 56,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 56,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 57,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 57,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "3": [
+ {
+ "frameIndex": 3,
+ "resourceName": "PRSFX- Electro Ball2.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/combat-torque.json b/public/battle-anims/combat-torque.json
new file mode 100644
index 00000000000..8390263edaa
--- /dev/null
+++ b/public/battle-anims/combat-torque.json
@@ -0,0 +1,3667 @@
+[
+ {
+ "id": 794,
+ "graphic": "PRAS- Me First",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ 64,
+ 64,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 350,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 96,
+ 96,
+ 96,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -8,
+ "y": 8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 128,
+ 128,
+ 128,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -12,
+ "y": 12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 330,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 160,
+ 160,
+ 160,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -16,
+ "y": 16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 320,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 192,
+ 192,
+ 192,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 224,
+ 224,
+ 224,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -20,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 78.5,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 160,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 180,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 152,
+ "y": -83.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 176,
+ "y": -103,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 200,
+ "y": -122.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 170,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 310,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 224,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 86,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 102,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 320,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 224,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 76.5,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 330,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 224.5,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 51,
+ "y": -26,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 224.5,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 25.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 350,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 224.5,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 224.5,
+ "y": -141.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 224,
+ 224,
+ 224,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 192,
+ 192,
+ 192,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 160,
+ 160,
+ 160,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 128,
+ 128,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 96,
+ 96,
+ 96,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ 64,
+ 64,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 109,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 32,
+ 32,
+ 32,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 145,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 182,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 218,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "GEN8- Meteor Assault BG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 8,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Giga Impact2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "PRSFX- Giga Impact1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "24": [
+ {
+ "frameIndex": 24,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 3,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 215
+ },
+ {
+ "id": 794,
+ "graphic": "PRAS- Me First",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 1,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ 64,
+ 64,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 10,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 96,
+ 96,
+ 96,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 20,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 128,
+ 128,
+ 128,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 160,
+ 160,
+ 160,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 144,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 192,
+ 192,
+ 192,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 224,
+ 224,
+ 224,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 20,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "locked": true,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 80,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 140,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 160,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 52,
+ "y": -32,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 160,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 180,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -24,
+ "y": 12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -48,
+ "y": 32,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -72,
+ "y": 52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 170,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 85,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 50,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 28,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 52,
+ "y": -24,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 30,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 76,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 20,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 104,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 10,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 224,
+ 224,
+ 224,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -96,
+ "y": 72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 192,
+ 192,
+ 192,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 160,
+ 160,
+ 160,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 128,
+ 128,
+ 128,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 96,
+ 96,
+ 96,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 109,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ 64,
+ 64,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 146,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 32,
+ 32,
+ 32,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 182,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 218,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "GEN8- Meteor Assault BG Opp",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 8,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Giga Impact2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "PRSFX- Giga Impact1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "24": [
+ {
+ "frameIndex": 24,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 3,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/floaty-fall.json b/public/battle-anims/floaty-fall.json
new file mode 100644
index 00000000000..814ddda1bd9
--- /dev/null
+++ b/public/battle-anims/floaty-fall.json
@@ -0,0 +1,1665 @@
+[
+ {
+ "id": 560,
+ "graphic": "PRAS- Strike",
+ "frames": [
+ [
+ {
+ "x": 4,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 12,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 24,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -156,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 40,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -200,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -200,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -128,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 102,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 52,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 127.5,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 76.5,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -57,
+ "zoomX": 100,
+ "zoomY": 64,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 51,
+ "y": -26,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -59.5,
+ "zoomX": 100,
+ "zoomY": 76,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 25.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -62,
+ "zoomX": 100,
+ "zoomY": 88,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Flying Press2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "16": [
+ {
+ "frameIndex": 16,
+ "resourceName": "PRSFX- Flying Press3.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "17": [
+ {
+ "frameIndex": 17,
+ "resourceName": "PRSFX- Flying Press1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ },
+ {
+ "id": 560,
+ "graphic": "PRAS- Strike",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 116,
+ "y": -104,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 104,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 77,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -144,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 70,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -94,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 40,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 3,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 145,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 85,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 32,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 64,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 95,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 96,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Flying Press2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "16": [
+ {
+ "frameIndex": 16,
+ "resourceName": "PRSFX- Flying Press3.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "17": [
+ {
+ "frameIndex": 17,
+ "resourceName": "PRSFX- Flying Press1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/freezy-frost.json b/public/battle-anims/freezy-frost.json
new file mode 100644
index 00000000000..191706696c5
--- /dev/null
+++ b/public/battle-anims/freezy-frost.json
@@ -0,0 +1,3755 @@
+{
+ "id": 329,
+ "graphic": "PRAS- Sheer Cold",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 95.5,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 10,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 30,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 20,
+ 60
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 30,
+ 90
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 40,
+ 120
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 50,
+ 150
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 60,
+ 180
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 240
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 50,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 168,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 176,
+ "y": -28.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 20,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 70,
+ 210
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 210,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 60,
+ 180
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 50,
+ 150
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 40,
+ 120
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 30,
+ 90
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 20,
+ 60
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 0,
+ 10,
+ 30
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 30,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Sheer Cold BG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 8,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "4": [
+ {
+ "frameIndex": 4,
+ "resourceName": "PRSFX- Sheer Cold.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "29": [
+ {
+ "frameIndex": 29,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 8,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/glitzy-glow.json b/public/battle-anims/glitzy-glow.json
new file mode 100644
index 00000000000..87ea70debe7
--- /dev/null
+++ b/public/battle-anims/glitzy-glow.json
@@ -0,0 +1,7757 @@
+[
+ {
+ "id": 354,
+ "graphic": "PRAS- Psycho Boost",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 80,
+ "tone": [
+ 0,
+ -113,
+ -30,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 120,
+ "tone": [
+ 0,
+ -120,
+ -8,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -128,
+ 15,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -135,
+ 37,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -143,
+ 60,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -150,
+ 82,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -157,
+ 105,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -4,
+ -164,
+ 111,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -7,
+ -170,
+ 118,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -10,
+ -176,
+ 124,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -13,
+ -182,
+ 131,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -16,
+ -189,
+ 137,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -19,
+ -195,
+ 144,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -22,
+ -201,
+ 150,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -25,
+ -207,
+ 157,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -29,
+ -213,
+ 163,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -32,
+ -219,
+ 169,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -35,
+ -225,
+ 175,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -38,
+ -231,
+ 182,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -41,
+ -237,
+ 188,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -44,
+ -243,
+ 194,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -47,
+ -249,
+ 200,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -16.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 33.5,
+ "y": -22.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 47,
+ "y": -28.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -34.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 74,
+ "y": -40.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 87.5,
+ "y": -46.5,
+ "zoomX": 170,
+ "zoomY": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 101,
+ "y": -52.5,
+ "zoomX": 170,
+ "zoomY": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 114.5,
+ "y": -58.5,
+ "zoomX": 170,
+ "zoomY": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 170,
+ "zoomY": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -15,
+ -10,
+ -15,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 127,
+ "tone": [
+ -45,
+ -230,
+ 186,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 50,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -30,
+ -19,
+ -30,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 63,
+ "tone": [
+ -40,
+ -204,
+ 165,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 60,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -45,
+ -28,
+ -45,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -60,
+ -38,
+ -60,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -75,
+ -47,
+ -75,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 180,
+ "zoomY": 180,
+ "angle": 240,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -90,
+ -56,
+ -90,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "tone": [
+ -20,
+ -102,
+ 82,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 160,
+ "zoomY": 160,
+ "angle": 300,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -105,
+ -66,
+ -105,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -15,
+ -77,
+ 62,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -75,
+ -120,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -82.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "tone": [
+ -10,
+ -51,
+ 41,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 60,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -135,
+ -84,
+ -135,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -138,
+ -95,
+ -132,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 145,
+ "y": -51,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 80,
+ "zoomY": 80,
+ "angle": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -140,
+ -106,
+ -128,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 240,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -142,
+ -117,
+ -125,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 40,
+ "zoomY": 40,
+ "angle": 300,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98.5,
+ "y": -45.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -144,
+ -127,
+ -121,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 20,
+ "zoomY": 20,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 50,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -146,
+ -138,
+ -118,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 145.5,
+ "y": -87,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -148,
+ -149,
+ -114,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -159,
+ -110,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 111,
+ "y": -81,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -165,
+ -116,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -171,
+ -122,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -177,
+ -128,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -183,
+ -133,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148.5,
+ "y": -44.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -189,
+ -139,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -195,
+ -145,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99,
+ "y": -38.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -200,
+ -150,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 136,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -135,
+ -180,
+ -135,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132.5,
+ "y": -92,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -160,
+ -120,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -105,
+ -140,
+ -105,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -90,
+ -120,
+ -90,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -75,
+ -100,
+ -75,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -60,
+ -80,
+ -60,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -45,
+ -60,
+ -45,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -30,
+ -40,
+ -30,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -15,
+ -20,
+ -15,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Psycho Boost BG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 10,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Psycho Boost1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "32": [
+ {
+ "frameIndex": 32,
+ "resourceName": "PRSFX- Psycho Boost2.wav",
+ "volume": 100,
+ "pitch": 110,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "62": [
+ {
+ "frameIndex": 62,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+ },
+ {
+ "id": 354,
+ "graphic": "PRAS- Psycho Boost",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 80,
+ "tone": [
+ 0,
+ -113,
+ -30,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 120,
+ "tone": [
+ 0,
+ -120,
+ -8,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -128,
+ 15,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -135,
+ 37,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -143,
+ 60,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -150,
+ 82,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ 0,
+ -157,
+ 105,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -4,
+ -164,
+ 111,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -7,
+ -170,
+ 118,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -10,
+ -176,
+ 124,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -13,
+ -182,
+ 131,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -16,
+ -189,
+ 137,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 130,
+ "zoomY": 130,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -19,
+ -195,
+ 144,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -22,
+ -201,
+ 150,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -25,
+ -207,
+ 157,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -29,
+ -213,
+ 163,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -32,
+ -219,
+ 169,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -35,
+ -225,
+ 175,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -38,
+ -231,
+ 182,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -41,
+ -237,
+ 188,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -44,
+ -243,
+ 194,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -48.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -47,
+ -249,
+ 200,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -43.5,
+ "zoomX": 152,
+ "zoomY": 152,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -38,
+ "zoomX": 154,
+ "zoomY": 154,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 72,
+ "y": -32.5,
+ "zoomX": 156,
+ "zoomY": 156,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60,
+ "y": -27,
+ "zoomX": 158,
+ "zoomY": 158,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 48,
+ "y": -22,
+ "zoomX": 161,
+ "zoomY": 161,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36,
+ "y": -16.5,
+ "zoomX": 163,
+ "zoomY": 163,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 24,
+ "y": -11,
+ "zoomX": 165,
+ "zoomY": 165,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12,
+ "y": -5.5,
+ "zoomX": 167,
+ "zoomY": 167,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 200,
+ "tone": [
+ -50,
+ -255,
+ 207,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -15,
+ -10,
+ -15,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 127,
+ "tone": [
+ -45,
+ -230,
+ 186,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 50,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -30,
+ -19,
+ -30,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 63,
+ "tone": [
+ -40,
+ -205,
+ 165,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 60,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -45,
+ -28,
+ -45,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "tone": [
+ -35,
+ -179,
+ 144,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -60,
+ -38,
+ -60,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "tone": [
+ -30,
+ -154,
+ 123,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -8,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -75,
+ -47,
+ -75,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "tone": [
+ -25,
+ -128,
+ 103,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 180,
+ "zoomY": 180,
+ "angle": 240,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -8,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -90,
+ -56,
+ -90,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "tone": [
+ -20,
+ -103,
+ 82,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 160,
+ "zoomY": 160,
+ "angle": 300,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -105,
+ -66,
+ -105,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -15,
+ -77,
+ 61,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -75,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -18,
+ "y": -18.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "tone": [
+ -10,
+ -52,
+ 40,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 8,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 60,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -135,
+ -84,
+ -135,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 8,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -138,
+ -95,
+ -132,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 17,
+ "y": 13,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "tone": [
+ -5,
+ -23,
+ 17,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 80,
+ "zoomY": 80,
+ "angle": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 200,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -140,
+ -106,
+ -128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 240,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 150,
+ "tone": [
+ -4,
+ -19,
+ 14,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -142,
+ -117,
+ -125,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -8,
+ "y": 0,
+ "zoomX": 40,
+ "zoomY": 40,
+ "angle": 300,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 100,
+ "tone": [
+ -3,
+ -15,
+ 11,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29.5,
+ "y": 18.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -144,
+ -127,
+ -121,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 20,
+ "zoomY": 20,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 50,
+ "tone": [
+ -3,
+ -12,
+ 8,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -3.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -146,
+ -138,
+ -118,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 17.5,
+ "y": -23,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "tone": [
+ -2,
+ -8,
+ 5,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -3.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -148,
+ -149,
+ -114,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -1,
+ -4,
+ 2,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20,
+ "y": 19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 8,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -150,
+ -159,
+ -110,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -17,
+ "y": -17,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -149,
+ -162,
+ -114,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -147,
+ -165,
+ -117,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -145,
+ -167,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -8,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -143,
+ -170,
+ -123,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20.5,
+ "y": 19.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -141,
+ -173,
+ -126,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -139,
+ -175,
+ -129,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -29,
+ "y": 25.5,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -137,
+ -178,
+ -132,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -135,
+ -180,
+ -135,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4.5,
+ "y": -28,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 180,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -160,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 160,
+ "zoomY": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 120,
+ "tone": [
+ -5,
+ -26,
+ 20,
+ 0
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -105,
+ -140,
+ -105,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 180,
+ "zoomY": 180,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 60,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -90,
+ -120,
+ -90,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -75,
+ -100,
+ -75,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -60,
+ -80,
+ -60,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -45,
+ -60,
+ -45,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -30,
+ -40,
+ -30,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -15,
+ -20,
+ -15,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Psycho Boost Opp BG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 10,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Psycho Boost1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "32": [
+ {
+ "frameIndex": 32,
+ "resourceName": "PRSFX- Psycho Boost2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "62": [
+ {
+ "frameIndex": 62,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/ivy-cudgel.json b/public/battle-anims/ivy-cudgel.json
new file mode 100644
index 00000000000..ee46f86bebe
--- /dev/null
+++ b/public/battle-anims/ivy-cudgel.json
@@ -0,0 +1,1245 @@
+{
+ "id": 452,
+ "graphic": "PRAS- Wood Hammer",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 160,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -73,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -73,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -32,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 139,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 101.5,
+ "y": -82,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 46,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 160,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -79,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 143,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 160,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -20.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 170,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 160,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -55.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -49,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 20,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -43,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 91,
+ "y": -91,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 93,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 164,
+ "y": -84.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 197,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 114.5,
+ "y": -47.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -9,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 201,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 138.5,
+ "y": -69.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 134,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 130,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 20,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 134,
+ "y": -39,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80.5,
+ "y": -99.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 139,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 172,
+ "y": -90.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 251,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 113,
+ "y": -40,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 126.5,
+ "y": 3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 233,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 141,
+ "y": -73,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140,
+ "y": -47.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 21,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 136,
+ "y": -35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 70,
+ "y": -108.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 186,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -96,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 305,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -32.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124.5,
+ "y": 14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 264,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 146,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -55.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 126,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 22,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 138,
+ "y": -31,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60,
+ "y": -117,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 233,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 70,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 188,
+ "y": -101.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 70,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110.5,
+ "y": -25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 123,
+ "y": 26.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 296,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 146.5,
+ "y": -79.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 23,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140,
+ "y": -27,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 160,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 109,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 121,
+ "y": 38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 327,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 149,
+ "y": -83,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 158,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 122,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 24,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 142,
+ "y": -23,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 60,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 125,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 119.5,
+ "y": 50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 80,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 152,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 340,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 164,
+ "y": -31.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 225,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -62,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 45,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 25,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 140,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Wood Hammer.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/magical-torque.json b/public/battle-anims/magical-torque.json
new file mode 100644
index 00000000000..7f006e1b98d
--- /dev/null
+++ b/public/battle-anims/magical-torque.json
@@ -0,0 +1,1260 @@
+{
+ "id": 789,
+ "graphic": "PRAS- Psystrike",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 32,
+ -32,
+ 64,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 64,
+ -64,
+ 128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 150,
+ "zoomY": 150,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -85.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 157,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "Darkness2.m4a",
+ "volume": 80,
+ "pitch": 60,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "Explosion6.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/mortal-spin.json b/public/battle-anims/mortal-spin.json
new file mode 100644
index 00000000000..f795b3c5898
--- /dev/null
+++ b/public/battle-anims/mortal-spin.json
@@ -0,0 +1,3846 @@
+[
+ {
+ "id": 342,
+ "graphic": "PRAS- Poison Tail",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -69.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 139,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 188,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -58.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 121,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -49.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -61.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -65.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -64.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -85,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -74,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -89,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -78,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -92.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -73,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -82,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -96.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -100.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -78.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -90,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -104,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -74,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -94,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -104,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -98,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -104,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -87,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -102,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -111,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -84.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -89.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -106,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -92.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 100,
+ "y": -110,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -91.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -95.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -95,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -98,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -98.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -101,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -102,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -104,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -105.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -106.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -109,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -109.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -112,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -112,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "4": [
+ {
+ "frameIndex": 4,
+ "resourceName": "PRSFX- Poison Tail2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "5": [
+ {
+ "frameIndex": 5,
+ "resourceName": "PRSFX- Poison Tail2.wav",
+ "volume": 100,
+ "pitch": 70,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "10": [
+ {
+ "frameIndex": 10,
+ "resourceName": "PRSFX- Poison Tail1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ },
+ {
+ "id": 342,
+ "graphic": "PRAS- Poison Tail",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 28,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 24,
+ "y": -31,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -26,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 16,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 8,
+ "y": -11.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 6.5,
+ "y": -8.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -30.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 5,
+ "y": 21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 6.5,
+ "y": -8.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -30.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 5,
+ "y": 21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -4,
+ "y": 3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 6,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -31,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": 21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -4,
+ "y": 3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 7,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20.5,
+ "y": 6.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -31,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 5.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -4,
+ "y": 3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 8,
+ "y": -16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -21,
+ "y": 3.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -30.5,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 6.5,
+ "y": 16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 9,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -21.5,
+ "y": 0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -30,
+ "y": -25,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 7.5,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 10,
+ "y": -24,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -22,
+ "y": -2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -29.5,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 8,
+ "y": 10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 11,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -22.5,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -29.5,
+ "y": -33,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 9,
+ "y": 7.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12,
+ "y": -31.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -23,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -29,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 10,
+ "y": 5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 13,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -23.5,
+ "y": -10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -28.5,
+ "y": -40.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 10.5,
+ "y": 2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 14,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -24,
+ "y": -13.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -28,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 11.5,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 15,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -24.5,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -28,
+ "y": -48.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -3.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 16,
+ "y": -47.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25,
+ "y": -19,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27.5,
+ "y": -52.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 13,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 17,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25.5,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27,
+ "y": -56,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 14,
+ "y": -9,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 18,
+ "y": -55,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -26,
+ "y": -25,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -26.5,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 15,
+ "y": -11.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 19,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -26.5,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -26.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 15.5,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -26,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 16.5,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 21,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27.5,
+ "y": -33.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25.5,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 17.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 22.5,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27.5,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 18.5,
+ "y": -22.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 22.5,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27.5,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 149,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 18.5,
+ "y": -22.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 22.5,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -27.5,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 44,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -25,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 18.5,
+ "y": -22.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 55,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "5": [
+ {
+ "frameIndex": 5,
+ "resourceName": "PRSFX- Poison Tail2.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "6": [
+ {
+ "frameIndex": 6,
+ "resourceName": "PRSFX- Poison Tail2.wav",
+ "volume": 100,
+ "pitch": 70,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "10": [
+ {
+ "frameIndex": 10,
+ "resourceName": "PRSFX- Poison Tail1.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/noxious-torque.json b/public/battle-anims/noxious-torque.json
new file mode 100644
index 00000000000..67c060cc8b9
--- /dev/null
+++ b/public/battle-anims/noxious-torque.json
@@ -0,0 +1,1129 @@
+{
+ "id": 839,
+ "graphic": "PRAS- Poison Sting",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": -4,
+ "zoomX": 110,
+ "zoomY": 110,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -6,
+ "zoomX": 115,
+ "zoomY": 115,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -8,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -20.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -32.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -107.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -95.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -83.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -71.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 171.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 159.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 147.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 135.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 90,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -10,
+ "zoomX": 125,
+ "zoomY": 125,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96.5,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -8,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96.5,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -6,
+ "zoomX": 115,
+ "zoomY": 115,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 130,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 159.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96.5,
+ "y": -88,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -4,
+ "zoomX": 110,
+ "zoomY": 110,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 159.5,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": -2,
+ "zoomX": 105,
+ "zoomY": 105,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 126,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 159.5,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 130,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Weather Ball3.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "7": [
+ {
+ "frameIndex": 7,
+ "resourceName": "Twine.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "21": [
+ {
+ "frameIndex": 21,
+ "resourceName": "PRSFX- Toxic2.wav",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/pika-papow.json b/public/battle-anims/pika-papow.json
new file mode 100644
index 00000000000..3282acb1e81
--- /dev/null
+++ b/public/battle-anims/pika-papow.json
@@ -0,0 +1,6994 @@
+{
+ "id": 892,
+ "graphic": "PRAS- Electric",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -10,
+ -10,
+ -10,
+ 14
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 36,
+ "zoomY": 36,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 102,
+ "color": [
+ 0,
+ 0,
+ 15,
+ 12
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -19,
+ -19,
+ -19,
+ 28
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 42,
+ "zoomY": 42,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 153,
+ "color": [
+ 0,
+ 0,
+ 31,
+ 25
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 30,
+ "zoomY": 30,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -29,
+ -29,
+ -29,
+ 42
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 48,
+ "zoomY": 48,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 204,
+ "color": [
+ 0,
+ 0,
+ 47,
+ 37
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 36,
+ "zoomY": 36,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 102,
+ "color": [
+ 0,
+ 0,
+ 15,
+ 12
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -38,
+ -38,
+ -38,
+ 56
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 54,
+ "zoomY": 54,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 63,
+ 50
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 42,
+ "zoomY": 42,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 153,
+ "color": [
+ 0,
+ 0,
+ 31,
+ 25
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 30,
+ "zoomY": 30,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -48,
+ -48,
+ -48,
+ 70
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 79,
+ 62
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 48,
+ "zoomY": 48,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 204,
+ "color": [
+ 0,
+ 0,
+ 47,
+ 37
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 36,
+ "zoomY": 36,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 102,
+ "color": [
+ 0,
+ 0,
+ 15,
+ 12
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -57,
+ -57,
+ -57,
+ 85
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 66,
+ "zoomY": 66,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 95,
+ 75
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 54,
+ "zoomY": 54,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 63,
+ 50
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 42,
+ "zoomY": 42,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 153,
+ "color": [
+ 0,
+ 0,
+ 31,
+ 25
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 30,
+ "zoomY": 30,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -67,
+ -67,
+ -67,
+ 99
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 72,
+ "zoomY": 72,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 111,
+ 87
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 79,
+ 62
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 48,
+ "zoomY": 48,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 204,
+ "color": [
+ 0,
+ 0,
+ 47,
+ 37
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 36,
+ "zoomY": 36,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 102,
+ "color": [
+ 0,
+ 0,
+ 15,
+ 12
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -76,
+ -76,
+ -76,
+ 113
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 78,
+ "zoomY": 78,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 127,
+ 100
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 66,
+ "zoomY": 66,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 95,
+ 75
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 54,
+ "zoomY": 54,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 63,
+ 50
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 42,
+ "zoomY": 42,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 153,
+ "color": [
+ 0,
+ 0,
+ 31,
+ 25
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -85,
+ -85,
+ -85,
+ 127
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 84,
+ "zoomY": 84,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 143,
+ 112
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 72,
+ "zoomY": 72,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 111,
+ 87
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 79,
+ 62
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 48,
+ "zoomY": 48,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 204,
+ "color": [
+ 0,
+ 0,
+ 47,
+ 37
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -95,
+ -95,
+ -95,
+ 141
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 159,
+ 125
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 78,
+ "zoomY": 78,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 127,
+ 100
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 66,
+ "zoomY": 66,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 95,
+ 75
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 54,
+ "zoomY": 54,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 63,
+ 50
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -104,
+ -104,
+ -104,
+ 155
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 96,
+ "zoomY": 96,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 175,
+ 137
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 84,
+ "zoomY": 84,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 143,
+ 112
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 72,
+ "zoomY": 72,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 111,
+ 87
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 60,
+ "zoomY": 60,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 79,
+ 62
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -114,
+ -114,
+ -114,
+ 170
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 102,
+ "zoomY": 102,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 191,
+ 150
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 159,
+ 125
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 78,
+ "zoomY": 78,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 127,
+ 100
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 66,
+ "zoomY": 66,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 95,
+ 75
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -123,
+ -123,
+ -123,
+ 184
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 108,
+ "zoomY": 108,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 207,
+ 162
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 96,
+ "zoomY": 96,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 175,
+ 137
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 84,
+ "zoomY": 84,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 143,
+ 112
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 72,
+ "zoomY": 72,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 111,
+ 87
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -133,
+ -133,
+ -133,
+ 198
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 114,
+ "zoomY": 114,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 223,
+ 175
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 102,
+ "zoomY": 102,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 191,
+ 150
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 159,
+ 125
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 78,
+ "zoomY": 78,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 127,
+ 100
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -142,
+ -142,
+ -142,
+ 212
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 239,
+ 187
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 108,
+ "zoomY": 108,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 207,
+ 162
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 96,
+ "zoomY": 96,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 175,
+ 137
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 84,
+ "zoomY": 84,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 143,
+ 112
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -152,
+ -152,
+ -152,
+ 226
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 114,
+ "zoomY": 114,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 223,
+ 175
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 102,
+ "zoomY": 102,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 191,
+ 150
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 159,
+ 125
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -161,
+ -161,
+ -161,
+ 240
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 239,
+ 187
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 108,
+ "zoomY": 108,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 207,
+ 162
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 96,
+ "zoomY": 96,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 175,
+ 137
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 114,
+ "zoomY": 114,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 223,
+ 175
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 102,
+ "zoomY": 102,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 191,
+ 150
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 239,
+ 187
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 108,
+ "zoomY": 108,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 207,
+ 162
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 114,
+ "zoomY": 114,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 223,
+ 175
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 239,
+ 187
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 0,
+ 0,
+ 255,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 27,
+ 27,
+ 250,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 27,
+ 27,
+ 250,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 27,
+ 27,
+ 250,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 27,
+ 27,
+ 250,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 55,
+ 55,
+ 246,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 55,
+ 55,
+ 246,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 55,
+ 55,
+ 246,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 55,
+ 55,
+ 246,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 82,
+ 82,
+ 241,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 82,
+ 82,
+ 241,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 82,
+ 82,
+ 241,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 82,
+ 82,
+ 241,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 110,
+ 110,
+ 237,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 110,
+ 110,
+ 237,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 110,
+ 110,
+ 237,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 110,
+ 110,
+ 237,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 137,
+ 137,
+ 233,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 137,
+ 137,
+ 233,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 137,
+ 137,
+ 233,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 137,
+ 137,
+ 233,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 165,
+ 165,
+ 228,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 165,
+ 165,
+ 228,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 165,
+ 165,
+ 228,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 165,
+ 165,
+ 228,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 192,
+ 192,
+ 224,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 192,
+ 192,
+ 224,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 192,
+ 192,
+ 224,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 192,
+ 192,
+ 224,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 96,
+ "y": -48,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 96,
+ "y": -48,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 96,
+ "y": -48,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 96,
+ "y": -48,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -36,
+ -36,
+ -36,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 204,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 204,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 204,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 204,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -72,
+ -72,
+ -72,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 153,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 153,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 153,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 153,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -108,
+ -108,
+ -108,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 102,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 315,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 102,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 102,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 102,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -34.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -144,
+ -144,
+ -144,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 51,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 270,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 51,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 180,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 51,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 120,
+ "zoomY": 120,
+ "angle": 90,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 51,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -31.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -47.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -30.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -55.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -74.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -26.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -71.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -34.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -79.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -36.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -87.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -52.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -94.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -60.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -74,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -60.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -30,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -76,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -68.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -62.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -72,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -76.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -68,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -84.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -78.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -86.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -62,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 139.5,
+ "y": -94.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -62,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -78,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 116,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -78,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 170,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -180,
+ -180,
+ -180,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 143.5,
+ "y": -94,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 13,
+ "opacity": 85,
+ "color": [
+ 220,
+ 220,
+ 220,
+ 200
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -160,
+ -160,
+ -160,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -140,
+ -140,
+ -140,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -100,
+ -100,
+ -100,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -80,
+ -80,
+ -80,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -60,
+ -60,
+ -60,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -40,
+ -40,
+ -40,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -20,
+ -20,
+ -20,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -170,
+ -170,
+ -170,
+ 255
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -142,
+ -142,
+ -142,
+ 212
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -114,
+ -114,
+ -114,
+ 170
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -85,
+ -85,
+ -85,
+ 127
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -57,
+ -57,
+ -57,
+ 85
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -29,
+ -29,
+ -29,
+ 42
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "Thunder9.m4a",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "29": [
+ {
+ "frameIndex": 29,
+ "resourceName": "",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "38": [
+ {
+ "frameIndex": 38,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "40": [
+ {
+ "frameIndex": 40,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "42": [
+ {
+ "frameIndex": 42,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "44": [
+ {
+ "frameIndex": 44,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "46": [
+ {
+ "frameIndex": 46,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "48": [
+ {
+ "frameIndex": 48,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "50": [
+ {
+ "frameIndex": 50,
+ "resourceName": "PRSFX- Burn Up1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 2,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/psyblade.json b/public/battle-anims/psyblade.json
new file mode 100644
index 00000000000..1f4ce283302
--- /dev/null
+++ b/public/battle-anims/psyblade.json
@@ -0,0 +1,1923 @@
+[
+ {
+ "id": 427,
+ "graphic": "PRAS- Psycho Cut",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 287,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 215,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 143,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 71,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 36.5,
+ "y": -12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 49,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 36,
+ "y": -12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 24,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 61.5,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 49,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 36,
+ "y": -12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 74,
+ "y": -35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 61,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 49,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86.5,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 74,
+ "y": -34.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 61,
+ "y": -27.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 74,
+ "y": -34,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 111.5,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 86,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 99,
+ "y": -49.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 112,
+ "y": -57.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Psycho Cut.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ },
+ {
+ "id": 427,
+ "graphic": "PRAS- Psycho Cut",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 213,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 252,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 291,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 330,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 10,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 120,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 81,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 107,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 81,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 94,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 55,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 81,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 42,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 55,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 68,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 29,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 42,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 55,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 16.5,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 29,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 42,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 16.5,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 29,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 100,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 16.5,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 60,
+ "mirror": true,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 150,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Psycho Cut.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/sappy-seed.json b/public/battle-anims/sappy-seed.json
new file mode 100644
index 00000000000..d32c2bb2417
--- /dev/null
+++ b/public/battle-anims/sappy-seed.json
@@ -0,0 +1,4895 @@
+[
+ {
+ "id": 73,
+ "graphic": "PRAS- Leech Seed",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -22.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 63,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 127,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 51,
+ "focus": 3
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 191,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 102,
+ "focus": 3
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 153,
+ "focus": 3
+ },
+ {
+ "x": 21.5,
+ "y": -32.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 51,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 204,
+ "focus": 3
+ },
+ {
+ "x": 26.5,
+ "y": -43,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 102,
+ "focus": 3
+ },
+ {
+ "x": 5,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 36,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 153,
+ "focus": 3
+ },
+ {
+ "x": 22,
+ "y": -35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 46,
+ "y": -58.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 204,
+ "focus": 3
+ },
+ {
+ "x": 29,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 62,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -21.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 36,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 78,
+ "y": -71,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 18.5,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ },
+ {
+ "x": 64.5,
+ "y": -65,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 101.5,
+ "y": -66.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 44,
+ "y": -57,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 87,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 125,
+ "y": -61.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -66,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 109.5,
+ "y": -74.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 137,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -74.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 116,
+ "y": -62,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 92,
+ "y": -69.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 148,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 107,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 110,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 187,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 204,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 204,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 204,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 149,
+ "y": -46.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "4": [
+ {
+ "frameIndex": 4,
+ "resourceName": "PRSFX- Leech Seed2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ },
+ {
+ "id": 73,
+ "graphic": "PRAS- Leech Seed",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 63,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 127,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 191,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 85,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 104,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 170,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 92,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 72,
+ "y": -58.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 85,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 104,
+ "y": -67,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 53,
+ "y": -50,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 170,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 84,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 37.5,
+ "y": -37.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 70,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 22,
+ "y": -25,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 88,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 56,
+ "y": -46,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 6.5,
+ "y": -12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 75.19999999999999,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 42,
+ "y": -31,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -9,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 62.400000000000006,
+ "y": -35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 28,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -24,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 49.599999999999994,
+ "y": -19,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": 14,
+ "y": -2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.8,
+ "y": -3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 24,
+ "y": 13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 183,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 183,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 183,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 111,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 111,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 111,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 40,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 40,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 93,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 93,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 93,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 147,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 147,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 147,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 201,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 201,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 201,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 204,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 204,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 204,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 153,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 102,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 51,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 20,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "focus": 2
+ },
+ {
+ "x": -4,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "focus": 2
+ },
+ {
+ "x": -28,
+ "y": 17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "focus": 2
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Leech Seed2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/sizzly-slide.json b/public/battle-anims/sizzly-slide.json
new file mode 100644
index 00000000000..a045f425f9c
--- /dev/null
+++ b/public/battle-anims/sizzly-slide.json
@@ -0,0 +1,2715 @@
+[
+ {
+ "id": 488,
+ "graphic": "PRAS- Fire",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 155,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -1,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": -0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -4,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 25,
+ "y": -12,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 21.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 50.5,
+ "y": -23.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 47,
+ "y": -25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 75.5,
+ "y": -35.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 72.5,
+ "y": -38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 101,
+ "y": -47,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 98,
+ "y": -50.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 126.5,
+ "y": -58.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 123.5,
+ "y": -63,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 144,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 145.5,
+ "y": -73.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140.5,
+ "y": -69.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 162,
+ "y": -82.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 163.5,
+ "y": -83,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 157.5,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 180,
+ "y": -94.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 181.5,
+ "y": -92,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 174.5,
+ "y": -81.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 198,
+ "y": -106.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 168,
+ "y": -85,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 193,
+ "y": -96.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 168.5,
+ "y": -86,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 154.5,
+ "y": -78,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 162.5,
+ "y": -82,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 141,
+ "y": -71,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 157,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 157,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -54.5,
+ "y": 38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -36.5,
+ "y": 25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -18.5,
+ "y": 12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "1": [
+ {
+ "frameIndex": 1,
+ "resourceName": "PRSFX- Flame Charge1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "PRSFX- Flame Charge1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "20": [
+ {
+ "frameIndex": 20,
+ "resourceName": "PRSFX- Flame Charge2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ },
+ {
+ "id": 488,
+ "graphic": "PRAS- Fire",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 155,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 117,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -53,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -51,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 102.5,
+ "y": -52,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 101,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 77,
+ "y": -40,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 74,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 51.5,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 47,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 26,
+ "y": -16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 20,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -2.5,
+ "y": 1.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0.5,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -6.5,
+ "y": 7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -18,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -10,
+ "y": 0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -18,
+ "y": 12.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 9,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -33,
+ "y": 18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -20.5,
+ "y": 5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -29.5,
+ "y": 18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 10,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -48,
+ "y": 26.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -30.5,
+ "y": 9.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -41,
+ "y": 23.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -48,
+ "y": 26.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -54.5,
+ "y": 38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -63.5,
+ "y": 44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 11,
+ "opacity": 255,
+ "priority": 2,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -48,
+ "y": 26.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -54.5,
+ "y": 38.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": -16,
+ "y": 8.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -31.5,
+ "y": 16,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -20,
+ "y": 5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": -20,
+ "y": 5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "tone": [
+ 255,
+ 0,
+ 0,
+ 0
+ ],
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 178.5,
+ "y": -86.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 165.5,
+ "y": -81,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 153,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 140.5,
+ "y": -70,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "1": [
+ {
+ "frameIndex": 1,
+ "resourceName": "PRSFX- Flame Charge1.wav",
+ "volume": 100,
+ "pitch": 110,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "PRSFX- Flame Charge1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "20": [
+ {
+ "frameIndex": 20,
+ "resourceName": "PRSFX- Flame Charge2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 1,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/sparkly-swirl.json b/public/battle-anims/sparkly-swirl.json
new file mode 100644
index 00000000000..7972d6bec03
--- /dev/null
+++ b/public/battle-anims/sparkly-swirl.json
@@ -0,0 +1,2236 @@
+{
+ "id": 617,
+ "graphic": "PRAS- Strike",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -40,
+ -40,
+ -40,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -80,
+ -80,
+ -80,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 110,
+ "y": -48,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 154.5,
+ "y": -54,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 106,
+ "y": -80.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 141.5,
+ "y": -79,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 141.5,
+ "y": -45.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 114,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 146,
+ "y": -58.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108.5,
+ "y": -38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 154.5,
+ "y": -78,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 107,
+ "y": -73.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 134.5,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 111.5,
+ "y": -43,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 151.5,
+ "y": -40,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 125.5,
+ "y": -88.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 102.5,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 146,
+ "y": -44.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 113.5,
+ "y": -57,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 140.5,
+ "y": -70.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 93.5,
+ "y": -75.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99.5,
+ "y": -41.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 154,
+ "y": -40.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 155.5,
+ "y": -85,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 104.5,
+ "y": -41.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 134,
+ "y": -43,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 154.5,
+ "y": -60,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 100,
+ "y": -56.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 149,
+ "y": -86.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 147,
+ "y": -41,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 107,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 160,
+ "y": -69,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 102.5,
+ "y": -45,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 113,
+ "y": -80,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -43,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -120,
+ -120,
+ -120,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 105,
+ "y": -39.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -80,
+ -80,
+ -80,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ -40,
+ -40,
+ -40,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Flash FG",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 5,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 255,
+ "duration": 4,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "1": [
+ {
+ "frameIndex": 1,
+ "resourceName": "Saint7.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "6": [
+ {
+ "frameIndex": 6,
+ "resourceName": "Saint8.m4a",
+ "volume": 80,
+ "pitch": 60,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "11": [
+ {
+ "frameIndex": 11,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "13": [
+ {
+ "frameIndex": 13,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "15": [
+ {
+ "frameIndex": 15,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "17": [
+ {
+ "frameIndex": 17,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "19": [
+ {
+ "frameIndex": 19,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "21": [
+ {
+ "frameIndex": 21,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "23": [
+ {
+ "frameIndex": 23,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "25": [
+ {
+ "frameIndex": 25,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "27": [
+ {
+ "frameIndex": 27,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "29": [
+ {
+ "frameIndex": 29,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "31": [
+ {
+ "frameIndex": 31,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "33": [
+ {
+ "frameIndex": 33,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "35": [
+ {
+ "frameIndex": 35,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "37": [
+ {
+ "frameIndex": 37,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "39": [
+ {
+ "frameIndex": 39,
+ "resourceName": "",
+ "bgX": 0,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 4,
+ "eventType": "AnimTimedUpdateBgEvent"
+ },
+ {
+ "frameIndex": 39,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "41": [
+ {
+ "frameIndex": 41,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "43": [
+ {
+ "frameIndex": 43,
+ "resourceName": "Blow1.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/splishy-splash.json b/public/battle-anims/splishy-splash.json
new file mode 100644
index 00000000000..99718798bb5
--- /dev/null
+++ b/public/battle-anims/splishy-splash.json
@@ -0,0 +1,2458 @@
+[
+ {
+ "id": 57,
+ "graphic": "",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Surf.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Surf FG",
+ "bgX": -10,
+ "bgY": 365,
+ "opacity": 0,
+ "duration": 2,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": 400,
+ "bgY": 340,
+ "duration": 45,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "1": [
+ {
+ "frameIndex": 1,
+ "resourceName": "",
+ "opacity": 200,
+ "duration": 6,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "30": [
+ {
+ "frameIndex": 30,
+ "resourceName": "",
+ "opacity": 0,
+ "duration": 15,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+ },
+ {
+ "id": 57,
+ "graphic": "",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Surf.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "PRAS- Surf FG Opp - Copie",
+ "bgX": -50,
+ "bgY": 0,
+ "opacity": 0,
+ "duration": 2,
+ "eventType": "AnimTimedAddBgEvent"
+ },
+ {
+ "frameIndex": 0,
+ "resourceName": "",
+ "bgX": -600,
+ "bgY": 200,
+ "duration": 45,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "1": [
+ {
+ "frameIndex": 1,
+ "resourceName": "",
+ "opacity": 200,
+ "duration": 6,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ],
+ "30": [
+ {
+ "frameIndex": 30,
+ "resourceName": "",
+ "opacity": 0,
+ "duration": 15,
+ "eventType": "AnimTimedUpdateBgEvent"
+ }
+ ]
+ },
+ "position": 4,
+ "hue": 0
+ }
+]
diff --git a/public/battle-anims/syrup-bomb.json b/public/battle-anims/syrup-bomb.json
new file mode 100644
index 00000000000..82b3a39253e
--- /dev/null
+++ b/public/battle-anims/syrup-bomb.json
@@ -0,0 +1,1800 @@
+[
+ {
+ "id": 787,
+ "graphic": "GEN8- Apple Acid",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 70,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 70,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 14,
+ "y": -14,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 32,
+ "y": -36,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 52,
+ "y": -51.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 70,
+ "y": -66.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 89.5,
+ "y": -78.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 115,
+ "y": -75,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128.5,
+ "y": -66.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128.5,
+ "y": -66.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -59,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -53.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -48,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -42.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128.5,
+ "y": -29.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "Poison.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ },
+ {
+ "id": 787,
+ "graphic": "GEN8- Apple Acid",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 70,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 70,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 80,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 90,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 103,
+ "y": -77.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 80,
+ "y": -74,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 50.5,
+ "y": -54.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 33,
+ "y": -38,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 16.5,
+ "y": -13.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 4
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 14,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 4
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 4
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 4
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 4
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 42,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "Poison.m4a",
+ "volume": 80,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+ }
+]
\ No newline at end of file
diff --git a/public/battle-anims/veevee-volley.json b/public/battle-anims/veevee-volley.json
new file mode 100644
index 00000000000..7590707e65e
--- /dev/null
+++ b/public/battle-anims/veevee-volley.json
@@ -0,0 +1,886 @@
+{
+ "id": 216,
+ "graphic": "PRAS- Love",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": 0.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -6.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": 18.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 135,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -3,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -10,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": 14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -7,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -13.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": 10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -10.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -17,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": 6.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -14.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -21,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": 2.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -18,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -24.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": -1,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -22,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -28,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": -5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -25.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -31.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": -9,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -29,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -35,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -0.5,
+ "y": -13,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -33,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 130,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -39,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 130,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -16.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 8,
+ "y": -2,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 27,
+ "y": -37,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 70,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -30,
+ "y": -43.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 70,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 130,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 16,
+ "y": -6,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": -24.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 70,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 24,
+ "y": -8,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 12,
+ "y": -4,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 124,
+ "y": -58,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 130,
+ "priority": 1,
+ "focus": 3
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Return1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "11": [
+ {
+ "frameIndex": 11,
+ "resourceName": "PRSFX- Return2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 3,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/wicked-torque.json b/public/battle-anims/wicked-torque.json
new file mode 100644
index 00000000000..c20bac6a4f1
--- /dev/null
+++ b/public/battle-anims/wicked-torque.json
@@ -0,0 +1,14194 @@
+{
+ "id": 663,
+ "graphic": "PRAS- Coil",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 27,
+ 0,
+ 0,
+ 19
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 54,
+ 0,
+ 0,
+ 39
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 82,
+ 0,
+ 0,
+ 59
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 109,
+ 0,
+ 0,
+ 78
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 137,
+ 0,
+ 0,
+ 98
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 58,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 164,
+ 0,
+ 0,
+ 118
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -22.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 35.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 58,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -45,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 13,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 35.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 58,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -67.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -8.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 13,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 35.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": -90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -32,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -8.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 13,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -112,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": -54,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -32,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -8.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -80,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -54,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -32,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -80,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": -54,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -107,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": -83.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -59.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -35.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -11.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -67.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 12.5,
+ "y": -63.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 12.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -45,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -67.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 36.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -45,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -67.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 60,
+ "y": -64.5,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 60.5,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -45,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 84,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 27.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": -20,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 108,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 51.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 27.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 4,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 132.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 76,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 51.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 27.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 132,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 155,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 76,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 51.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 156,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 178,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 76,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 99.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 204,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 224,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -44,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 1
+ },
+ {
+ "x": 170.5,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 124,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 228,
+ "y": -84,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 169,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 148,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 192,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 169,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 192,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 1
+ }
+ ],
+ [
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 241,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 210.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 180.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 150.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 178.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120.5,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 148.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 178.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 90,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 148.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 178.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 30,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 88,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 148.5,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 192,
+ 0,
+ 0,
+ 138
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 88,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 120,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 168,
+ 0,
+ 0,
+ 120
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 88,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 144,
+ 0,
+ 0,
+ 103
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 150,
+ 0,
+ 0,
+ 150
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 60,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 12,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 86
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 120,
+ 0,
+ 0,
+ 120
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 96,
+ 0,
+ 0,
+ 69
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 90,
+ 0,
+ 0,
+ 90
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 144,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "mirror": true,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 72,
+ 0,
+ 0,
+ 51
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 60,
+ 0,
+ 0,
+ 60
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 144,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 48,
+ 0,
+ 0,
+ 34
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "color": [
+ 30,
+ 0,
+ 0,
+ 30
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 144,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "color": [
+ 24,
+ 0,
+ 0,
+ 17
+ ],
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": -20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 20,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "blendType": 2,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 144,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Brutal Swing1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "5": [
+ {
+ "frameIndex": 5,
+ "resourceName": "PRSFX- Brutal Swing2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "14": [
+ {
+ "frameIndex": 14,
+ "resourceName": "PRSFX- Brutal Swing2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "31": [
+ {
+ "frameIndex": 31,
+ "resourceName": "PRSFX- Brutal Swing2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "40": [
+ {
+ "frameIndex": 40,
+ "resourceName": "PRSFX- Brutal Swing1.wav",
+ "volume": 100,
+ "pitch": 120,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 2,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/battle-anims/zippy-zap.json b/public/battle-anims/zippy-zap.json
new file mode 100644
index 00000000000..ffc22e7b75a
--- /dev/null
+++ b/public/battle-anims/zippy-zap.json
@@ -0,0 +1,3133 @@
+{
+ "id": 716,
+ "graphic": "PRAS- Electric",
+ "frames": [
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 126,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 306,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 195,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 101,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 25,
+ 25,
+ -26,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 251,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 155,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 38,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "angle": 91,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 51,
+ 51,
+ -51,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 139,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 252,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 291,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 140,
+ "zoomY": 140,
+ "angle": 145,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 76,
+ 76,
+ -77,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 205,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 45,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 228,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 121,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 102,
+ 102,
+ -102,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 190,
+ "zoomY": 190,
+ "angle": 210,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 190,
+ "zoomY": 190,
+ "angle": 124,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 190,
+ "zoomY": 190,
+ "angle": 10,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 190,
+ "zoomY": 190,
+ "angle": 242,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 127,
+ 127,
+ -128,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "angle": 253,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "angle": 53,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "angle": 225,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 200,
+ "zoomY": 200,
+ "angle": 324,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 153,
+ 153,
+ -153,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 205,
+ "zoomY": 205,
+ "angle": 58,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 205,
+ "zoomY": 205,
+ "angle": 152,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 205,
+ "zoomY": 205,
+ "angle": 269,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 205,
+ "zoomY": 205,
+ "angle": 205,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "tone": [
+ 178,
+ 178,
+ -179,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 339,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 133,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 39,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 346,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 170,
+ "tone": [
+ 204,
+ 204,
+ -204,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 43,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 192,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 154,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 355,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 85,
+ "tone": [
+ 229,
+ 229,
+ -230,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 160,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 74,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 187,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 223,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "tone": [
+ 255,
+ 255,
+ -255,
+ 0
+ ],
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 111,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 304,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 346,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 199,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 232,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 268,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 83,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 158,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 134,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 331,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 252,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 191,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 192,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 46,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 308,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 241,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 312,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 196,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 18,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 149,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 11,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 135,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 325,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 248,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 2
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 167,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 117,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 224,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 341,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 112,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 26,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 75,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 27,
+ "opacity": 255,
+ "tone": [
+ 75,
+ 150,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 144,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 28,
+ "opacity": 255,
+ "tone": [
+ 0,
+ 75,
+ 0,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 1,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 64,
+ "y": -32,
+ "zoomX": 50,
+ "zoomY": 50,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 30,
+ "tone": [
+ 255,
+ 255,
+ 255,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 2,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 10,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 111,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 192,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 32,
+ "y": -16,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 252,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 60,
+ "tone": [
+ 127,
+ 127,
+ 127,
+ 0
+ ],
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 3,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 292,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 343,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 168,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 88,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 4,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 341,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 129,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 227,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 286,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 85,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 5,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 359,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 162,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 44,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 288,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 175,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 6,
+ "opacity": 255,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 15,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 170,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 226,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 210,
+ "zoomY": 210,
+ "angle": 73,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 90,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 191,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 7,
+ "opacity": 214,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 85,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 145,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 18,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 170,
+ "zoomY": 170,
+ "angle": 344,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 72,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 207,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 8,
+ "opacity": 173,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 12,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 54,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 282,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 54,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 341,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 54,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 130,
+ "zoomY": 130,
+ "angle": 107,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 54,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 223,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 76,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 115,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 284,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 90,
+ "zoomY": 90,
+ "angle": 227,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 36,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 239,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 260,
+ "visible": true,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 18,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 4,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 18,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 320,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 18,
+ "priority": 1,
+ "focus": 3
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 50,
+ "zoomY": 50,
+ "angle": 190,
+ "visible": true,
+ "blendType": 1,
+ "target": 2,
+ "graphicFrame": 46,
+ "opacity": 18,
+ "priority": 1,
+ "focus": 3
+ }
+ ],
+ [
+ {
+ "x": 0,
+ "y": 0,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 0,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 2
+ },
+ {
+ "x": 128,
+ "y": -64,
+ "zoomX": 100,
+ "zoomY": 100,
+ "visible": true,
+ "target": 1,
+ "graphicFrame": 0,
+ "opacity": 255,
+ "locked": true,
+ "priority": 1,
+ "focus": 1
+ }
+ ]
+ ],
+ "frameTimedEvents": {
+ "0": [
+ {
+ "frameIndex": 0,
+ "resourceName": "PRSFX- Zing Zap1.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "9": [
+ {
+ "frameIndex": 9,
+ "resourceName": "PRSFX- Zing Zap2.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "25": [
+ {
+ "frameIndex": 25,
+ "resourceName": "PRSFX- Zing Zap3.wav",
+ "volume": 65,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ],
+ "28": [
+ {
+ "frameIndex": 28,
+ "resourceName": "PRSFX- Zing Zap4.wav",
+ "volume": 100,
+ "pitch": 100,
+ "eventType": "AnimTimedSoundEvent"
+ }
+ ]
+ },
+ "position": 2,
+ "hue": 0
+}
\ No newline at end of file
diff --git a/public/images/egg/egg.json b/public/images/egg/egg.json
index 420d9e57e7b..4e5f7a7de21 100644
--- a/public/images/egg/egg.json
+++ b/public/images/egg/egg.json
@@ -5,7 +5,7 @@
"format": "RGBA8888",
"size": {
"w": 138,
- "h": 30
+ "h": 31
},
"scale": 1,
"frames": [
@@ -99,19 +99,19 @@
"trimmed": false,
"sourceSize": {
"w": 26,
- "h": 30
+ "h": 31
},
"spriteSourceSize": {
"x": 0,
"y": 0,
"w": 26,
- "h": 30
+ "h": 31
},
"frame": {
"x": 112,
"y": 0,
"w": 26,
- "h": 30
+ "h": 31
}
}
]
diff --git a/public/images/egg/egg.png b/public/images/egg/egg.png
index 5269eff1680..2943e83b5ea 100644
Binary files a/public/images/egg/egg.png and b/public/images/egg/egg.png differ
diff --git a/public/images/events/september-update-de.png b/public/images/events/september-update-de.png
new file mode 100644
index 00000000000..1ecb46e408c
Binary files /dev/null and b/public/images/events/september-update-de.png differ
diff --git a/public/images/events/september-update-en.png b/public/images/events/september-update-en.png
new file mode 100644
index 00000000000..57dd130b98d
Binary files /dev/null and b/public/images/events/september-update-en.png differ
diff --git a/public/images/events/september-update-es.png b/public/images/events/september-update-es.png
new file mode 100644
index 00000000000..8c294d21403
Binary files /dev/null and b/public/images/events/september-update-es.png differ
diff --git a/public/images/events/september-update-fr.png b/public/images/events/september-update-fr.png
new file mode 100644
index 00000000000..4be33c85e9a
Binary files /dev/null and b/public/images/events/september-update-fr.png differ
diff --git a/public/images/events/september-update-it.png b/public/images/events/september-update-it.png
new file mode 100644
index 00000000000..62542f4eb9b
Binary files /dev/null and b/public/images/events/september-update-it.png differ
diff --git a/public/images/events/september-update-ja.png b/public/images/events/september-update-ja.png
new file mode 100644
index 00000000000..93e18c51223
Binary files /dev/null and b/public/images/events/september-update-ja.png differ
diff --git a/public/images/events/september-update-ko.png b/public/images/events/september-update-ko.png
new file mode 100644
index 00000000000..13585327fce
Binary files /dev/null and b/public/images/events/september-update-ko.png differ
diff --git a/public/images/events/september-update-pt-BR.png b/public/images/events/september-update-pt-BR.png
new file mode 100644
index 00000000000..8dd8b8759e9
Binary files /dev/null and b/public/images/events/september-update-pt-BR.png differ
diff --git a/public/images/events/september-update-zh-CN.png b/public/images/events/september-update-zh-CN.png
new file mode 100644
index 00000000000..ee56d644d24
Binary files /dev/null and b/public/images/events/september-update-zh-CN.png differ
diff --git a/public/images/inputs/keyboard.json b/public/images/inputs/keyboard.json
index b1902df10d6..c9b3c79fbfb 100644
--- a/public/images/inputs/keyboard.json
+++ b/public/images/inputs/keyboard.json
@@ -1,596 +1,529 @@
-{"frames": [
-
-{
- "filename": "0.png",
- "frame": {"x":0,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "1.png",
- "frame": {"x":12,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "2.png",
- "frame": {"x":24,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "3.png",
- "frame": {"x":36,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "4.png",
- "frame": {"x":48,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "5.png",
- "frame": {"x":60,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "6.png",
- "frame": {"x":72,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "7.png",
- "frame": {"x":84,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "8.png",
- "frame": {"x":96,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "9.png",
- "frame": {"x":108,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "A.png",
- "frame": {"x":120,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "ALT.png",
- "frame": {"x":132,"y":0,"w":16,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":12},
- "sourceSize": {"w":16,"h":12}
-},
-{
- "filename": "B.png",
- "frame": {"x":148,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "BACK.png",
- "frame": {"x":160,"y":0,"w":24,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":24,"h":12},
- "sourceSize": {"w":24,"h":12}
-},
-{
- "filename": "C.png",
- "frame": {"x":184,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "CTRL.png",
- "frame": {"x":196,"y":0,"w":22,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":22,"h":12},
- "sourceSize": {"w":22,"h":12}
-},
-{
- "filename": "D.png",
- "frame": {"x":218,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "DEL.png",
- "frame": {"x":230,"y":0,"w":17,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":17,"h":12},
- "sourceSize": {"w":17,"h":12}
-},
-{
- "filename": "E.png",
- "frame": {"x":247,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "END.png",
- "frame": {"x":259,"y":0,"w":18,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":18,"h":12},
- "sourceSize": {"w":18,"h":12}
-},
-{
- "filename": "ENTER.png",
- "frame": {"x":277,"y":0,"w":27,"h":11},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":27,"h":11},
- "sourceSize": {"w":27,"h":11}
-},
-{
- "filename": "ESC.png",
- "frame": {"x":304,"y":0,"w":17,"h":11},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":17,"h":11},
- "sourceSize": {"w":17,"h":11}
-},
-{
- "filename": "F.png",
- "frame": {"x":321,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "F1.png",
- "frame": {"x":333,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F2.png",
- "frame": {"x":346,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F3.png",
- "frame": {"x":359,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F4.png",
- "frame": {"x":372,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F5.png",
- "frame": {"x":385,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F6.png",
- "frame": {"x":398,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F7.png",
- "frame": {"x":411,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F8.png",
- "frame": {"x":424,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F9.png",
- "frame": {"x":437,"y":0,"w":13,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":13,"h":12},
- "sourceSize": {"w":13,"h":12}
-},
-{
- "filename": "F10.png",
- "frame": {"x":450,"y":0,"w":16,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":12},
- "sourceSize": {"w":16,"h":12}
-},
-{
- "filename": "F11.png",
- "frame": {"x":466,"y":0,"w":15,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":15,"h":12},
- "sourceSize": {"w":15,"h":12}
-},
-{
- "filename": "F12.png",
- "frame": {"x":481,"y":0,"w":16,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":12},
- "sourceSize": {"w":16,"h":12}
-},
-{
- "filename": "G.png",
- "frame": {"x":497,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "H.png",
- "frame": {"x":509,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "HOME.png",
- "frame": {"x":521,"y":0,"w":23,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":23,"h":12},
- "sourceSize": {"w":23,"h":12}
-},
-{
- "filename": "I.png",
- "frame": {"x":544,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "INS.png",
- "frame": {"x":556,"y":0,"w":16,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":16,"h":12},
- "sourceSize": {"w":16,"h":12}
-},
-{
- "filename": "J.png",
- "frame": {"x":572,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "K.png",
- "frame": {"x":584,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "KEY_ARROW_DOWN.png",
- "frame": {"x":596,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "KEY_ARROW_LEFT.png",
- "frame": {"x":608,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "KEY_ARROW_RIGHT.png",
- "frame": {"x":620,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "KEY_ARROW_UP.png",
- "frame": {"x":632,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "L.png",
- "frame": {"x":644,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "LEFT_BRACKET.png",
- "frame": {"x":656,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "M.png",
- "frame": {"x":668,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "MINUS.png",
- "frame": {"x":680,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "N.png",
- "frame": {"x":692,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "O.png",
- "frame": {"x":704,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "P.png",
- "frame": {"x":716,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "PAGE_DOWN.png",
- "frame": {"x":728,"y":0,"w":20,"h":11},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":20,"h":11},
- "sourceSize": {"w":20,"h":11}
-},
-{
- "filename": "PAGE_UP.png",
- "frame": {"x":748,"y":0,"w":20,"h":11},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":20,"h":11},
- "sourceSize": {"w":20,"h":11}
-},
-{
- "filename": "PLUS.png",
- "frame": {"x":768,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "Q.png",
- "frame": {"x":780,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "QUOTE.png",
- "frame": {"x":792,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "R.png",
- "frame": {"x":804,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "RIGHT_BRACKET.png",
- "frame": {"x":816,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "S.png",
- "frame": {"x":828,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "SEMICOLON.png",
- "frame": {"x":840,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "SHIFT.png",
- "frame": {"x":852,"y":0,"w":23,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":23,"h":12},
- "sourceSize": {"w":23,"h":12}
-},
-{
- "filename": "SPACE.png",
- "frame": {"x":875,"y":0,"w":25,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":25,"h":12},
- "sourceSize": {"w":25,"h":12}
-},
-{
- "filename": "T.png",
- "frame": {"x":900,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "TAB.png",
- "frame": {"x":912,"y":0,"w":19,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":19,"h":12},
- "sourceSize": {"w":19,"h":12}
-},
-{
- "filename": "TILDE.png",
- "frame": {"x":931,"y":0,"w":15,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":15,"h":12},
- "sourceSize": {"w":15,"h":12}
-},
-{
- "filename": "U.png",
- "frame": {"x":946,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "V.png",
- "frame": {"x":958,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "W.png",
- "frame": {"x":970,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "X.png",
- "frame": {"x":982,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "Y.png",
- "frame": {"x":994,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-},
-{
- "filename": "Z.png",
- "frame": {"x":1006,"y":0,"w":12,"h":12},
- "rotated": false,
- "trimmed": false,
- "spriteSourceSize": {"x":0,"y":0,"w":12,"h":12},
- "sourceSize": {"w":12,"h":12}
-}],
-"meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "1.0",
- "image": "keyboard.png",
- "format": "RGBA8888",
- "size": {"w":1018,"h":12},
- "scale": "1",
- "smartupdate": "$TexturePacker:SmartUpdate:085d4353a5c4d18c90f82f8926710d72:45908b22b446cf7f4904d4e0b658b16a:bad03abb89ad027d879c383c13fd51bc$"
-}
-}
+{ "frames": {
+ "0.png": {
+ "frame": { "x": 12, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "1.png": {
+ "frame": { "x": 36, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "2.png": {
+ "frame": { "x": 0, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "3.png": {
+ "frame": { "x": 12, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "4.png": {
+ "frame": { "x": 24, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "5.png": {
+ "frame": { "x": 84, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "6.png": {
+ "frame": { "x": 96, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "7.png": {
+ "frame": { "x": 120, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "8.png": {
+ "frame": { "x": 132, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "9.png": {
+ "frame": { "x": 52, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "A.png": {
+ "frame": { "x": 64, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "ALT.png": {
+ "frame": { "x": 0, "y": 22, "w": 16, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
+ "sourceSize": { "w": 16, "h": 11 }
+ },
+ "B.png": {
+ "frame": { "x": 76, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "BACK.png": {
+ "frame": { "x": 80, "y": 0, "w": 24, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 24, "h": 11 },
+ "sourceSize": { "w": 24, "h": 11 }
+ },
+ "C.png": {
+ "frame": { "x": 88, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "CTRL.png": {
+ "frame": { "x": 0, "y": 11, "w": 22, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 22, "h": 11 },
+ "sourceSize": { "w": 22, "h": 11 }
+ },
+ "D.png": {
+ "frame": { "x": 100, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "DEL.png": {
+ "frame": { "x": 116, "y": 11, "w": 17, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 17, "h": 11 },
+ "sourceSize": { "w": 17, "h": 11 }
+ },
+ "E.png": {
+ "frame": { "x": 112, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "END.png": {
+ "frame": { "x": 81, "y": 11, "w": 18, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 18, "h": 11 },
+ "sourceSize": { "w": 18, "h": 11 }
+ },
+ "ENTER.png": {
+ "frame": { "x": 28, "y": 0, "w": 27, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 27, "h": 11 },
+ "sourceSize": { "w": 27, "h": 11 }
+ },
+ "ESC.png": {
+ "frame": { "x": 99, "y": 11, "w": 17, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 17, "h": 11 },
+ "sourceSize": { "w": 17, "h": 11 }
+ },
+ "F.png": {
+ "frame": { "x": 124, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "F1.png": {
+ "frame": { "x": 78, "y": 22, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F2.png": {
+ "frame": { "x": 91, "y": 22, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F3.png": {
+ "frame": { "x": 104, "y": 22, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F4.png": {
+ "frame": { "x": 117, "y": 22, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F5.png": {
+ "frame": { "x": 130, "y": 22, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F6.png": {
+ "frame": { "x": 0, "y": 33, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F7.png": {
+ "frame": { "x": 13, "y": 33, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F8.png": {
+ "frame": { "x": 26, "y": 33, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F9.png": {
+ "frame": { "x": 39, "y": 33, "w": 13, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 13, "h": 11 },
+ "sourceSize": { "w": 13, "h": 11 }
+ },
+ "F10.png": {
+ "frame": { "x": 16, "y": 22, "w": 16, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
+ "sourceSize": { "w": 16, "h": 11 }
+ },
+ "F11.png": {
+ "frame": { "x": 48, "y": 22, "w": 15, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 15, "h": 11 },
+ "sourceSize": { "w": 15, "h": 11 }
+ },
+ "F12.png": {
+ "frame": { "x": 133, "y": 11, "w": 16, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
+ "sourceSize": { "w": 16, "h": 11 }
+ },
+ "G.png": {
+ "frame": { "x": 136, "y": 33, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "H.png": {
+ "frame": { "x": 0, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "HOME.png": {
+ "frame": { "x": 104, "y": 0, "w": 23, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 23, "h": 11 },
+ "sourceSize": { "w": 23, "h": 11 }
+ },
+ "I.png": {
+ "frame": { "x": 24, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "INS.png": {
+ "frame": { "x": 32, "y": 22, "w": 16, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 16, "h": 11 },
+ "sourceSize": { "w": 16, "h": 11 }
+ },
+ "J.png": {
+ "frame": { "x": 48, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "K.png": {
+ "frame": { "x": 60, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "KEY_ARROW_DOWN.png": {
+ "frame": { "x": 72, "y": 66, "w": 11, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
+ "sourceSize": { "w": 11, "h": 11 }
+ },
+ "KEY_ARROW_LEFT.png": {
+ "frame": { "x": 72, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "KEY_ARROW_RIGHT.png": {
+ "frame": { "x": 84, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "KEY_ARROW_UP.png": {
+ "frame": { "x": 94, "y": 66, "w": 11, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
+ "sourceSize": { "w": 11, "h": 11 }
+ },
+ "L.png": {
+ "frame": { "x": 96, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "LEFT_BRACKET.png": {
+ "frame": { "x": 127, "y": 66, "w": 10, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 10, "h": 11 },
+ "sourceSize": { "w": 10, "h": 11 }
+ },
+ "M.png": {
+ "frame": { "x": 108, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "MINUS.png": {
+ "frame": { "x": 105, "y": 66, "w": 11, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
+ "sourceSize": { "w": 11, "h": 11 }
+ },
+ "N.png": {
+ "frame": { "x": 120, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "O.png": {
+ "frame": { "x": 12, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "P.png": {
+ "frame": { "x": 132, "y": 44, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "PAGE_DOWN.png": {
+ "frame": { "x": 22, "y": 11, "w": 20, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 },
+ "sourceSize": { "w": 20, "h": 11 }
+ },
+ "PAGE_UP.png": {
+ "frame": { "x": 42, "y": 11, "w": 20, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 20, "h": 11 },
+ "sourceSize": { "w": 20, "h": 11 }
+ },
+ "PLUS.png": {
+ "frame": { "x": 116, "y": 66, "w": 11, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
+ "sourceSize": { "w": 11, "h": 11 }
+ },
+ "Q.png": {
+ "frame": { "x": 36, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "QUOTE.png": {
+ "frame": { "x": 83, "y": 66, "w": 11, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 11, "h": 11 },
+ "sourceSize": { "w": 11, "h": 11 }
+ },
+ "R.png": {
+ "frame": { "x": 48, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "RIGHT_BRACKET.png": {
+ "frame": { "x": 137, "y": 66, "w": 10, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 10, "h": 11 },
+ "sourceSize": { "w": 10, "h": 11 }
+ },
+ "S.png": {
+ "frame": { "x": 60, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "SEMICOLON.png": {
+ "frame": { "x": 72, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "SHIFT.png": {
+ "frame": { "x": 127, "y": 0, "w": 23, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 23, "h": 11 },
+ "sourceSize": { "w": 23, "h": 11 }
+ },
+ "SPACE.png": {
+ "frame": { "x": 55, "y": 0, "w": 25, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 25, "h": 11 },
+ "sourceSize": { "w": 25, "h": 11 }
+ },
+ "T.png": {
+ "frame": { "x": 108, "y": 55, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "TAB.png": {
+ "frame": { "x": 62, "y": 11, "w": 19, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 19, "h": 11 },
+ "sourceSize": { "w": 19, "h": 11 }
+ },
+ "TILDE.png": {
+ "frame": { "x": 63, "y": 22, "w": 15, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 15, "h": 11 },
+ "sourceSize": { "w": 15, "h": 11 }
+ },
+ "U.png": {
+ "frame": { "x": 0, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "V.png": {
+ "frame": { "x": 12, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "W.png": {
+ "frame": { "x": 24, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "X.png": {
+ "frame": { "x": 36, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "Y.png": {
+ "frame": { "x": 48, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "Z.png": {
+ "frame": { "x": 60, "y": 66, "w": 12, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 12, "h": 11 },
+ "sourceSize": { "w": 12, "h": 11 }
+ },
+ "ACTION.png": {
+ "frame": { "x": 0, "y": 0, "w": 28, "h": 11 },
+ "rotated": false,
+ "trimmed": true,
+ "spriteSourceSize": { "x": 0, "y": 0, "w": 28, "h": 11 },
+ "sourceSize": { "w": 28, "h": 11 }
+ }
+ },
+ "meta": {
+ "app": "https://www.aseprite.org/",
+ "version": "1.3.7-dev",
+ "image": "keyboard.png",
+ "format": "RGBA8888",
+ "size": { "w": 150, "h": 77 },
+ "scale": "1"
+ }
+}
diff --git a/public/images/inputs/keyboard.png b/public/images/inputs/keyboard.png
index 67b26af12de..e4d849be0fb 100644
Binary files a/public/images/inputs/keyboard.png and b/public/images/inputs/keyboard.png differ
diff --git a/public/images/items.json b/public/images/items.json
index c347790b92f..442b93d657b 100644
--- a/public/images/items.json
+++ b/public/images/items.json
@@ -4,8 +4,8 @@
"image": "items.png",
"format": "RGBA8888",
"size": {
- "w": 425,
- "h": 425
+ "w": 426,
+ "h": 426
},
"scale": 1,
"frames": [
@@ -240,6 +240,27 @@
"h": 31
}
},
+ {
+ "filename": "inverse",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 1,
+ "w": 22,
+ "h": 30
+ },
+ "frame": {
+ "x": 0,
+ "y": 241,
+ "w": 22,
+ "h": 30
+ }
+ },
{
"filename": "ribbon_gen3",
"rotated": false,
@@ -256,7 +277,7 @@
},
"frame": {
"x": 0,
- "y": 241,
+ "y": 271,
"w": 22,
"h": 29
}
@@ -277,7 +298,7 @@
},
"frame": {
"x": 0,
- "y": 270,
+ "y": 300,
"w": 22,
"h": 29
}
@@ -298,7 +319,7 @@
},
"frame": {
"x": 0,
- "y": 299,
+ "y": 329,
"w": 22,
"h": 29
}
@@ -340,7 +361,7 @@
},
"frame": {
"x": 0,
- "y": 328,
+ "y": 358,
"w": 22,
"h": 28
}
@@ -361,28 +382,7 @@
},
"frame": {
"x": 0,
- "y": 356,
- "w": 22,
- "h": 28
- }
- },
- {
- "filename": "ribbon_gen6",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 2,
- "w": 22,
- "h": 28
- },
- "frame": {
- "x": 0,
- "y": 384,
+ "y": 386,
"w": 22,
"h": 28
}
@@ -619,7 +619,7 @@
}
},
{
- "filename": "elixir",
+ "filename": "lock_capsule",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -628,15 +628,15 @@
},
"spriteSourceSize": {
"x": 7,
- "y": 4,
- "w": 18,
- "h": 24
+ "y": 5,
+ "w": 19,
+ "h": 22
},
"frame": {
"x": 407,
"y": 0,
- "w": 18,
- "h": 24
+ "w": 19,
+ "h": 22
}
},
{
@@ -724,7 +724,7 @@
}
},
{
- "filename": "ribbon_gen8",
+ "filename": "ribbon_gen6",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -744,6 +744,27 @@
"h": 28
}
},
+ {
+ "filename": "ribbon_gen8",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 2,
+ "w": 22,
+ "h": 28
+ },
+ "frame": {
+ "x": 22,
+ "y": 237,
+ "w": 22,
+ "h": 28
+ }
+ },
{
"filename": "black_augurite",
"rotated": false,
@@ -760,7 +781,7 @@
},
"frame": {
"x": 22,
- "y": 237,
+ "y": 265,
"w": 22,
"h": 25
}
@@ -781,7 +802,7 @@
},
"frame": {
"x": 22,
- "y": 262,
+ "y": 290,
"w": 23,
"h": 24
}
@@ -802,7 +823,7 @@
},
"frame": {
"x": 22,
- "y": 286,
+ "y": 314,
"w": 24,
"h": 24
}
@@ -823,7 +844,7 @@
},
"frame": {
"x": 22,
- "y": 310,
+ "y": 338,
"w": 24,
"h": 24
}
@@ -844,7 +865,7 @@
},
"frame": {
"x": 22,
- "y": 334,
+ "y": 362,
"w": 24,
"h": 24
}
@@ -865,13 +886,13 @@
},
"frame": {
"x": 22,
- "y": 358,
+ "y": 386,
"w": 24,
"h": 24
}
},
{
- "filename": "earth_plate",
+ "filename": "mega_bracelet",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -879,20 +900,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 16
},
"frame": {
"x": 22,
- "y": 382,
- "w": 24,
- "h": 24
+ "y": 410,
+ "w": 20,
+ "h": 16
}
},
{
- "filename": "coupon",
+ "filename": "relic_band",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -900,37 +921,16 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 23,
- "h": 19
+ "x": 7,
+ "y": 9,
+ "w": 17,
+ "h": 16
},
"frame": {
- "x": 22,
- "y": 406,
- "w": 23,
- "h": 19
- }
- },
- {
- "filename": "golden_mystic_ticket",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 23,
- "h": 19
- },
- "frame": {
- "x": 45,
- "y": 406,
- "w": 23,
- "h": 19
+ "x": 42,
+ "y": 410,
+ "w": 17,
+ "h": 16
}
},
{
@@ -955,7 +955,7 @@
}
},
{
- "filename": "mega_bracelet",
+ "filename": "abomasite",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -963,20 +963,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 6,
+ "x": 8,
"y": 8,
- "w": 20,
+ "w": 16,
"h": 16
},
"frame": {
"x": 28,
"y": 70,
- "w": 20,
+ "w": 16,
"h": 16
}
},
{
- "filename": "calcium",
+ "filename": "absolite",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -985,36 +985,15 @@
},
"spriteSourceSize": {
"x": 8,
- "y": 4,
+ "y": 8,
"w": 16,
- "h": 24
+ "h": 16
},
"frame": {
- "x": 39,
- "y": 86,
+ "x": 44,
+ "y": 70,
"w": 16,
- "h": 24
- }
- },
- {
- "filename": "carbos",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 16,
- "h": 24
- },
- "frame": {
- "x": 39,
- "y": 110,
- "w": 16,
- "h": 24
+ "h": 16
}
},
{
@@ -1033,11 +1012,32 @@
},
"frame": {
"x": 39,
- "y": 134,
+ "y": 86,
"w": 21,
"h": 24
}
},
+ {
+ "filename": "earth_plate",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 39,
+ "y": 110,
+ "w": 24,
+ "h": 24
+ }
+ },
{
"filename": "fist_plate",
"rotated": false,
@@ -1054,7 +1054,7 @@
},
"frame": {
"x": 39,
- "y": 158,
+ "y": 134,
"w": 24,
"h": 24
}
@@ -1075,7 +1075,7 @@
},
"frame": {
"x": 39,
- "y": 182,
+ "y": 158,
"w": 24,
"h": 24
}
@@ -1095,8 +1095,8 @@
"h": 24
},
"frame": {
- "x": 44,
- "y": 206,
+ "x": 39,
+ "y": 182,
"w": 24,
"h": 24
}
@@ -1117,7 +1117,7 @@
},
"frame": {
"x": 44,
- "y": 230,
+ "y": 206,
"w": 24,
"h": 24
}
@@ -1137,8 +1137,8 @@
"h": 24
},
"frame": {
- "x": 45,
- "y": 254,
+ "x": 44,
+ "y": 230,
"w": 24,
"h": 24
}
@@ -1158,8 +1158,8 @@
"h": 24
},
"frame": {
- "x": 46,
- "y": 278,
+ "x": 44,
+ "y": 254,
"w": 24,
"h": 24
}
@@ -1179,8 +1179,8 @@
"h": 24
},
"frame": {
- "x": 46,
- "y": 302,
+ "x": 45,
+ "y": 278,
"w": 24,
"h": 24
}
@@ -1201,7 +1201,7 @@
},
"frame": {
"x": 46,
- "y": 326,
+ "y": 302,
"w": 24,
"h": 24
}
@@ -1222,7 +1222,7 @@
},
"frame": {
"x": 46,
- "y": 350,
+ "y": 326,
"w": 24,
"h": 24
}
@@ -1243,137 +1243,11 @@
},
"frame": {
"x": 46,
- "y": 374,
+ "y": 350,
"w": 24,
"h": 24
}
},
- {
- "filename": "abomasite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
- },
- "frame": {
- "x": 48,
- "y": 70,
- "w": 16,
- "h": 16
- }
- },
- {
- "filename": "ether",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 4,
- "w": 18,
- "h": 24
- },
- "frame": {
- "x": 55,
- "y": 86,
- "w": 18,
- "h": 24
- }
- },
- {
- "filename": "full_restore",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 4,
- "w": 18,
- "h": 24
- },
- "frame": {
- "x": 55,
- "y": 110,
- "w": 18,
- "h": 24
- }
- },
- {
- "filename": "hp_up",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 16,
- "h": 24
- },
- "frame": {
- "x": 60,
- "y": 134,
- "w": 16,
- "h": 24
- }
- },
- {
- "filename": "iron",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 16,
- "h": 24
- },
- "frame": {
- "x": 63,
- "y": 158,
- "w": 16,
- "h": 24
- }
- },
- {
- "filename": "kings_rock",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 23,
- "h": 24
- },
- "frame": {
- "x": 63,
- "y": 182,
- "w": 23,
- "h": 24
- }
- },
{
"filename": "lucky_punch_great",
"rotated": false,
@@ -1389,180 +1263,12 @@
"h": 24
},
"frame": {
- "x": 68,
- "y": 206,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "lucky_punch_master",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 68,
- "y": 230,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "lucky_punch_ultra",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 69,
- "y": 254,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "lustrous_globe",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 70,
- "y": 278,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "meadow_plate",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 70,
- "y": 302,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "mind_plate",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 70,
- "y": 326,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "muscle_band",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 70,
- "y": 350,
- "w": 24,
- "h": 24
- }
- },
- {
- "filename": "pixie_plate",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 70,
+ "x": 46,
"y": 374,
"w": 24,
"h": 24
}
},
- {
- "filename": "salac_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 24,
- "h": 24
- },
- "frame": {
- "x": 68,
- "y": 398,
- "w": 24,
- "h": 24
- }
- },
{
"filename": "ability_capsule",
"rotated": false,
@@ -1585,7 +1291,7 @@
}
},
{
- "filename": "lure",
+ "filename": "calcium",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1595,39 +1301,18 @@
"spriteSourceSize": {
"x": 8,
"y": 4,
- "w": 17,
- "h": 24
- },
- "frame": {
- "x": 92,
- "y": 398,
- "w": 17,
- "h": 24
- }
- },
- {
- "filename": "max_elixir",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 4,
- "w": 18,
+ "w": 16,
"h": 24
},
"frame": {
"x": 59,
"y": 27,
- "w": 18,
+ "w": 16,
"h": 24
}
},
{
- "filename": "scanner",
+ "filename": "lucky_punch_master",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1641,14 +1326,14 @@
"h": 24
},
"frame": {
- "x": 77,
+ "x": 75,
"y": 26,
"w": 24,
"h": 24
}
},
{
- "filename": "silk_scarf",
+ "filename": "lucky_punch_ultra",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1662,12 +1347,33 @@
"h": 24
},
"frame": {
- "x": 101,
+ "x": 99,
"y": 26,
"w": 24,
"h": 24
}
},
+ {
+ "filename": "revive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 10,
+ "y": 8,
+ "w": 12,
+ "h": 17
+ },
+ "frame": {
+ "x": 123,
+ "y": 26,
+ "w": 12,
+ "h": 17
+ }
+ },
{
"filename": "big_mushroom",
"rotated": false,
@@ -1710,6 +1416,69 @@
"h": 23
}
},
+ {
+ "filename": "elixir",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 4,
+ "w": 18,
+ "h": 24
+ },
+ "frame": {
+ "x": 60,
+ "y": 70,
+ "w": 18,
+ "h": 24
+ }
+ },
+ {
+ "filename": "coin_case",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 24,
+ "h": 23
+ },
+ "frame": {
+ "x": 78,
+ "y": 73,
+ "w": 24,
+ "h": 23
+ }
+ },
+ {
+ "filename": "kings_rock",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 23,
+ "h": 24
+ },
+ "frame": {
+ "x": 102,
+ "y": 50,
+ "w": 23,
+ "h": 24
+ }
+ },
{
"filename": "berry_pouch",
"rotated": false,
@@ -1726,11 +1495,284 @@
},
"frame": {
"x": 102,
- "y": 50,
+ "y": 74,
"w": 23,
"h": 23
}
},
+ {
+ "filename": "aerodactylite",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 8,
+ "w": 16,
+ "h": 16
+ },
+ "frame": {
+ "x": 60,
+ "y": 94,
+ "w": 16,
+ "h": 16
+ }
+ },
+ {
+ "filename": "carbos",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 16,
+ "h": 24
+ },
+ "frame": {
+ "x": 63,
+ "y": 110,
+ "w": 16,
+ "h": 24
+ }
+ },
+ {
+ "filename": "ether",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 4,
+ "w": 18,
+ "h": 24
+ },
+ "frame": {
+ "x": 63,
+ "y": 134,
+ "w": 18,
+ "h": 24
+ }
+ },
+ {
+ "filename": "full_restore",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 4,
+ "w": 18,
+ "h": 24
+ },
+ "frame": {
+ "x": 63,
+ "y": 158,
+ "w": 18,
+ "h": 24
+ }
+ },
+ {
+ "filename": "lustrous_globe",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 63,
+ "y": 182,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "max_revive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 22,
+ "h": 24
+ },
+ "frame": {
+ "x": 68,
+ "y": 206,
+ "w": 22,
+ "h": 24
+ }
+ },
+ {
+ "filename": "meadow_plate",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 68,
+ "y": 230,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "mind_plate",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 68,
+ "y": 254,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "muscle_band",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 69,
+ "y": 278,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "pixie_plate",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 70,
+ "y": 302,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "salac_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 70,
+ "y": 326,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "scanner",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 70,
+ "y": 350,
+ "w": 24,
+ "h": 24
+ }
+ },
+ {
+ "filename": "silk_scarf",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 24,
+ "h": 24
+ },
+ "frame": {
+ "x": 70,
+ "y": 374,
+ "w": 24,
+ "h": 24
+ }
+ },
{
"filename": "sky_plate",
"rotated": false,
@@ -1746,14 +1788,14 @@
"h": 24
},
"frame": {
- "x": 125,
- "y": 36,
+ "x": 59,
+ "y": 398,
"w": 24,
"h": 24
}
},
{
- "filename": "choice_specs",
+ "filename": "hp_up",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1761,41 +1803,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 24,
- "h": 18
- },
- "frame": {
- "x": 125,
- "y": 60,
- "w": 24,
- "h": 18
- }
- },
- {
- "filename": "max_ether",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
+ "x": 8,
"y": 4,
- "w": 18,
+ "w": 16,
"h": 24
},
"frame": {
- "x": 149,
- "y": 36,
- "w": 18,
+ "x": 83,
+ "y": 398,
+ "w": 16,
"h": 24
}
},
{
- "filename": "adamant_crystal",
+ "filename": "reveal_glass",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1804,15 +1825,36 @@
},
"spriteSourceSize": {
"x": 4,
- "y": 6,
+ "y": 4,
"w": 23,
- "h": 21
+ "h": 24
},
"frame": {
- "x": 149,
- "y": 60,
+ "x": 79,
+ "y": 96,
"w": 23,
- "h": 21
+ "h": 24
+ }
+ },
+ {
+ "filename": "dynamax_band",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 4,
+ "w": 23,
+ "h": 23
+ },
+ "frame": {
+ "x": 102,
+ "y": 97,
+ "w": 23,
+ "h": 23
}
},
{
@@ -1830,8 +1872,8 @@
"h": 24
},
"frame": {
- "x": 167,
- "y": 21,
+ "x": 81,
+ "y": 120,
"w": 24,
"h": 24
}
@@ -1851,12 +1893,54 @@
"h": 24
},
"frame": {
- "x": 191,
- "y": 21,
+ "x": 81,
+ "y": 144,
"w": 24,
"h": 24
}
},
+ {
+ "filename": "oval_charm",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 21,
+ "h": 24
+ },
+ "frame": {
+ "x": 105,
+ "y": 120,
+ "w": 21,
+ "h": 24
+ }
+ },
+ {
+ "filename": "shiny_charm",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 21,
+ "h": 24
+ },
+ "frame": {
+ "x": 105,
+ "y": 144,
+ "w": 21,
+ "h": 24
+ }
+ },
{
"filename": "stone_plate",
"rotated": false,
@@ -1872,12 +1956,33 @@
"h": 24
},
"frame": {
- "x": 215,
- "y": 21,
+ "x": 87,
+ "y": 168,
"w": 24,
"h": 24
}
},
+ {
+ "filename": "iron",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 16,
+ "h": 24
+ },
+ "frame": {
+ "x": 111,
+ "y": 168,
+ "w": 16,
+ "h": 24
+ }
+ },
{
"filename": "sun_stone",
"rotated": false,
@@ -1893,12 +1998,33 @@
"h": 24
},
"frame": {
- "x": 239,
- "y": 21,
+ "x": 90,
+ "y": 192,
"w": 24,
"h": 24
}
},
+ {
+ "filename": "lure",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 17,
+ "h": 24
+ },
+ "frame": {
+ "x": 114,
+ "y": 192,
+ "w": 17,
+ "h": 24
+ }
+ },
{
"filename": "toxic_plate",
"rotated": false,
@@ -1914,8 +2040,8 @@
"h": 24
},
"frame": {
- "x": 263,
- "y": 21,
+ "x": 92,
+ "y": 216,
"w": 24,
"h": 24
}
@@ -1935,14 +2061,14 @@
"h": 24
},
"frame": {
- "x": 287,
- "y": 21,
+ "x": 92,
+ "y": 240,
"w": 24,
"h": 24
}
},
{
- "filename": "silver_powder",
+ "filename": "max_elixir",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1950,41 +2076,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 11,
- "w": 24,
- "h": 15
- },
- "frame": {
- "x": 167,
- "y": 45,
- "w": 24,
- "h": 15
- }
- },
- {
- "filename": "max_revive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
+ "x": 7,
"y": 4,
- "w": 22,
+ "w": 18,
"h": 24
},
"frame": {
- "x": 311,
- "y": 21,
- "w": 22,
+ "x": 116,
+ "y": 216,
+ "w": 18,
"h": 24
}
},
{
- "filename": "coin_case",
+ "filename": "max_ether",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -1992,16 +2097,16 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 24,
- "h": 23
+ "x": 7,
+ "y": 4,
+ "w": 18,
+ "h": 24
},
"frame": {
- "x": 333,
- "y": 20,
- "w": 24,
- "h": 23
+ "x": 116,
+ "y": 240,
+ "w": 18,
+ "h": 24
}
},
{
@@ -2019,12 +2124,75 @@
"h": 23
},
"frame": {
- "x": 357,
- "y": 20,
+ "x": 93,
+ "y": 264,
"w": 24,
"h": 23
}
},
+ {
+ "filename": "black_belt",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 117,
+ "y": 264,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "silver_powder",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 11,
+ "w": 24,
+ "h": 15
+ },
+ "frame": {
+ "x": 93,
+ "y": 287,
+ "w": 24,
+ "h": 15
+ }
+ },
+ {
+ "filename": "griseous_core",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 23,
+ "h": 23
+ },
+ "frame": {
+ "x": 94,
+ "y": 302,
+ "w": 23,
+ "h": 23
+ }
+ },
{
"filename": "hearthflame_mask",
"rotated": false,
@@ -2040,138 +2208,12 @@
"h": 23
},
"frame": {
- "x": 381,
- "y": 20,
+ "x": 94,
+ "y": 325,
"w": 24,
"h": 23
}
},
- {
- "filename": "red_orb",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 20,
- "h": 24
- },
- "frame": {
- "x": 405,
- "y": 24,
- "w": 20,
- "h": 24
- }
- },
- {
- "filename": "amulet_coin",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 23,
- "h": 21
- },
- "frame": {
- "x": 172,
- "y": 60,
- "w": 23,
- "h": 21
- }
- },
- {
- "filename": "candy_overlay",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 12,
- "w": 16,
- "h": 15
- },
- "frame": {
- "x": 191,
- "y": 45,
- "w": 16,
- "h": 15
- }
- },
- {
- "filename": "dragon_scale",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 24,
- "h": 18
- },
- "frame": {
- "x": 207,
- "y": 45,
- "w": 24,
- "h": 18
- }
- },
- {
- "filename": "exp_balance",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 24,
- "h": 22
- },
- "frame": {
- "x": 231,
- "y": 45,
- "w": 24,
- "h": 22
- }
- },
- {
- "filename": "exp_share",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 24,
- "h": 22
- },
- "frame": {
- "x": 255,
- "y": 45,
- "w": 24,
- "h": 22
- }
- },
{
"filename": "leppa_berry",
"rotated": false,
@@ -2187,8 +2229,8 @@
"h": 23
},
"frame": {
- "x": 279,
- "y": 45,
+ "x": 94,
+ "y": 348,
"w": 24,
"h": 23
}
@@ -2208,264 +2250,12 @@
"h": 23
},
"frame": {
- "x": 303,
- "y": 45,
+ "x": 94,
+ "y": 371,
"w": 24,
"h": 23
}
},
- {
- "filename": "revive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 10,
- "y": 8,
- "w": 12,
- "h": 17
- },
- "frame": {
- "x": 195,
- "y": 60,
- "w": 12,
- "h": 17
- }
- },
- {
- "filename": "icy_reins_of_unity",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 207,
- "y": 63,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "metal_powder",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 6,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 231,
- "y": 67,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "peat_block",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 24,
- "h": 22
- },
- "frame": {
- "x": 255,
- "y": 67,
- "w": 24,
- "h": 22
- }
- },
- {
- "filename": "twisted_spoon",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 24,
- "h": 23
- },
- "frame": {
- "x": 279,
- "y": 68,
- "w": 24,
- "h": 23
- }
- },
- {
- "filename": "dynamax_band",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 23,
- "h": 23
- },
- "frame": {
- "x": 303,
- "y": 68,
- "w": 23,
- "h": 23
- }
- },
- {
- "filename": "black_belt",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 327,
- "y": 45,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "griseous_core",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 23,
- "h": 23
- },
- "frame": {
- "x": 326,
- "y": 68,
- "w": 23,
- "h": 23
- }
- },
- {
- "filename": "reveal_glass",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 4,
- "w": 23,
- "h": 24
- },
- "frame": {
- "x": 349,
- "y": 43,
- "w": 23,
- "h": 24
- }
- },
- {
- "filename": "leek",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 23,
- "h": 23
- },
- "frame": {
- "x": 372,
- "y": 43,
- "w": 23,
- "h": 23
- }
- },
- {
- "filename": "rare_candy",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 23,
- "h": 23
- },
- "frame": {
- "x": 349,
- "y": 67,
- "w": 23,
- "h": 23
- }
- },
- {
- "filename": "rarer_candy",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 23,
- "h": 23
- },
- "frame": {
- "x": 372,
- "y": 66,
- "w": 23,
- "h": 23
- }
- },
{
"filename": "bug_tera_shard",
"rotated": false,
@@ -2481,14 +2271,98 @@
"h": 23
},
"frame": {
- "x": 395,
- "y": 48,
+ "x": 117,
+ "y": 287,
"w": 22,
"h": 23
}
},
{
- "filename": "auspicious_armor",
+ "filename": "red_orb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 20,
+ "h": 24
+ },
+ "frame": {
+ "x": 99,
+ "y": 394,
+ "w": 20,
+ "h": 24
+ }
+ },
+ {
+ "filename": "candy_overlay",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 12,
+ "w": 16,
+ "h": 15
+ },
+ "frame": {
+ "x": 117,
+ "y": 310,
+ "w": 16,
+ "h": 15
+ }
+ },
+ {
+ "filename": "max_lure",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 17,
+ "h": 24
+ },
+ "frame": {
+ "x": 118,
+ "y": 325,
+ "w": 17,
+ "h": 24
+ }
+ },
+ {
+ "filename": "max_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 4,
+ "w": 18,
+ "h": 24
+ },
+ "frame": {
+ "x": 118,
+ "y": 349,
+ "w": 18,
+ "h": 24
+ }
+ },
+ {
+ "filename": "adamant_crystal",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -2497,78 +2371,15 @@
},
"spriteSourceSize": {
"x": 4,
- "y": 5,
- "w": 23,
- "h": 21
- },
- "frame": {
- "x": 395,
- "y": 71,
- "w": 23,
- "h": 21
- }
- },
- {
- "filename": "binding_band",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
"y": 6,
"w": 23,
- "h": 20
+ "h": 21
},
"frame": {
- "x": 372,
- "y": 89,
+ "x": 118,
+ "y": 373,
"w": 23,
- "h": 20
- }
- },
- {
- "filename": "healing_charm",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 23,
- "h": 22
- },
- "frame": {
- "x": 349,
- "y": 90,
- "w": 23,
- "h": 22
- }
- },
- {
- "filename": "black_glasses",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
- },
- "frame": {
- "x": 395,
- "y": 92,
- "w": 23,
- "h": 17
+ "h": 21
}
},
{
@@ -2586,12 +2397,96 @@
"h": 23
},
"frame": {
- "x": 73,
- "y": 73,
+ "x": 119,
+ "y": 394,
"w": 22,
"h": 23
}
},
+ {
+ "filename": "choice_specs",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 24,
+ "h": 18
+ },
+ "frame": {
+ "x": 135,
+ "y": 36,
+ "w": 24,
+ "h": 18
+ }
+ },
+ {
+ "filename": "twisted_spoon",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 24,
+ "h": 23
+ },
+ "frame": {
+ "x": 125,
+ "y": 54,
+ "w": 24,
+ "h": 23
+ }
+ },
+ {
+ "filename": "exp_balance",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 24,
+ "h": 22
+ },
+ "frame": {
+ "x": 125,
+ "y": 77,
+ "w": 24,
+ "h": 22
+ }
+ },
+ {
+ "filename": "amulet_coin",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 5,
+ "w": 23,
+ "h": 21
+ },
+ "frame": {
+ "x": 125,
+ "y": 99,
+ "w": 23,
+ "h": 21
+ }
+ },
{
"filename": "dragon_tera_shard",
"rotated": false,
@@ -2607,8 +2502,8 @@
"h": 23
},
"frame": {
- "x": 95,
- "y": 73,
+ "x": 126,
+ "y": 120,
"w": 22,
"h": 23
}
@@ -2628,56 +2523,14 @@
"h": 23
},
"frame": {
- "x": 73,
- "y": 96,
+ "x": 126,
+ "y": 143,
"w": 22,
"h": 23
}
},
{
- "filename": "fairy_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 95,
- "y": 96,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "fighting_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 117,
- "y": 78,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "blank_memory",
+ "filename": "dragon_fang",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -2687,102 +2540,18 @@
"spriteSourceSize": {
"x": 5,
"y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 117,
- "y": 101,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "fire_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
+ "w": 21,
"h": 23
},
"frame": {
- "x": 139,
- "y": 81,
- "w": 22,
+ "x": 127,
+ "y": 166,
+ "w": 21,
"h": 23
}
},
{
- "filename": "fire_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 161,
- "y": 81,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "quick_powder",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 6,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 139,
- "y": 104,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "big_nugget",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 20,
- "h": 20
- },
- "frame": {
- "x": 163,
- "y": 104,
- "w": 20,
- "h": 20
- }
- },
- {
- "filename": "max_lure",
+ "filename": "super_lure",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -2796,348 +2565,12 @@
"h": 24
},
"frame": {
- "x": 183,
- "y": 81,
+ "x": 131,
+ "y": 189,
"w": 17,
"h": 24
}
},
- {
- "filename": "rusted_sword",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 23,
- "h": 22
- },
- "frame": {
- "x": 200,
- "y": 83,
- "w": 23,
- "h": 22
- }
- },
- {
- "filename": "rusted_shield",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 6,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 183,
- "y": 105,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "apicot_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 19,
- "h": 20
- },
- "frame": {
- "x": 207,
- "y": 105,
- "w": 19,
- "h": 20
- }
- },
- {
- "filename": "relic_crown",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 23,
- "h": 18
- },
- "frame": {
- "x": 223,
- "y": 87,
- "w": 23,
- "h": 18
- }
- },
- {
- "filename": "blue_orb",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 20,
- "h": 20
- },
- "frame": {
- "x": 226,
- "y": 105,
- "w": 20,
- "h": 20
- }
- },
- {
- "filename": "flying_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 246,
- "y": 89,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "blunder_policy",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 19
- },
- "frame": {
- "x": 246,
- "y": 112,
- "w": 22,
- "h": 19
- }
- },
- {
- "filename": "focus_sash",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 268,
- "y": 91,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "ghost_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 290,
- "y": 91,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "grass_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 312,
- "y": 91,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "full_heal",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 9,
- "y": 4,
- "w": 15,
- "h": 23
- },
- "frame": {
- "x": 334,
- "y": 91,
- "w": 15,
- "h": 23
- }
- },
- {
- "filename": "sacred_ash",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 268,
- "y": 114,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "shadow_reins_of_unity",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 292,
- "y": 114,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "soft_sand",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 24,
- "h": 20
- },
- "frame": {
- "x": 316,
- "y": 114,
- "w": 24,
- "h": 20
- }
- },
- {
- "filename": "eviolite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 15,
- "h": 15
- },
- "frame": {
- "x": 73,
- "y": 119,
- "w": 15,
- "h": 15
- }
- },
- {
- "filename": "max_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 4,
- "w": 18,
- "h": 24
- },
- "frame": {
- "x": 76,
- "y": 134,
- "w": 18,
- "h": 24
- }
- },
{
"filename": "max_repel",
"rotated": false,
@@ -3153,33 +2586,12 @@
"h": 24
},
"frame": {
- "x": 79,
- "y": 158,
+ "x": 134,
+ "y": 213,
"w": 16,
"h": 24
}
},
- {
- "filename": "oval_charm",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 21,
- "h": 24
- },
- "frame": {
- "x": 86,
- "y": 182,
- "w": 21,
- "h": 24
- }
- },
{
"filename": "pp_max",
"rotated": false,
@@ -3195,8 +2607,8 @@
"h": 24
},
"frame": {
- "x": 92,
- "y": 206,
+ "x": 134,
+ "y": 237,
"w": 16,
"h": 24
}
@@ -3216,12 +2628,180 @@
"h": 24
},
"frame": {
- "x": 92,
- "y": 230,
+ "x": 149,
+ "y": 54,
"w": 16,
"h": 24
}
},
+ {
+ "filename": "auspicious_armor",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 23,
+ "h": 21
+ },
+ "frame": {
+ "x": 149,
+ "y": 78,
+ "w": 23,
+ "h": 21
+ }
+ },
+ {
+ "filename": "exp_share",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 24,
+ "h": 22
+ },
+ "frame": {
+ "x": 148,
+ "y": 99,
+ "w": 24,
+ "h": 22
+ }
+ },
+ {
+ "filename": "leek",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 23,
+ "h": 23
+ },
+ "frame": {
+ "x": 148,
+ "y": 121,
+ "w": 23,
+ "h": 23
+ }
+ },
+ {
+ "filename": "rare_candy",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 23,
+ "h": 23
+ },
+ "frame": {
+ "x": 148,
+ "y": 144,
+ "w": 23,
+ "h": 23
+ }
+ },
+ {
+ "filename": "rarer_candy",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 5,
+ "w": 23,
+ "h": 23
+ },
+ "frame": {
+ "x": 148,
+ "y": 167,
+ "w": 23,
+ "h": 23
+ }
+ },
+ {
+ "filename": "fairy_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 148,
+ "y": 190,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "fighting_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 150,
+ "y": 213,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "fire_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 150,
+ "y": 236,
+ "w": 22,
+ "h": 23
+ }
+ },
{
"filename": "protein",
"rotated": false,
@@ -3237,8 +2817,8 @@
"h": 24
},
"frame": {
- "x": 93,
- "y": 254,
+ "x": 139,
+ "y": 261,
"w": 16,
"h": 24
}
@@ -3258,56 +2838,14 @@
"h": 24
},
"frame": {
- "x": 94,
- "y": 278,
+ "x": 139,
+ "y": 285,
"w": 16,
"h": 24
}
},
{
- "filename": "shiny_charm",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 21,
- "h": 24
- },
- "frame": {
- "x": 94,
- "y": 302,
- "w": 21,
- "h": 24
- }
- },
- {
- "filename": "dragon_fang",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 21,
- "h": 23
- },
- "frame": {
- "x": 94,
- "y": 326,
- "w": 21,
- "h": 23
- }
- },
- {
- "filename": "ground_tera_shard",
+ "filename": "fire_tera_shard",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3321,14 +2859,14 @@
"h": 23
},
"frame": {
- "x": 94,
- "y": 349,
+ "x": 155,
+ "y": 259,
"w": 22,
"h": 23
}
},
{
- "filename": "ice_tera_shard",
+ "filename": "flying_tera_shard",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3342,54 +2880,12 @@
"h": 23
},
"frame": {
- "x": 94,
- "y": 372,
+ "x": 155,
+ "y": 282,
"w": 22,
"h": 23
}
},
- {
- "filename": "prism_scale",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 9,
- "y": 8,
- "w": 15,
- "h": 15
- },
- "frame": {
- "x": 88,
- "y": 119,
- "w": 15,
- "h": 15
- }
- },
- {
- "filename": "super_lure",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 17,
- "h": 24
- },
- "frame": {
- "x": 94,
- "y": 134,
- "w": 17,
- "h": 24
- }
- },
{
"filename": "super_repel",
"rotated": false,
@@ -3405,14 +2901,14 @@
"h": 24
},
"frame": {
- "x": 95,
- "y": 158,
+ "x": 159,
+ "y": 22,
"w": 16,
"h": 24
}
},
{
- "filename": "berry_pot",
+ "filename": "peat_block",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3420,41 +2916,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 7,
+ "x": 4,
"y": 5,
- "w": 18,
+ "w": 24,
"h": 22
},
"frame": {
- "x": 340,
- "y": 114,
- "w": 18,
+ "x": 175,
+ "y": 21,
+ "w": 24,
"h": 22
}
},
{
- "filename": "unknown",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 16,
- "h": 24
- },
- "frame": {
- "x": 358,
- "y": 112,
- "w": 16,
- "h": 24
- }
- },
- {
- "filename": "never_melt_ice",
+ "filename": "healing_charm",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3464,18 +2939,18 @@
"spriteSourceSize": {
"x": 5,
"y": 5,
- "w": 22,
- "h": 23
+ "w": 23,
+ "h": 22
},
"frame": {
- "x": 374,
- "y": 109,
- "w": 22,
- "h": 23
+ "x": 199,
+ "y": 21,
+ "w": 23,
+ "h": 22
}
},
{
- "filename": "normal_tera_shard",
+ "filename": "rusted_sword",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3483,289 +2958,16 @@
"h": 32
},
"spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 396,
- "y": 109,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "zinc",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 4,
- "w": 16,
- "h": 24
- },
- "frame": {
- "x": 107,
- "y": 182,
- "w": 16,
- "h": 24
- }
- },
- {
- "filename": "hyper_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
+ "x": 4,
"y": 5,
- "w": 17,
- "h": 23
+ "w": 23,
+ "h": 22
},
"frame": {
- "x": 108,
- "y": 206,
- "w": 17,
- "h": 23
- }
- },
- {
- "filename": "lansat_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 21,
- "h": 23
- },
- "frame": {
- "x": 108,
- "y": 229,
- "w": 21,
- "h": 23
- }
- },
- {
- "filename": "leaf_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 21,
- "h": 23
- },
- "frame": {
- "x": 109,
- "y": 252,
- "w": 21,
- "h": 23
- }
- },
- {
- "filename": "mystic_water",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 20,
- "h": 23
- },
- "frame": {
- "x": 110,
- "y": 275,
- "w": 20,
- "h": 23
- }
- },
- {
- "filename": "petaya_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 115,
- "y": 298,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "poison_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 115,
- "y": 321,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "psychic_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 116,
- "y": 344,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "reaper_cloth",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 116,
- "y": 367,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "rock_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 111,
- "y": 123,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "steel_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 111,
- "y": 146,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "stellar_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 133,
- "y": 124,
- "w": 22,
- "h": 23
- }
- },
- {
- "filename": "water_tera_shard",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 155,
- "y": 124,
- "w": 22,
- "h": 23
+ "x": 222,
+ "y": 21,
+ "w": 23,
+ "h": 22
}
},
{
@@ -3783,8 +2985,8 @@
"h": 22
},
"frame": {
- "x": 133,
- "y": 147,
+ "x": 245,
+ "y": 21,
"w": 22,
"h": 22
}
@@ -3804,33 +3006,12 @@
"h": 22
},
"frame": {
- "x": 155,
- "y": 147,
+ "x": 267,
+ "y": 21,
"w": 22,
"h": 22
}
},
- {
- "filename": "wide_lens",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 22,
- "h": 23
- },
- "frame": {
- "x": 177,
- "y": 125,
- "w": 22,
- "h": 23
- }
- },
{
"filename": "dark_memory",
"rotated": false,
@@ -3846,8 +3027,8 @@
"h": 22
},
"frame": {
- "x": 199,
- "y": 125,
+ "x": 289,
+ "y": 21,
"w": 22,
"h": 22
}
@@ -3867,14 +3048,245 @@
"h": 22
},
"frame": {
- "x": 221,
- "y": 125,
+ "x": 311,
+ "y": 21,
"w": 22,
"h": 22
}
},
{
- "filename": "deep_sea_tooth",
+ "filename": "focus_sash",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 333,
+ "y": 20,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "ghost_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 355,
+ "y": 20,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "grass_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 377,
+ "y": 20,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "icy_reins_of_unity",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 399,
+ "y": 22,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "dragon_scale",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 24,
+ "h": 18
+ },
+ "frame": {
+ "x": 175,
+ "y": 43,
+ "w": 24,
+ "h": 18
+ }
+ },
+ {
+ "filename": "metal_powder",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 6,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 199,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "quick_powder",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 6,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 223,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "rusted_shield",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 6,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 247,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "sacred_ash",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 271,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "shadow_reins_of_unity",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 295,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "soft_sand",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 24,
+ "h": 20
+ },
+ "frame": {
+ "x": 319,
+ "y": 43,
+ "w": 24,
+ "h": 20
+ }
+ },
+ {
+ "filename": "binding_band",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -3884,77 +3296,14 @@
"spriteSourceSize": {
"x": 5,
"y": 6,
- "w": 22,
- "h": 21
+ "w": 23,
+ "h": 20
},
"frame": {
- "x": 177,
- "y": 148,
- "w": 22,
- "h": 21
- }
- },
- {
- "filename": "dna_splicers",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 199,
- "y": 147,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "dragon_memory",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 221,
- "y": 147,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "electirizer",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 243,
- "y": 131,
- "w": 22,
- "h": 22
+ "x": 343,
+ "y": 43,
+ "w": 23,
+ "h": 20
}
},
{
@@ -3972,12 +3321,558 @@
"h": 21
},
"frame": {
- "x": 265,
- "y": 134,
+ "x": 366,
+ "y": 43,
"w": 23,
"h": 21
}
},
+ {
+ "filename": "black_glasses",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
+ },
+ "frame": {
+ "x": 165,
+ "y": 61,
+ "w": 23,
+ "h": 17
+ }
+ },
+ {
+ "filename": "unknown",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 16,
+ "h": 24
+ },
+ "frame": {
+ "x": 172,
+ "y": 78,
+ "w": 16,
+ "h": 24
+ }
+ },
+ {
+ "filename": "apicot_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 19,
+ "h": 20
+ },
+ "frame": {
+ "x": 172,
+ "y": 102,
+ "w": 19,
+ "h": 20
+ }
+ },
+ {
+ "filename": "ground_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 171,
+ "y": 122,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "ice_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 171,
+ "y": 145,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "dna_splicers",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 171,
+ "y": 168,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "never_melt_ice",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 170,
+ "y": 190,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "lansat_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 21,
+ "h": 23
+ },
+ "frame": {
+ "x": 172,
+ "y": 213,
+ "w": 21,
+ "h": 23
+ }
+ },
+ {
+ "filename": "leaf_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 21,
+ "h": 23
+ },
+ "frame": {
+ "x": 172,
+ "y": 236,
+ "w": 21,
+ "h": 23
+ }
+ },
+ {
+ "filename": "zinc",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 4,
+ "w": 16,
+ "h": 24
+ },
+ "frame": {
+ "x": 177,
+ "y": 259,
+ "w": 16,
+ "h": 24
+ }
+ },
+ {
+ "filename": "berry_pot",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 5,
+ "w": 18,
+ "h": 22
+ },
+ "frame": {
+ "x": 177,
+ "y": 283,
+ "w": 18,
+ "h": 22
+ }
+ },
+ {
+ "filename": "normal_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 188,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "petaya_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 210,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "poison_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 232,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "psychic_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 254,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "reaper_cloth",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 276,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "rock_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 298,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "steel_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 320,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "stellar_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 342,
+ "y": 63,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "dragon_memory",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 364,
+ "y": 64,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "aggronite",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 8,
+ "w": 16,
+ "h": 16
+ },
+ "frame": {
+ "x": 188,
+ "y": 86,
+ "w": 16,
+ "h": 16
+ }
+ },
+ {
+ "filename": "burn_drive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
+ },
+ "frame": {
+ "x": 204,
+ "y": 86,
+ "w": 23,
+ "h": 17
+ }
+ },
+ {
+ "filename": "chill_drive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
+ },
+ "frame": {
+ "x": 227,
+ "y": 86,
+ "w": 23,
+ "h": 17
+ }
+ },
+ {
+ "filename": "coupon",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 23,
+ "h": 19
+ },
+ "frame": {
+ "x": 250,
+ "y": 86,
+ "w": 23,
+ "h": 19
+ }
+ },
+ {
+ "filename": "golden_mystic_ticket",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 23,
+ "h": 19
+ },
+ "frame": {
+ "x": 273,
+ "y": 86,
+ "w": 23,
+ "h": 19
+ }
+ },
+ {
+ "filename": "mystic_ticket",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 23,
+ "h": 19
+ },
+ "frame": {
+ "x": 296,
+ "y": 86,
+ "w": 23,
+ "h": 19
+ }
+ },
{
"filename": "n_lunarizer",
"rotated": false,
@@ -3993,8 +3888,8 @@
"h": 21
},
"frame": {
- "x": 288,
- "y": 134,
+ "x": 319,
+ "y": 86,
"w": 23,
"h": 21
}
@@ -4014,14 +3909,14 @@
"h": 21
},
"frame": {
- "x": 311,
- "y": 134,
+ "x": 342,
+ "y": 86,
"w": 23,
"h": 21
}
},
{
- "filename": "deep_sea_scale",
+ "filename": "deep_sea_tooth",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4032,17 +3927,17 @@
"x": 5,
"y": 6,
"w": 22,
- "h": 20
+ "h": 21
},
"frame": {
- "x": 243,
- "y": 153,
+ "x": 365,
+ "y": 86,
"w": 22,
- "h": 20
+ "h": 21
}
},
{
- "filename": "mystic_ticket",
+ "filename": "dawn_stone",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4050,16 +3945,121 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 7,
- "w": 23,
- "h": 19
+ "x": 6,
+ "y": 6,
+ "w": 20,
+ "h": 21
},
"frame": {
- "x": 265,
- "y": 155,
- "w": 23,
- "h": 19
+ "x": 389,
+ "y": 43,
+ "w": 20,
+ "h": 21
+ }
+ },
+ {
+ "filename": "hyper_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 5,
+ "w": 17,
+ "h": 23
+ },
+ "frame": {
+ "x": 409,
+ "y": 42,
+ "w": 17,
+ "h": 23
+ }
+ },
+ {
+ "filename": "electirizer",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 386,
+ "y": 64,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "sachet",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 18,
+ "h": 23
+ },
+ "frame": {
+ "x": 408,
+ "y": 65,
+ "w": 18,
+ "h": 23
+ }
+ },
+ {
+ "filename": "dusk_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 21,
+ "h": 21
+ },
+ "frame": {
+ "x": 387,
+ "y": 86,
+ "w": 21,
+ "h": 21
+ }
+ },
+ {
+ "filename": "razor_fang",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 6,
+ "w": 18,
+ "h": 20
+ },
+ "frame": {
+ "x": 408,
+ "y": 88,
+ "w": 18,
+ "h": 20
}
},
{
@@ -4077,14 +4077,14 @@
"h": 19
},
"frame": {
- "x": 288,
- "y": 155,
+ "x": 191,
+ "y": 103,
"w": 23,
"h": 19
}
},
{
- "filename": "reviver_seed",
+ "filename": "sharp_beak",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4093,15 +4093,78 @@
},
"spriteSourceSize": {
"x": 5,
- "y": 8,
- "w": 23,
- "h": 20
+ "y": 5,
+ "w": 21,
+ "h": 23
},
"frame": {
- "x": 311,
- "y": 155,
- "w": 23,
- "h": 20
+ "x": 193,
+ "y": 122,
+ "w": 21,
+ "h": 23
+ }
+ },
+ {
+ "filename": "water_tera_shard",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 214,
+ "y": 103,
+ "w": 22,
+ "h": 23
+ }
+ },
+ {
+ "filename": "whipped_dream",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 21,
+ "h": 23
+ },
+ "frame": {
+ "x": 193,
+ "y": 145,
+ "w": 21,
+ "h": 23
+ }
+ },
+ {
+ "filename": "wide_lens",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 4,
+ "w": 22,
+ "h": 23
+ },
+ "frame": {
+ "x": 214,
+ "y": 126,
+ "w": 22,
+ "h": 23
}
},
{
@@ -4119,8 +4182,8 @@
"h": 22
},
"frame": {
- "x": 334,
- "y": 136,
+ "x": 193,
+ "y": 168,
"w": 22,
"h": 22
}
@@ -4140,14 +4203,14 @@
"h": 22
},
"frame": {
- "x": 356,
- "y": 136,
+ "x": 192,
+ "y": 190,
"w": 22,
"h": 22
}
},
{
- "filename": "burn_drive",
+ "filename": "blunder_policy",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4155,16 +4218,16 @@
"h": 32
},
"spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 19
},
"frame": {
- "x": 334,
- "y": 158,
- "w": 23,
- "h": 17
+ "x": 214,
+ "y": 149,
+ "w": 22,
+ "h": 19
}
},
{
@@ -4182,8 +4245,8 @@
"h": 22
},
"frame": {
- "x": 378,
- "y": 132,
+ "x": 215,
+ "y": 168,
"w": 22,
"h": 22
}
@@ -4203,54 +4266,12 @@
"h": 22
},
"frame": {
- "x": 400,
- "y": 132,
+ "x": 214,
+ "y": 190,
"w": 22,
"h": 22
}
},
- {
- "filename": "chill_drive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
- },
- "frame": {
- "x": 357,
- "y": 158,
- "w": 23,
- "h": 17
- }
- },
- {
- "filename": "wellspring_mask",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 5,
- "w": 23,
- "h": 21
- },
- "frame": {
- "x": 380,
- "y": 154,
- "w": 23,
- "h": 21
- }
- },
{
"filename": "fire_memory",
"rotated": false,
@@ -4266,8 +4287,8 @@
"h": 22
},
"frame": {
- "x": 403,
- "y": 154,
+ "x": 193,
+ "y": 212,
"w": 22,
"h": 22
}
@@ -4287,8 +4308,8 @@
"h": 22
},
"frame": {
- "x": 123,
- "y": 169,
+ "x": 193,
+ "y": 234,
"w": 22,
"h": 22
}
@@ -4308,8 +4329,8 @@
"h": 22
},
"frame": {
- "x": 145,
- "y": 169,
+ "x": 193,
+ "y": 256,
"w": 22,
"h": 22
}
@@ -4329,8 +4350,8 @@
"h": 22
},
"frame": {
- "x": 167,
- "y": 169,
+ "x": 215,
+ "y": 212,
"w": 22,
"h": 22
}
@@ -4350,8 +4371,8 @@
"h": 22
},
"frame": {
- "x": 189,
- "y": 169,
+ "x": 215,
+ "y": 234,
"w": 22,
"h": 22
}
@@ -4371,75 +4392,12 @@
"h": 22
},
"frame": {
- "x": 211,
- "y": 169,
+ "x": 215,
+ "y": 256,
"w": 22,
"h": 22
}
},
- {
- "filename": "shell_bell",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 7,
- "w": 23,
- "h": 20
- },
- "frame": {
- "x": 233,
- "y": 173,
- "w": 23,
- "h": 20
- }
- },
- {
- "filename": "dubious_disc",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 7,
- "w": 22,
- "h": 19
- },
- "frame": {
- "x": 256,
- "y": 174,
- "w": 22,
- "h": 19
- }
- },
- {
- "filename": "fairy_feather",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 7,
- "w": 22,
- "h": 20
- },
- "frame": {
- "x": 278,
- "y": 174,
- "w": 22,
- "h": 20
- }
- },
{
"filename": "guard_spec",
"rotated": false,
@@ -4455,197 +4413,8 @@
"h": 22
},
"frame": {
- "x": 300,
- "y": 175,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "ice_memory",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 322,
- "y": 175,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "ice_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 344,
- "y": 175,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "magmarizer",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 366,
- "y": 175,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "leftovers",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 5,
- "w": 15,
- "h": 22
- },
- "frame": {
- "x": 388,
- "y": 175,
- "w": 15,
- "h": 22
- }
- },
- {
- "filename": "mini_black_hole",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 403,
- "y": 176,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "poison_memory",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 125,
- "y": 191,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "protector",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 147,
- "y": 191,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "psychic_memory",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 169,
- "y": 191,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "rock_memory",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 191,
- "y": 191,
+ "x": 195,
+ "y": 278,
"w": 22,
"h": 22
}
@@ -4665,35 +4434,14 @@
"h": 22
},
"frame": {
- "x": 213,
- "y": 191,
+ "x": 217,
+ "y": 278,
"w": 20,
"h": 22
}
},
{
- "filename": "liechi_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 21
- },
- "frame": {
- "x": 233,
- "y": 193,
- "w": 22,
- "h": 21
- }
- },
- {
- "filename": "scroll_of_darkness",
+ "filename": "ice_memory",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4707,119 +4455,14 @@
"h": 22
},
"frame": {
- "x": 255,
- "y": 193,
+ "x": 236,
+ "y": 105,
"w": 22,
"h": 22
}
},
{
- "filename": "douse_drive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
- },
- "frame": {
- "x": 277,
- "y": 194,
- "w": 23,
- "h": 17
- }
- },
- {
- "filename": "relic_band",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 9,
- "w": 17,
- "h": 16
- },
- "frame": {
- "x": 125,
- "y": 213,
- "w": 17,
- "h": 16
- }
- },
- {
- "filename": "shock_drive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
- },
- "frame": {
- "x": 142,
- "y": 213,
- "w": 23,
- "h": 17
- }
- },
- {
- "filename": "wise_glasses",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 4,
- "y": 8,
- "w": 23,
- "h": 17
- },
- "frame": {
- "x": 165,
- "y": 213,
- "w": 23,
- "h": 17
- }
- },
- {
- "filename": "malicious_armor",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 20
- },
- "frame": {
- "x": 188,
- "y": 213,
- "w": 22,
- "h": 20
- }
- },
- {
- "filename": "scroll_of_waters",
+ "filename": "ice_stone",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4833,14 +4476,14 @@
"h": 22
},
"frame": {
- "x": 210,
- "y": 213,
+ "x": 258,
+ "y": 105,
"w": 22,
"h": 22
}
},
{
- "filename": "shed_shell",
+ "filename": "magmarizer",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4854,14 +4497,14 @@
"h": 22
},
"frame": {
- "x": 232,
- "y": 214,
+ "x": 236,
+ "y": 127,
"w": 22,
"h": 22
}
},
{
- "filename": "starf_berry",
+ "filename": "mini_black_hole",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4875,14 +4518,14 @@
"h": 22
},
"frame": {
- "x": 254,
- "y": 215,
+ "x": 280,
+ "y": 105,
"w": 22,
"h": 22
}
},
{
- "filename": "steel_memory",
+ "filename": "normal_memory",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4896,14 +4539,14 @@
"h": 22
},
"frame": {
- "x": 300,
- "y": 197,
+ "x": 258,
+ "y": 127,
"w": 22,
"h": 22
}
},
{
- "filename": "thick_club",
+ "filename": "poison_memory",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4917,14 +4560,35 @@
"h": 22
},
"frame": {
- "x": 322,
- "y": 197,
+ "x": 280,
+ "y": 127,
"w": 22,
"h": 22
}
},
{
- "filename": "thunder_stone",
+ "filename": "dubious_disc",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 7,
+ "w": 22,
+ "h": 19
+ },
+ "frame": {
+ "x": 236,
+ "y": 149,
+ "w": 22,
+ "h": 19
+ }
+ },
+ {
+ "filename": "protector",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4938,14 +4602,14 @@
"h": 22
},
"frame": {
- "x": 344,
- "y": 197,
+ "x": 237,
+ "y": 168,
"w": 22,
"h": 22
}
},
{
- "filename": "tm_bug",
+ "filename": "psychic_memory",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4959,14 +4623,14 @@
"h": 22
},
"frame": {
- "x": 366,
- "y": 197,
+ "x": 236,
+ "y": 190,
"w": 22,
"h": 22
}
},
{
- "filename": "tm_dark",
+ "filename": "mystic_water",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -4974,123 +4638,18 @@
"h": 32
},
"spriteSourceSize": {
- "x": 5,
+ "x": 6,
"y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 129,
- "y": 230,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "sharp_beak",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 21,
+ "w": 20,
"h": 23
},
"frame": {
- "x": 130,
- "y": 252,
- "w": 21,
+ "x": 237,
+ "y": 212,
+ "w": 20,
"h": 23
}
},
- {
- "filename": "whipped_dream",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 4,
- "w": 21,
- "h": 23
- },
- "frame": {
- "x": 130,
- "y": 275,
- "w": 21,
- "h": 23
- }
- },
- {
- "filename": "tm_dragon",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 151,
- "y": 230,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_electric",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 151,
- "y": 252,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_fairy",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 151,
- "y": 274,
- "w": 22,
- "h": 22
- }
- },
{
"filename": "potion",
"rotated": false,
@@ -5106,14 +4665,14 @@
"h": 23
},
"frame": {
- "x": 137,
- "y": 298,
+ "x": 302,
+ "y": 105,
"w": 17,
"h": 23
}
},
{
- "filename": "sachet",
+ "filename": "wellspring_mask",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5121,251 +4680,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 6,
- "y": 4,
- "w": 18,
- "h": 23
- },
- "frame": {
- "x": 137,
- "y": 321,
- "w": 18,
- "h": 23
- }
- },
- {
- "filename": "super_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
+ "x": 4,
"y": 5,
- "w": 17,
- "h": 23
- },
- "frame": {
- "x": 138,
- "y": 344,
- "w": 17,
- "h": 23
- }
- },
- {
- "filename": "lock_capsule",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 5,
- "w": 19,
- "h": 22
- },
- "frame": {
- "x": 154,
- "y": 296,
- "w": 19,
- "h": 22
- }
- },
- {
- "filename": "metal_coat",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 19,
- "h": 22
- },
- "frame": {
- "x": 138,
- "y": 367,
- "w": 19,
- "h": 22
- }
- },
- {
- "filename": "sitrus_berry",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 20,
- "h": 22
- },
- "frame": {
- "x": 155,
- "y": 318,
- "w": 20,
- "h": 22
- }
- },
- {
- "filename": "tm_fighting",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 155,
- "y": 340,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_fire",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 157,
- "y": 362,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "relic_gold",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 9,
- "y": 11,
- "w": 15,
- "h": 11
- },
- "frame": {
- "x": 173,
- "y": 230,
- "w": 15,
- "h": 11
- }
- },
- {
- "filename": "metronome",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 5,
- "w": 17,
- "h": 22
- },
- "frame": {
- "x": 173,
- "y": 241,
- "w": 17,
- "h": 22
- }
- },
- {
- "filename": "soothe_bell",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 5,
- "w": 17,
- "h": 22
- },
- "frame": {
- "x": 173,
- "y": 263,
- "w": 17,
- "h": 22
- }
- },
- {
- "filename": "tm_flying",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 173,
- "y": 285,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "dawn_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 20,
+ "w": 23,
"h": 21
},
"frame": {
- "x": 190,
- "y": 233,
- "w": 20,
+ "x": 319,
+ "y": 107,
+ "w": 23,
"h": 21
}
},
{
- "filename": "sweet_apple",
+ "filename": "liechi_berry",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5379,98 +4707,77 @@
"h": 21
},
"frame": {
- "x": 210,
+ "x": 302,
+ "y": 128,
+ "w": 22,
+ "h": 21
+ }
+ },
+ {
+ "filename": "reviver_seed",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 8,
+ "w": 23,
+ "h": 20
+ },
+ "frame": {
+ "x": 342,
+ "y": 107,
+ "w": 23,
+ "h": 20
+ }
+ },
+ {
+ "filename": "shell_bell",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 7,
+ "w": 23,
+ "h": 20
+ },
+ "frame": {
+ "x": 365,
+ "y": 107,
+ "w": 23,
+ "h": 20
+ }
+ },
+ {
+ "filename": "rock_memory",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 237,
"y": 235,
"w": 22,
- "h": 21
+ "h": 22
}
},
{
- "filename": "syrupy_apple",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 21
- },
- "frame": {
- "x": 232,
- "y": 236,
- "w": 22,
- "h": 21
- }
- },
- {
- "filename": "gb",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 20,
- "h": 20
- },
- "frame": {
- "x": 190,
- "y": 254,
- "w": 20,
- "h": 20
- }
- },
- {
- "filename": "tart_apple",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 21
- },
- "frame": {
- "x": 254,
- "y": 237,
- "w": 22,
- "h": 21
- }
- },
- {
- "filename": "tera_orb",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 6,
- "w": 22,
- "h": 20
- },
- "frame": {
- "x": 210,
- "y": 256,
- "w": 22,
- "h": 20
- }
- },
- {
- "filename": "tm_ghost",
+ "filename": "scroll_of_darkness",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5484,14 +4791,14 @@
"h": 22
},
"frame": {
- "x": 232,
+ "x": 237,
"y": 257,
"w": 22,
"h": 22
}
},
{
- "filename": "tm_grass",
+ "filename": "scroll_of_waters",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5505,113 +4812,8 @@
"h": 22
},
"frame": {
- "x": 254,
- "y": 258,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_ground",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 175,
- "y": 307,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_ice",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 177,
- "y": 329,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_normal",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 179,
- "y": 351,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_poison",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 179,
- "y": 373,
- "w": 22,
- "h": 22
- }
- },
- {
- "filename": "tm_psychic",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 5,
- "w": 22,
- "h": 22
- },
- "frame": {
- "x": 157,
- "y": 384,
+ "x": 237,
+ "y": 279,
"w": 22,
"h": 22
}
@@ -5631,12 +4833,117 @@
"h": 19
},
"frame": {
- "x": 109,
- "y": 406,
+ "x": 258,
+ "y": 149,
"w": 22,
"h": 19
}
},
+ {
+ "filename": "shed_shell",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 259,
+ "y": 168,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "starf_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 258,
+ "y": 190,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "steel_memory",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 257,
+ "y": 212,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "big_nugget",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 20,
+ "h": 20
+ },
+ "frame": {
+ "x": 388,
+ "y": 107,
+ "w": 20,
+ "h": 20
+ }
+ },
+ {
+ "filename": "oval_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 7,
+ "w": 18,
+ "h": 19
+ },
+ "frame": {
+ "x": 408,
+ "y": 108,
+ "w": 18,
+ "h": 19
+ }
+ },
{
"filename": "metal_alloy",
"rotated": false,
@@ -5652,12 +4959,222 @@
"h": 19
},
"frame": {
- "x": 131,
- "y": 406,
+ "x": 280,
+ "y": 149,
"w": 21,
"h": 19
}
},
+ {
+ "filename": "sitrus_berry",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 5,
+ "w": 20,
+ "h": 22
+ },
+ "frame": {
+ "x": 281,
+ "y": 168,
+ "w": 20,
+ "h": 22
+ }
+ },
+ {
+ "filename": "thick_club",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 301,
+ "y": 149,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "thunder_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 280,
+ "y": 190,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_bug",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 279,
+ "y": 212,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_dark",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 259,
+ "y": 234,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_dragon",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 259,
+ "y": 256,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_electric",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 259,
+ "y": 278,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_fairy",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 281,
+ "y": 234,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_fighting",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 281,
+ "y": 256,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_fire",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 281,
+ "y": 278,
+ "w": 22,
+ "h": 22
+ }
+ },
{
"filename": "lum_berry",
"rotated": false,
@@ -5673,14 +5190,14 @@
"h": 19
},
"frame": {
- "x": 152,
- "y": 406,
+ "x": 301,
+ "y": 171,
"w": 20,
"h": 19
}
},
{
- "filename": "power_herb",
+ "filename": "metal_coat",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5689,19 +5206,19 @@
},
"spriteSourceSize": {
"x": 6,
- "y": 7,
- "w": 20,
- "h": 19
+ "y": 5,
+ "w": 19,
+ "h": 22
},
"frame": {
- "x": 172,
- "y": 406,
- "w": 20,
- "h": 19
+ "x": 302,
+ "y": 190,
+ "w": 19,
+ "h": 22
}
},
{
- "filename": "absolite",
+ "filename": "tm_flying",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5709,20 +5226,20 @@
"h": 32
},
"spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
},
"frame": {
- "x": 116,
- "y": 390,
- "w": 16,
- "h": 16
+ "x": 301,
+ "y": 212,
+ "w": 22,
+ "h": 22
}
},
{
- "filename": "aerodactylite",
+ "filename": "tm_ghost",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -5730,16 +5247,163 @@
"h": 32
},
"spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
},
"frame": {
- "x": 132,
- "y": 390,
- "w": 16,
- "h": 16
+ "x": 303,
+ "y": 234,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_grass",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 303,
+ "y": 256,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_ground",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 303,
+ "y": 278,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "poison_barb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 21,
+ "h": 21
+ },
+ "frame": {
+ "x": 324,
+ "y": 128,
+ "w": 21,
+ "h": 21
+ }
+ },
+ {
+ "filename": "tm_ice",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 323,
+ "y": 149,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_normal",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 321,
+ "y": 171,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_poison",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 345,
+ "y": 127,
+ "w": 22,
+ "h": 22
+ }
+ },
+ {
+ "filename": "tm_psychic",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 5,
+ "w": 22,
+ "h": 22
+ },
+ "frame": {
+ "x": 345,
+ "y": 149,
+ "w": 22,
+ "h": 22
}
},
{
@@ -5757,8 +5421,8 @@
"h": 22
},
"frame": {
- "x": 388,
- "y": 198,
+ "x": 343,
+ "y": 171,
"w": 22,
"h": 22
}
@@ -5778,8 +5442,8 @@
"h": 22
},
"frame": {
- "x": 277,
- "y": 211,
+ "x": 367,
+ "y": 127,
"w": 22,
"h": 22
}
@@ -5799,8 +5463,8 @@
"h": 22
},
"frame": {
- "x": 276,
- "y": 233,
+ "x": 367,
+ "y": 149,
"w": 22,
"h": 22
}
@@ -5820,8 +5484,8 @@
"h": 22
},
"frame": {
- "x": 276,
- "y": 255,
+ "x": 365,
+ "y": 171,
"w": 22,
"h": 22
}
@@ -5841,12 +5505,33 @@
"h": 22
},
"frame": {
- "x": 299,
- "y": 219,
+ "x": 389,
+ "y": 127,
"w": 22,
"h": 22
}
},
+ {
+ "filename": "full_heal",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 9,
+ "y": 4,
+ "w": 15,
+ "h": 23
+ },
+ "frame": {
+ "x": 411,
+ "y": 127,
+ "w": 15,
+ "h": 23
+ }
+ },
{
"filename": "x_accuracy",
"rotated": false,
@@ -5862,12 +5547,33 @@
"h": 22
},
"frame": {
- "x": 321,
- "y": 219,
+ "x": 389,
+ "y": 149,
"w": 22,
"h": 22
}
},
+ {
+ "filename": "leftovers",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 5,
+ "w": 15,
+ "h": 22
+ },
+ "frame": {
+ "x": 411,
+ "y": 150,
+ "w": 15,
+ "h": 22
+ }
+ },
{
"filename": "x_attack",
"rotated": false,
@@ -5883,12 +5589,54 @@
"h": 22
},
"frame": {
- "x": 343,
- "y": 219,
+ "x": 387,
+ "y": 171,
"w": 22,
"h": 22
}
},
+ {
+ "filename": "super_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 5,
+ "w": 17,
+ "h": 23
+ },
+ "frame": {
+ "x": 409,
+ "y": 172,
+ "w": 17,
+ "h": 23
+ }
+ },
+ {
+ "filename": "power_herb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 7,
+ "w": 20,
+ "h": 19
+ },
+ "frame": {
+ "x": 321,
+ "y": 193,
+ "w": 20,
+ "h": 19
+ }
+ },
{
"filename": "x_defense",
"rotated": false,
@@ -5904,12 +5652,33 @@
"h": 22
},
"frame": {
- "x": 365,
- "y": 219,
+ "x": 323,
+ "y": 212,
"w": 22,
"h": 22
}
},
+ {
+ "filename": "razor_claw",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 7,
+ "w": 20,
+ "h": 19
+ },
+ "frame": {
+ "x": 341,
+ "y": 193,
+ "w": 20,
+ "h": 19
+ }
+ },
{
"filename": "x_sp_atk",
"rotated": false,
@@ -5925,8 +5694,8 @@
"h": 22
},
"frame": {
- "x": 298,
- "y": 241,
+ "x": 325,
+ "y": 234,
"w": 22,
"h": 22
}
@@ -5946,8 +5715,8 @@
"h": 22
},
"frame": {
- "x": 320,
- "y": 241,
+ "x": 325,
+ "y": 256,
"w": 22,
"h": 22
}
@@ -5967,35 +5736,14 @@
"h": 22
},
"frame": {
- "x": 342,
- "y": 241,
+ "x": 325,
+ "y": 278,
"w": 22,
"h": 22
}
},
{
- "filename": "dusk_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 21,
- "h": 21
- },
- "frame": {
- "x": 364,
- "y": 241,
- "w": 21,
- "h": 21
- }
- },
- {
- "filename": "poison_barb",
+ "filename": "deep_sea_scale",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6005,18 +5753,18 @@
"spriteSourceSize": {
"x": 5,
"y": 6,
- "w": 21,
- "h": 21
+ "w": 22,
+ "h": 20
},
"frame": {
- "x": 387,
- "y": 220,
- "w": 21,
- "h": 21
+ "x": 361,
+ "y": 193,
+ "w": 22,
+ "h": 20
}
},
{
- "filename": "golden_egg",
+ "filename": "fairy_feather",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6024,15 +5772,15 @@
"h": 32
},
"spriteSourceSize": {
- "x": 7,
- "y": 6,
- "w": 17,
+ "x": 5,
+ "y": 7,
+ "w": 22,
"h": 20
},
"frame": {
- "x": 408,
- "y": 220,
- "w": 17,
+ "x": 383,
+ "y": 193,
+ "w": 22,
"h": 20
}
},
@@ -6051,14 +5799,14 @@
"h": 21
},
"frame": {
- "x": 385,
- "y": 241,
+ "x": 405,
+ "y": 195,
"w": 21,
"h": 21
}
},
{
- "filename": "quick_claw",
+ "filename": "mystery_egg",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6066,16 +5814,37 @@
"h": 32
},
"spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 19,
- "h": 21
+ "x": 8,
+ "y": 8,
+ "w": 16,
+ "h": 18
},
"frame": {
- "x": 406,
- "y": 241,
- "w": 19,
- "h": 21
+ "x": 345,
+ "y": 212,
+ "w": 16,
+ "h": 18
+ }
+ },
+ {
+ "filename": "douse_drive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
+ },
+ "frame": {
+ "x": 361,
+ "y": 213,
+ "w": 23,
+ "h": 17
}
},
{
@@ -6093,50 +5862,8 @@
"h": 18
},
"frame": {
- "x": 298,
- "y": 263,
- "w": 21,
- "h": 18
- }
- },
- {
- "filename": "sharp_meteorite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 21,
- "h": 18
- },
- "frame": {
- "x": 319,
- "y": 263,
- "w": 21,
- "h": 18
- }
- },
- {
- "filename": "unremarkable_teacup",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 5,
- "y": 7,
- "w": 21,
- "h": 18
- },
- "frame": {
- "x": 340,
- "y": 263,
+ "x": 384,
+ "y": 213,
"w": 21,
"h": 18
}
@@ -6156,14 +5883,98 @@
"h": 21
},
"frame": {
- "x": 276,
- "y": 277,
+ "x": 405,
+ "y": 216,
"w": 21,
"h": 21
}
},
{
- "filename": "everstone",
+ "filename": "sweet_apple",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 21
+ },
+ "frame": {
+ "x": 347,
+ "y": 230,
+ "w": 22,
+ "h": 21
+ }
+ },
+ {
+ "filename": "syrupy_apple",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 21
+ },
+ "frame": {
+ "x": 347,
+ "y": 251,
+ "w": 22,
+ "h": 21
+ }
+ },
+ {
+ "filename": "tart_apple",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 21
+ },
+ "frame": {
+ "x": 347,
+ "y": 272,
+ "w": 22,
+ "h": 21
+ }
+ },
+ {
+ "filename": "eviolite",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 8,
+ "w": 15,
+ "h": 15
+ },
+ "frame": {
+ "x": 369,
+ "y": 230,
+ "w": 15,
+ "h": 15
+ }
+ },
+ {
+ "filename": "sharp_meteorite",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6173,18 +5984,102 @@
"spriteSourceSize": {
"x": 6,
"y": 8,
- "w": 20,
- "h": 17
+ "w": 21,
+ "h": 18
},
"frame": {
- "x": 297,
- "y": 281,
- "w": 20,
- "h": 17
+ "x": 384,
+ "y": 231,
+ "w": 21,
+ "h": 18
}
},
{
- "filename": "magnet",
+ "filename": "unremarkable_teacup",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 7,
+ "w": 21,
+ "h": 18
+ },
+ "frame": {
+ "x": 405,
+ "y": 237,
+ "w": 21,
+ "h": 18
+ }
+ },
+ {
+ "filename": "prism_scale",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 9,
+ "y": 8,
+ "w": 15,
+ "h": 15
+ },
+ "frame": {
+ "x": 369,
+ "y": 245,
+ "w": 15,
+ "h": 15
+ }
+ },
+ {
+ "filename": "metronome",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 5,
+ "w": 17,
+ "h": 22
+ },
+ "frame": {
+ "x": 369,
+ "y": 260,
+ "w": 17,
+ "h": 22
+ }
+ },
+ {
+ "filename": "quick_claw",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 19,
+ "h": 21
+ },
+ "frame": {
+ "x": 386,
+ "y": 249,
+ "w": 19,
+ "h": 21
+ }
+ },
+ {
+ "filename": "blue_orb",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6198,29 +6093,8 @@
"h": 20
},
"frame": {
- "x": 317,
- "y": 281,
- "w": 20,
- "h": 20
- }
- },
- {
- "filename": "mb",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 20,
- "h": 20
- },
- "frame": {
- "x": 337,
- "y": 281,
+ "x": 405,
+ "y": 255,
"w": 20,
"h": 20
}
@@ -6240,14 +6114,14 @@
"h": 20
},
"frame": {
- "x": 357,
- "y": 281,
+ "x": 386,
+ "y": 270,
"w": 19,
"h": 20
}
},
{
- "filename": "baton",
+ "filename": "golden_egg",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6256,17 +6130,248 @@
},
"spriteSourceSize": {
"x": 7,
+ "y": 6,
+ "w": 17,
+ "h": 20
+ },
+ "frame": {
+ "x": 369,
+ "y": 282,
+ "w": 17,
+ "h": 20
+ }
+ },
+ {
+ "filename": "malicious_armor",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 20
+ },
+ "frame": {
+ "x": 347,
+ "y": 293,
+ "w": 22,
+ "h": 20
+ }
+ },
+ {
+ "filename": "everstone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 17
+ },
+ "frame": {
+ "x": 405,
+ "y": 275,
+ "w": 20,
+ "h": 17
+ }
+ },
+ {
+ "filename": "hard_stone",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 19,
+ "h": 20
+ },
+ "frame": {
+ "x": 386,
+ "y": 290,
+ "w": 19,
+ "h": 20
+ }
+ },
+ {
+ "filename": "gb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 20,
+ "h": 20
+ },
+ "frame": {
+ "x": 405,
+ "y": 292,
+ "w": 20,
+ "h": 20
+ }
+ },
+ {
+ "filename": "lucky_egg",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 6,
+ "w": 17,
+ "h": 20
+ },
+ "frame": {
+ "x": 369,
+ "y": 302,
+ "w": 17,
+ "h": 20
+ }
+ },
+ {
+ "filename": "miracle_seed",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
"y": 7,
- "w": 18,
+ "w": 19,
+ "h": 19
+ },
+ "frame": {
+ "x": 386,
+ "y": 310,
+ "w": 19,
+ "h": 19
+ }
+ },
+ {
+ "filename": "magnet",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 20,
+ "h": 20
+ },
+ "frame": {
+ "x": 405,
+ "y": 312,
+ "w": 20,
+ "h": 20
+ }
+ },
+ {
+ "filename": "relic_crown",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 7,
+ "w": 23,
"h": 18
},
"frame": {
- "x": 361,
- "y": 263,
- "w": 18,
+ "x": 195,
+ "y": 300,
+ "w": 23,
"h": 18
}
},
+ {
+ "filename": "spell_tag",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 7,
+ "y": 6,
+ "w": 19,
+ "h": 21
+ },
+ "frame": {
+ "x": 218,
+ "y": 300,
+ "w": 19,
+ "h": 21
+ }
+ },
+ {
+ "filename": "tera_orb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 5,
+ "y": 6,
+ "w": 22,
+ "h": 20
+ },
+ "frame": {
+ "x": 237,
+ "y": 301,
+ "w": 22,
+ "h": 20
+ }
+ },
+ {
+ "filename": "mb",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 6,
+ "w": 20,
+ "h": 20
+ },
+ "frame": {
+ "x": 259,
+ "y": 300,
+ "w": 20,
+ "h": 20
+ }
+ },
{
"filename": "pb",
"rotated": false,
@@ -6282,8 +6387,8 @@
"h": 20
},
"frame": {
- "x": 379,
- "y": 262,
+ "x": 279,
+ "y": 300,
"w": 20,
"h": 20
}
@@ -6303,33 +6408,12 @@
"h": 20
},
"frame": {
- "x": 399,
- "y": 262,
+ "x": 299,
+ "y": 300,
"w": 20,
"h": 20
}
},
- {
- "filename": "razor_claw",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 20,
- "h": 19
- },
- "frame": {
- "x": 376,
- "y": 282,
- "w": 20,
- "h": 19
- }
- },
{
"filename": "rb",
"rotated": false,
@@ -6345,14 +6429,14 @@
"h": 20
},
"frame": {
- "x": 396,
- "y": 282,
+ "x": 319,
+ "y": 300,
"w": 20,
"h": 20
}
},
{
- "filename": "spell_tag",
+ "filename": "shock_drive",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6360,16 +6444,58 @@
"h": 32
},
"spriteSourceSize": {
- "x": 7,
- "y": 6,
- "w": 19,
- "h": 21
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
},
"frame": {
- "x": 192,
- "y": 395,
- "w": 19,
- "h": 21
+ "x": 155,
+ "y": 305,
+ "w": 23,
+ "h": 17
+ }
+ },
+ {
+ "filename": "soothe_bell",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 5,
+ "w": 17,
+ "h": 22
+ },
+ "frame": {
+ "x": 178,
+ "y": 305,
+ "w": 17,
+ "h": 22
+ }
+ },
+ {
+ "filename": "wise_glasses",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 4,
+ "y": 8,
+ "w": 23,
+ "h": 17
+ },
+ "frame": {
+ "x": 195,
+ "y": 318,
+ "w": 23,
+ "h": 17
}
},
{
@@ -6387,8 +6513,8 @@
"h": 20
},
"frame": {
- "x": 211,
- "y": 276,
+ "x": 218,
+ "y": 321,
"w": 20,
"h": 20
}
@@ -6408,12 +6534,33 @@
"h": 20
},
"frame": {
- "x": 231,
- "y": 279,
+ "x": 238,
+ "y": 321,
"w": 20,
"h": 20
}
},
+ {
+ "filename": "alakazite",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 8,
+ "w": 16,
+ "h": 16
+ },
+ "frame": {
+ "x": 139,
+ "y": 309,
+ "w": 16,
+ "h": 16
+ }
+ },
{
"filename": "ub",
"rotated": false,
@@ -6429,33 +6576,12 @@
"h": 20
},
"frame": {
- "x": 251,
- "y": 280,
+ "x": 135,
+ "y": 325,
"w": 20,
"h": 20
}
},
- {
- "filename": "mystery_egg",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 18
- },
- "frame": {
- "x": 195,
- "y": 276,
- "w": 16,
- "h": 18
- }
- },
{
"filename": "white_herb",
"rotated": false,
@@ -6471,8 +6597,8 @@
"h": 19
},
"frame": {
- "x": 211,
- "y": 296,
+ "x": 155,
+ "y": 322,
"w": 20,
"h": 19
}
@@ -6492,8 +6618,8 @@
"h": 18
},
"frame": {
- "x": 231,
- "y": 299,
+ "x": 175,
+ "y": 327,
"w": 20,
"h": 18
}
@@ -6513,14 +6639,14 @@
"h": 18
},
"frame": {
- "x": 251,
- "y": 300,
+ "x": 136,
+ "y": 345,
"w": 20,
"h": 18
}
},
{
- "filename": "hard_stone",
+ "filename": "baton",
"rotated": false,
"trimmed": true,
"sourceSize": {
@@ -6528,37 +6654,16 @@
"h": 32
},
"spriteSourceSize": {
- "x": 6,
- "y": 6,
- "w": 19,
- "h": 20
- },
- "frame": {
- "x": 271,
- "y": 298,
- "w": 19,
- "h": 20
- }
- },
- {
- "filename": "miracle_seed",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
+ "x": 7,
"y": 7,
- "w": 19,
- "h": 19
+ "w": 18,
+ "h": 18
},
"frame": {
- "x": 290,
- "y": 298,
- "w": 19,
- "h": 19
+ "x": 156,
+ "y": 341,
+ "w": 18,
+ "h": 18
}
},
{
@@ -6576,8 +6681,8 @@
"h": 18
},
"frame": {
- "x": 309,
- "y": 301,
+ "x": 174,
+ "y": 345,
"w": 20,
"h": 18
}
@@ -6597,8 +6702,8 @@
"h": 18
},
"frame": {
- "x": 329,
- "y": 301,
+ "x": 195,
+ "y": 335,
"w": 20,
"h": 18
}
@@ -6618,8 +6723,8 @@
"h": 18
},
"frame": {
- "x": 349,
- "y": 301,
+ "x": 215,
+ "y": 341,
"w": 20,
"h": 18
}
@@ -6639,8 +6744,8 @@
"h": 18
},
"frame": {
- "x": 369,
- "y": 301,
+ "x": 235,
+ "y": 341,
"w": 20,
"h": 18
}
@@ -6660,54 +6765,12 @@
"h": 18
},
"frame": {
- "x": 389,
- "y": 302,
+ "x": 194,
+ "y": 353,
"w": 20,
"h": 18
}
},
- {
- "filename": "aggronite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
- },
- "frame": {
- "x": 409,
- "y": 302,
- "w": 16,
- "h": 16
- }
- },
- {
- "filename": "alakazite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
- },
- "frame": {
- "x": 409,
- "y": 318,
- "w": 16,
- "h": 16
- }
- },
{
"filename": "wl_ether",
"rotated": false,
@@ -6723,8 +6786,8 @@
"h": 18
},
"frame": {
- "x": 211,
- "y": 315,
+ "x": 214,
+ "y": 359,
"w": 20,
"h": 18
}
@@ -6744,407 +6807,8 @@
"h": 18
},
"frame": {
- "x": 231,
- "y": 317,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_full_restore",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 251,
- "y": 318,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_guard_spec",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 271,
- "y": 318,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "oval_stone",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 7,
- "w": 18,
- "h": 19
- },
- "frame": {
- "x": 291,
- "y": 317,
- "w": 18,
- "h": 19
- }
- },
- {
- "filename": "wl_hyper_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 309,
- "y": 319,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_ice_heal",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 329,
- "y": 319,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_item_drop",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 349,
- "y": 319,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_item_urge",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 369,
- "y": 319,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_max_elixir",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 389,
- "y": 320,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "altarianite",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 8,
- "y": 8,
- "w": 16,
- "h": 16
- },
- "frame": {
- "x": 409,
- "y": 334,
- "w": 16,
- "h": 16
- }
- },
- {
- "filename": "wl_max_ether",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 199,
- "y": 333,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "razor_fang",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 6,
- "w": 18,
- "h": 20
- },
- "frame": {
- "x": 201,
- "y": 351,
- "w": 18,
- "h": 20
- }
- },
- {
- "filename": "lucky_egg",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 7,
- "y": 6,
- "w": 17,
- "h": 20
- },
- "frame": {
- "x": 201,
- "y": 371,
- "w": 17,
- "h": 20
- }
- },
- {
- "filename": "wl_max_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 219,
- "y": 335,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_max_revive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 219,
- "y": 353,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_paralyze_heal",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 218,
- "y": 371,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 239,
- "y": 336,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_reset_urge",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 259,
- "y": 336,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_revive",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 279,
- "y": 336,
- "w": 20,
- "h": 18
- }
- },
- {
- "filename": "wl_super_potion",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 32,
- "h": 32
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 8,
- "w": 20,
- "h": 18
- },
- "frame": {
- "x": 239,
- "y": 354,
+ "x": 234,
+ "y": 359,
"w": 20,
"h": 18
}
@@ -7164,12 +6828,285 @@
"h": 18
},
"frame": {
- "x": 259,
- "y": 354,
+ "x": 156,
+ "y": 359,
"w": 18,
"h": 18
}
},
+ {
+ "filename": "wl_full_restore",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 174,
+ "y": 363,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_guard_spec",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 194,
+ "y": 371,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_hyper_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 214,
+ "y": 377,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_ice_heal",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 234,
+ "y": 377,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "relic_gold",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 9,
+ "y": 11,
+ "w": 15,
+ "h": 11
+ },
+ "frame": {
+ "x": 141,
+ "y": 363,
+ "w": 15,
+ "h": 11
+ }
+ },
+ {
+ "filename": "wl_item_drop",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 141,
+ "y": 377,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_item_urge",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 141,
+ "y": 395,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_max_elixir",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 161,
+ "y": 381,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_max_ether",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 161,
+ "y": 399,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_max_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 181,
+ "y": 389,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_max_revive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 181,
+ "y": 407,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_paralyze_heal",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 201,
+ "y": 395,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 221,
+ "y": 395,
+ "w": 20,
+ "h": 18
+ }
+ },
{
"filename": "dark_stone",
"rotated": false,
@@ -7185,8 +7122,8 @@
"h": 18
},
"frame": {
- "x": 277,
- "y": 354,
+ "x": 241,
+ "y": 395,
"w": 18,
"h": 18
}
@@ -7206,12 +7143,54 @@
"h": 18
},
"frame": {
- "x": 238,
- "y": 372,
+ "x": 255,
+ "y": 341,
"w": 18,
"h": 18
}
},
+ {
+ "filename": "wl_reset_urge",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 254,
+ "y": 359,
+ "w": 20,
+ "h": 18
+ }
+ },
+ {
+ "filename": "wl_revive",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 254,
+ "y": 377,
+ "w": 20,
+ "h": 18
+ }
+ },
{
"filename": "light_ball",
"rotated": false,
@@ -7227,12 +7206,33 @@
"h": 18
},
"frame": {
- "x": 256,
- "y": 372,
+ "x": 259,
+ "y": 395,
"w": 18,
"h": 18
}
},
+ {
+ "filename": "wl_super_potion",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 6,
+ "y": 8,
+ "w": 20,
+ "h": 18
+ },
+ "frame": {
+ "x": 259,
+ "y": 320,
+ "w": 20,
+ "h": 18
+ }
+ },
{
"filename": "light_stone",
"rotated": false,
@@ -7248,8 +7248,8 @@
"h": 18
},
"frame": {
- "x": 274,
- "y": 372,
+ "x": 279,
+ "y": 320,
"w": 18,
"h": 18
}
@@ -7269,12 +7269,33 @@
"h": 18
},
"frame": {
- "x": 299,
- "y": 337,
+ "x": 297,
+ "y": 320,
"w": 18,
"h": 18
}
},
+ {
+ "filename": "altarianite",
+ "rotated": false,
+ "trimmed": true,
+ "sourceSize": {
+ "w": 32,
+ "h": 32
+ },
+ "spriteSourceSize": {
+ "x": 8,
+ "y": 8,
+ "w": 16,
+ "h": 16
+ },
+ "frame": {
+ "x": 315,
+ "y": 320,
+ "w": 16,
+ "h": 16
+ }
+ },
{
"filename": "ampharosite",
"rotated": false,
@@ -7290,8 +7311,8 @@
"h": 16
},
"frame": {
- "x": 317,
- "y": 337,
+ "x": 273,
+ "y": 338,
"w": 16,
"h": 16
}
@@ -7311,8 +7332,8 @@
"h": 16
},
"frame": {
- "x": 333,
- "y": 337,
+ "x": 289,
+ "y": 338,
"w": 16,
"h": 16
}
@@ -7332,8 +7353,8 @@
"h": 16
},
"frame": {
- "x": 349,
- "y": 337,
+ "x": 274,
+ "y": 354,
"w": 16,
"h": 16
}
@@ -7353,8 +7374,8 @@
"h": 16
},
"frame": {
- "x": 365,
- "y": 337,
+ "x": 274,
+ "y": 370,
"w": 16,
"h": 16
}
@@ -7374,8 +7395,8 @@
"h": 16
},
"frame": {
- "x": 295,
- "y": 355,
+ "x": 290,
+ "y": 354,
"w": 16,
"h": 16
}
@@ -7395,8 +7416,8 @@
"h": 16
},
"frame": {
- "x": 381,
- "y": 338,
+ "x": 290,
+ "y": 370,
"w": 16,
"h": 16
}
@@ -7416,8 +7437,8 @@
"h": 16
},
"frame": {
- "x": 311,
- "y": 355,
+ "x": 305,
+ "y": 338,
"w": 16,
"h": 16
}
@@ -7437,8 +7458,8 @@
"h": 16
},
"frame": {
- "x": 327,
- "y": 353,
+ "x": 306,
+ "y": 354,
"w": 16,
"h": 16
}
@@ -7458,8 +7479,8 @@
"h": 16
},
"frame": {
- "x": 343,
- "y": 353,
+ "x": 306,
+ "y": 370,
"w": 16,
"h": 16
}
@@ -7479,8 +7500,8 @@
"h": 16
},
"frame": {
- "x": 359,
- "y": 353,
+ "x": 331,
+ "y": 320,
"w": 16,
"h": 16
}
@@ -7500,8 +7521,8 @@
"h": 16
},
"frame": {
- "x": 375,
- "y": 354,
+ "x": 321,
+ "y": 336,
"w": 16,
"h": 16
}
@@ -7521,8 +7542,8 @@
"h": 16
},
"frame": {
- "x": 391,
- "y": 354,
+ "x": 322,
+ "y": 352,
"w": 16,
"h": 16
}
@@ -7542,8 +7563,8 @@
"h": 16
},
"frame": {
- "x": 407,
- "y": 350,
+ "x": 322,
+ "y": 368,
"w": 16,
"h": 16
}
@@ -7563,8 +7584,8 @@
"h": 16
},
"frame": {
- "x": 407,
- "y": 366,
+ "x": 337,
+ "y": 336,
"w": 16,
"h": 16
}
@@ -7584,8 +7605,8 @@
"h": 16
},
"frame": {
- "x": 211,
- "y": 391,
+ "x": 338,
+ "y": 352,
"w": 16,
"h": 16
}
@@ -7605,8 +7626,8 @@
"h": 16
},
"frame": {
- "x": 211,
- "y": 407,
+ "x": 338,
+ "y": 368,
"w": 16,
"h": 16
}
@@ -7626,8 +7647,8 @@
"h": 16
},
"frame": {
- "x": 227,
- "y": 390,
+ "x": 347,
+ "y": 313,
"w": 16,
"h": 16
}
@@ -7647,8 +7668,8 @@
"h": 16
},
"frame": {
- "x": 227,
- "y": 406,
+ "x": 277,
+ "y": 386,
"w": 16,
"h": 16
}
@@ -7668,8 +7689,8 @@
"h": 16
},
"frame": {
- "x": 243,
- "y": 390,
+ "x": 293,
+ "y": 386,
"w": 16,
"h": 16
}
@@ -7689,8 +7710,8 @@
"h": 16
},
"frame": {
- "x": 243,
- "y": 406,
+ "x": 309,
+ "y": 386,
"w": 16,
"h": 16
}
@@ -7710,8 +7731,8 @@
"h": 16
},
"frame": {
- "x": 259,
- "y": 390,
+ "x": 325,
+ "y": 384,
"w": 16,
"h": 16
}
@@ -7731,8 +7752,8 @@
"h": 16
},
"frame": {
- "x": 259,
- "y": 406,
+ "x": 341,
+ "y": 384,
"w": 16,
"h": 16
}
@@ -7752,8 +7773,8 @@
"h": 16
},
"frame": {
- "x": 275,
- "y": 390,
+ "x": 277,
+ "y": 402,
"w": 16,
"h": 16
}
@@ -7773,8 +7794,8 @@
"h": 16
},
"frame": {
- "x": 275,
- "y": 406,
+ "x": 293,
+ "y": 402,
"w": 16,
"h": 16
}
@@ -7794,8 +7815,8 @@
"h": 16
},
"frame": {
- "x": 292,
- "y": 372,
+ "x": 309,
+ "y": 402,
"w": 16,
"h": 16
}
@@ -7815,8 +7836,8 @@
"h": 16
},
"frame": {
- "x": 308,
- "y": 371,
+ "x": 325,
+ "y": 400,
"w": 16,
"h": 16
}
@@ -7836,8 +7857,8 @@
"h": 16
},
"frame": {
- "x": 324,
- "y": 371,
+ "x": 341,
+ "y": 400,
"w": 16,
"h": 16
}
@@ -7857,8 +7878,8 @@
"h": 16
},
"frame": {
- "x": 340,
- "y": 369,
+ "x": 353,
+ "y": 329,
"w": 16,
"h": 16
}
@@ -7878,8 +7899,8 @@
"h": 16
},
"frame": {
- "x": 356,
- "y": 369,
+ "x": 369,
+ "y": 322,
"w": 16,
"h": 16
}
@@ -7899,8 +7920,8 @@
"h": 16
},
"frame": {
- "x": 372,
- "y": 370,
+ "x": 354,
+ "y": 345,
"w": 16,
"h": 16
}
@@ -7920,8 +7941,8 @@
"h": 16
},
"frame": {
- "x": 388,
- "y": 370,
+ "x": 354,
+ "y": 361,
"w": 16,
"h": 16
}
@@ -7941,8 +7962,8 @@
"h": 16
},
"frame": {
- "x": 292,
- "y": 388,
+ "x": 385,
+ "y": 329,
"w": 16,
"h": 16
}
@@ -7962,8 +7983,8 @@
"h": 16
},
"frame": {
- "x": 308,
- "y": 387,
+ "x": 401,
+ "y": 332,
"w": 16,
"h": 16
}
@@ -7983,8 +8004,8 @@
"h": 16
},
"frame": {
- "x": 324,
- "y": 387,
+ "x": 357,
+ "y": 377,
"w": 16,
"h": 16
}
@@ -8004,8 +8025,8 @@
"h": 16
},
"frame": {
- "x": 340,
- "y": 385,
+ "x": 357,
+ "y": 393,
"w": 16,
"h": 16
}
@@ -8025,8 +8046,8 @@
"h": 16
},
"frame": {
- "x": 356,
- "y": 385,
+ "x": 357,
+ "y": 409,
"w": 16,
"h": 16
}
@@ -8046,8 +8067,8 @@
"h": 16
},
"frame": {
- "x": 291,
- "y": 404,
+ "x": 370,
+ "y": 345,
"w": 16,
"h": 16
}
@@ -8067,8 +8088,8 @@
"h": 16
},
"frame": {
- "x": 372,
- "y": 386,
+ "x": 370,
+ "y": 361,
"w": 16,
"h": 16
}
@@ -8088,8 +8109,8 @@
"h": 16
},
"frame": {
- "x": 388,
- "y": 386,
+ "x": 373,
+ "y": 377,
"w": 16,
"h": 16
}
@@ -8109,8 +8130,8 @@
"h": 16
},
"frame": {
- "x": 404,
- "y": 382,
+ "x": 373,
+ "y": 393,
"w": 16,
"h": 16
}
@@ -8130,8 +8151,8 @@
"h": 16
},
"frame": {
- "x": 404,
- "y": 398,
+ "x": 373,
+ "y": 409,
"w": 16,
"h": 16
}
@@ -8151,8 +8172,8 @@
"h": 16
},
"frame": {
- "x": 340,
- "y": 401,
+ "x": 386,
+ "y": 348,
"w": 16,
"h": 16
}
@@ -8172,8 +8193,8 @@
"h": 16
},
"frame": {
- "x": 356,
- "y": 401,
+ "x": 402,
+ "y": 348,
"w": 16,
"h": 16
}
@@ -8193,8 +8214,8 @@
"h": 16
},
"frame": {
- "x": 372,
- "y": 402,
+ "x": 389,
+ "y": 364,
"w": 16,
"h": 16
}
@@ -8214,8 +8235,8 @@
"h": 16
},
"frame": {
- "x": 388,
- "y": 402,
+ "x": 389,
+ "y": 380,
"w": 16,
"h": 16
}
@@ -8226,6 +8247,6 @@
"meta": {
"app": "https://www.codeandweb.com/texturepacker",
"version": "3.0",
- "smartupdate": "$TexturePacker:SmartUpdate:4669e332ee400e355936594c14e7221c:1a1f5a801c94e8eb8589e13bc50105a1:110e074689c9edd2c54833ce2e4d9270$"
+ "smartupdate": "$TexturePacker:SmartUpdate:c004184e48566e1da6f13477a3348fd3:dc1a5489f7821641aade35ba290bbea7:110e074689c9edd2c54833ce2e4d9270$"
}
}
diff --git a/public/images/items.png b/public/images/items.png
index 9de02d9e0e9..4c366e4d72a 100644
Binary files a/public/images/items.png and b/public/images/items.png differ
diff --git a/public/images/items/inverse.png b/public/images/items/inverse.png
new file mode 100644
index 00000000000..b1ad5d2c00e
Binary files /dev/null and b/public/images/items/inverse.png differ
diff --git a/public/images/items/blank_memory.png b/public/images/items/normal_memory.png
similarity index 100%
rename from public/images/items/blank_memory.png
rename to public/images/items/normal_memory.png
diff --git a/public/images/pokemon/279.png b/public/images/pokemon/279.png
index a50bf952433..e7243586515 100644
Binary files a/public/images/pokemon/279.png and b/public/images/pokemon/279.png differ
diff --git a/public/images/pokemon/exp/shiny/1002b.png b/public/images/pokemon/exp/shiny/1002b.png
deleted file mode 100644
index 85dfb1c4bd6..00000000000
Binary files a/public/images/pokemon/exp/shiny/1002b.png and /dev/null differ
diff --git a/public/images/pokemon/exp/shiny/1002s.png b/public/images/pokemon/exp/shiny/1002s.png
deleted file mode 100644
index 835b3dcd73b..00000000000
Binary files a/public/images/pokemon/exp/shiny/1002s.png and /dev/null differ
diff --git a/public/images/pokemon/exp/shiny/1002sb.png b/public/images/pokemon/exp/shiny/1002sb.png
deleted file mode 100644
index f87e2fc4239..00000000000
Binary files a/public/images/pokemon/exp/shiny/1002sb.png and /dev/null differ
diff --git a/public/images/pokemon/icons/1/84-f.png b/public/images/pokemon/icons/1/84-f.png
new file mode 100644
index 00000000000..88531308131
Binary files /dev/null and b/public/images/pokemon/icons/1/84-f.png differ
diff --git a/public/images/pokemon/icons/1/84s-f.png b/public/images/pokemon/icons/1/84s-f.png
new file mode 100644
index 00000000000..0b616beff56
Binary files /dev/null and b/public/images/pokemon/icons/1/84s-f.png differ
diff --git a/public/images/pokemon/icons/1/85-f.png b/public/images/pokemon/icons/1/85-f.png
new file mode 100644
index 00000000000..ca34e9fc554
Binary files /dev/null and b/public/images/pokemon/icons/1/85-f.png differ
diff --git a/public/images/pokemon/icons/1/85s-f.png b/public/images/pokemon/icons/1/85s-f.png
new file mode 100644
index 00000000000..73bb083f2d9
Binary files /dev/null and b/public/images/pokemon/icons/1/85s-f.png differ
diff --git a/public/images/pokemon/icons/3/354-mega.png b/public/images/pokemon/icons/3/354-mega.png
index bf2858b4722..048af586a5d 100644
Binary files a/public/images/pokemon/icons/3/354-mega.png and b/public/images/pokemon/icons/3/354-mega.png differ
diff --git a/public/images/pokemon/icons/3/354s-mega.png b/public/images/pokemon/icons/3/354s-mega.png
index 3c54955fc26..9dc66f686c6 100644
Binary files a/public/images/pokemon/icons/3/354s-mega.png and b/public/images/pokemon/icons/3/354s-mega.png differ
diff --git a/public/images/pokemon/icons/3/378s.png b/public/images/pokemon/icons/3/378s.png
index 8e1b371140c..e2fc99bbc87 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/4/429.png b/public/images/pokemon/icons/4/429.png
index 4468836a94b..cc682ff940a 100644
Binary files a/public/images/pokemon/icons/4/429.png and b/public/images/pokemon/icons/4/429.png differ
diff --git a/public/images/pokemon/icons/5/546.png b/public/images/pokemon/icons/5/546.png
index c6e84e1fe31..d3d4ac196b2 100644
Binary files a/public/images/pokemon/icons/5/546.png and b/public/images/pokemon/icons/5/546.png differ
diff --git a/public/images/pokemon/icons/5/546s.png b/public/images/pokemon/icons/5/546s.png
index 2c10d91c9e8..7a8d1ba4be3 100644
Binary files a/public/images/pokemon/icons/5/546s.png and b/public/images/pokemon/icons/5/546s.png differ
diff --git a/public/images/pokemon/icons/5/571.png b/public/images/pokemon/icons/5/571.png
index 698b916a675..094f9d44126 100644
Binary files a/public/images/pokemon/icons/5/571.png and b/public/images/pokemon/icons/5/571.png differ
diff --git a/public/images/pokemon/icons/5/571s.png b/public/images/pokemon/icons/5/571s.png
index 8371f12d1a1..ba25df5eb72 100644
Binary files a/public/images/pokemon/icons/5/571s.png and b/public/images/pokemon/icons/5/571s.png differ
diff --git a/public/images/pokemon/icons/5/592s-f.png b/public/images/pokemon/icons/5/592s-f.png
index f320ce8dbed..3df6258da5b 100644
Binary files a/public/images/pokemon/icons/5/592s-f.png and b/public/images/pokemon/icons/5/592s-f.png differ
diff --git a/public/images/pokemon/icons/6/664s.png b/public/images/pokemon/icons/6/664s.png
index 985fbf88781..52ef9b2d436 100644
Binary files a/public/images/pokemon/icons/6/664s.png and b/public/images/pokemon/icons/6/664s.png differ
diff --git a/public/images/pokemon/icons/6/692.png b/public/images/pokemon/icons/6/692.png
index 61cebe369f4..71533bc0c63 100644
Binary files a/public/images/pokemon/icons/6/692.png and b/public/images/pokemon/icons/6/692.png differ
diff --git a/public/images/pokemon/icons/6/692s.png b/public/images/pokemon/icons/6/692s.png
index 5a63ced809b..8d9d998e1c3 100644
Binary files a/public/images/pokemon/icons/6/692s.png and b/public/images/pokemon/icons/6/692s.png differ
diff --git a/public/images/pokemon/icons/6/693.png b/public/images/pokemon/icons/6/693.png
index 73a39c76dbc..bc57f981079 100644
Binary files a/public/images/pokemon/icons/6/693.png and b/public/images/pokemon/icons/6/693.png differ
diff --git a/public/images/pokemon/icons/9/945.png b/public/images/pokemon/icons/9/945.png
index bcf5bdc054e..25abfaf8f6c 100644
Binary files a/public/images/pokemon/icons/9/945.png and b/public/images/pokemon/icons/9/945.png differ
diff --git a/public/images/pokemon/icons/9/945s.png b/public/images/pokemon/icons/9/945s.png
index cd29ac73e36..20c24c77a85 100644
Binary files a/public/images/pokemon/icons/9/945s.png and b/public/images/pokemon/icons/9/945s.png differ
diff --git a/public/images/pokemon/icons/variant/1/116_2.png b/public/images/pokemon/icons/variant/1/116_2.png
new file mode 100644
index 00000000000..42cfbd3c3b5
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/116_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/116_3.png b/public/images/pokemon/icons/variant/1/116_3.png
new file mode 100644
index 00000000000..55020e28a8e
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/116_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/117_2.png b/public/images/pokemon/icons/variant/1/117_2.png
new file mode 100644
index 00000000000..9c0d619df68
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/117_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/117_3.png b/public/images/pokemon/icons/variant/1/117_3.png
new file mode 100644
index 00000000000..e4889e5fb0d
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/117_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/120_2.png b/public/images/pokemon/icons/variant/1/120_2.png
new file mode 100644
index 00000000000..87ba9303cee
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/120_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/120_3.png b/public/images/pokemon/icons/variant/1/120_3.png
new file mode 100644
index 00000000000..921165fa535
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/120_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/121_2.png b/public/images/pokemon/icons/variant/1/121_2.png
new file mode 100644
index 00000000000..2c240fc05c5
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/121_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/121_3.png b/public/images/pokemon/icons/variant/1/121_3.png
new file mode 100644
index 00000000000..3fe75e12157
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/121_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/126_2.png b/public/images/pokemon/icons/variant/1/126_2.png
new file mode 100644
index 00000000000..629efc9c10b
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/126_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/126_3.png b/public/images/pokemon/icons/variant/1/126_3.png
new file mode 100644
index 00000000000..7ad95578477
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/126_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/137_2.png b/public/images/pokemon/icons/variant/1/137_2.png
new file mode 100644
index 00000000000..93ddd4a83ad
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/137_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/137_3.png b/public/images/pokemon/icons/variant/1/137_3.png
new file mode 100644
index 00000000000..044cc212b2b
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/137_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/23_2.png b/public/images/pokemon/icons/variant/1/23_2.png
new file mode 100644
index 00000000000..1152d493c8f
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/23_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/23_3.png b/public/images/pokemon/icons/variant/1/23_3.png
new file mode 100644
index 00000000000..6088043415b
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/23_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/24_2.png b/public/images/pokemon/icons/variant/1/24_2.png
new file mode 100644
index 00000000000..015a5c97884
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/24_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/24_3.png b/public/images/pokemon/icons/variant/1/24_3.png
new file mode 100644
index 00000000000..c9cf33f3412
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/24_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/38_3.png b/public/images/pokemon/icons/variant/1/38_3.png
index 0834d588d5a..28d2d97ab23 100644
Binary files a/public/images/pokemon/icons/variant/1/38_3.png and b/public/images/pokemon/icons/variant/1/38_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/43_2.png b/public/images/pokemon/icons/variant/1/43_2.png
new file mode 100644
index 00000000000..b47f662212c
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/43_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/43_3.png b/public/images/pokemon/icons/variant/1/43_3.png
new file mode 100644
index 00000000000..3d3d47875a0
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/43_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/44_2.png b/public/images/pokemon/icons/variant/1/44_2.png
new file mode 100644
index 00000000000..3b6a6aa082e
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/44_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/44_3.png b/public/images/pokemon/icons/variant/1/44_3.png
new file mode 100644
index 00000000000..c543307d22e
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/44_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/45_2.png b/public/images/pokemon/icons/variant/1/45_2.png
new file mode 100644
index 00000000000..79e094ec9b2
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/45_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/45_3.png b/public/images/pokemon/icons/variant/1/45_3.png
new file mode 100644
index 00000000000..1afbf809c8d
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/45_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/46_1.png b/public/images/pokemon/icons/variant/1/46_1.png
index 6f29d16ed7d..eb9e15001f6 100644
Binary files a/public/images/pokemon/icons/variant/1/46_1.png and b/public/images/pokemon/icons/variant/1/46_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/46_2.png b/public/images/pokemon/icons/variant/1/46_2.png
index 45bd33c6230..bc21946d322 100644
Binary files a/public/images/pokemon/icons/variant/1/46_2.png and b/public/images/pokemon/icons/variant/1/46_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/46_3.png b/public/images/pokemon/icons/variant/1/46_3.png
index c2a0e958745..b3da371304e 100644
Binary files a/public/images/pokemon/icons/variant/1/46_3.png and b/public/images/pokemon/icons/variant/1/46_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/47_1.png b/public/images/pokemon/icons/variant/1/47_1.png
index 6dfafffe8de..cf7ab4f7a4f 100644
Binary files a/public/images/pokemon/icons/variant/1/47_1.png and b/public/images/pokemon/icons/variant/1/47_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/47_2.png b/public/images/pokemon/icons/variant/1/47_2.png
index 193a3e786fb..2ce9c0a289d 100644
Binary files a/public/images/pokemon/icons/variant/1/47_2.png and b/public/images/pokemon/icons/variant/1/47_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/47_3.png b/public/images/pokemon/icons/variant/1/47_3.png
index 6a19f28aab5..911cb37c8d8 100644
Binary files a/public/images/pokemon/icons/variant/1/47_3.png and b/public/images/pokemon/icons/variant/1/47_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/79_2.png b/public/images/pokemon/icons/variant/1/79_2.png
new file mode 100644
index 00000000000..af6caaa5994
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/79_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/79_3.png b/public/images/pokemon/icons/variant/1/79_3.png
new file mode 100644
index 00000000000..11e229bb868
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/79_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/80-mega_2.png b/public/images/pokemon/icons/variant/1/80-mega_2.png
new file mode 100644
index 00000000000..cc5a0b87d24
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/80-mega_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/80-mega_3.png b/public/images/pokemon/icons/variant/1/80-mega_3.png
new file mode 100644
index 00000000000..11871ef80a5
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/80-mega_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/80_2.png b/public/images/pokemon/icons/variant/1/80_2.png
new file mode 100644
index 00000000000..dab6fc6f06e
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/80_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/80_3.png b/public/images/pokemon/icons/variant/1/80_3.png
new file mode 100644
index 00000000000..a6180e61a02
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/80_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/84-f_1.png b/public/images/pokemon/icons/variant/1/84-f_1.png
new file mode 100644
index 00000000000..a0ca4a89b2e
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/84-f_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/84-f_2.png b/public/images/pokemon/icons/variant/1/84-f_2.png
new file mode 100644
index 00000000000..f8b34a5d810
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/84-f_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/84-f_3.png b/public/images/pokemon/icons/variant/1/84-f_3.png
new file mode 100644
index 00000000000..b3aeb8a21fc
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/84-f_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/84_1.png b/public/images/pokemon/icons/variant/1/84_1.png
index cc0efb19cb2..a0ca4a89b2e 100644
Binary files a/public/images/pokemon/icons/variant/1/84_1.png and b/public/images/pokemon/icons/variant/1/84_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/84_2.png b/public/images/pokemon/icons/variant/1/84_2.png
index 6c0e7350679..e51e2107263 100644
Binary files a/public/images/pokemon/icons/variant/1/84_2.png and b/public/images/pokemon/icons/variant/1/84_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/84_3.png b/public/images/pokemon/icons/variant/1/84_3.png
index a6df8472737..a7127a59620 100644
Binary files a/public/images/pokemon/icons/variant/1/84_3.png and b/public/images/pokemon/icons/variant/1/84_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/85-f_1.png b/public/images/pokemon/icons/variant/1/85-f_1.png
new file mode 100644
index 00000000000..acd9943420b
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/85-f_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/85-f_2.png b/public/images/pokemon/icons/variant/1/85-f_2.png
new file mode 100644
index 00000000000..ff1841c63c5
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/85-f_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/85-f_3.png b/public/images/pokemon/icons/variant/1/85-f_3.png
new file mode 100644
index 00000000000..6c166af1f78
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/85-f_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/85_1.png b/public/images/pokemon/icons/variant/1/85_1.png
index 7fd63b7268f..acd9943420b 100644
Binary files a/public/images/pokemon/icons/variant/1/85_1.png and b/public/images/pokemon/icons/variant/1/85_1.png differ
diff --git a/public/images/pokemon/icons/variant/1/85_2.png b/public/images/pokemon/icons/variant/1/85_2.png
index f17bdee3edb..1efa6f238f3 100644
Binary files a/public/images/pokemon/icons/variant/1/85_2.png and b/public/images/pokemon/icons/variant/1/85_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/85_3.png b/public/images/pokemon/icons/variant/1/85_3.png
index af16ce4828b..dd2a8a32d1f 100644
Binary files a/public/images/pokemon/icons/variant/1/85_3.png and b/public/images/pokemon/icons/variant/1/85_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/98_2.png b/public/images/pokemon/icons/variant/1/98_2.png
new file mode 100644
index 00000000000..ea5f1ebf5de
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/98_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/98_3.png b/public/images/pokemon/icons/variant/1/98_3.png
new file mode 100644
index 00000000000..71014d948f4
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/98_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/99-gigantamax_2.png b/public/images/pokemon/icons/variant/1/99-gigantamax_2.png
new file mode 100644
index 00000000000..f56f7edbfe4
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/99-gigantamax_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/99-gigantamax_3.png b/public/images/pokemon/icons/variant/1/99-gigantamax_3.png
new file mode 100644
index 00000000000..dbd95345af8
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/99-gigantamax_3.png differ
diff --git a/public/images/pokemon/icons/variant/1/99_2.png b/public/images/pokemon/icons/variant/1/99_2.png
new file mode 100644
index 00000000000..fff774d519c
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/99_2.png differ
diff --git a/public/images/pokemon/icons/variant/1/99_3.png b/public/images/pokemon/icons/variant/1/99_3.png
new file mode 100644
index 00000000000..f5274f2745b
Binary files /dev/null and b/public/images/pokemon/icons/variant/1/99_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/173_2.png b/public/images/pokemon/icons/variant/2/173_2.png
new file mode 100644
index 00000000000..3ffaaca89dd
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/173_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/182_2.png b/public/images/pokemon/icons/variant/2/182_2.png
new file mode 100644
index 00000000000..f39877edc1e
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/182_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/182_3.png b/public/images/pokemon/icons/variant/2/182_3.png
new file mode 100644
index 00000000000..9830d956812
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/182_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/185_2.png b/public/images/pokemon/icons/variant/2/185_2.png
new file mode 100644
index 00000000000..810aa3354ed
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/185_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/185_3.png b/public/images/pokemon/icons/variant/2/185_3.png
new file mode 100644
index 00000000000..5de578717a5
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/185_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/190_2.png b/public/images/pokemon/icons/variant/2/190_2.png
new file mode 100644
index 00000000000..eced210ae5c
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/190_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/190_3.png b/public/images/pokemon/icons/variant/2/190_3.png
new file mode 100644
index 00000000000..ad3523ceb6b
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/190_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/193_2.png b/public/images/pokemon/icons/variant/2/193_2.png
new file mode 100644
index 00000000000..63de94c2fb1
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/193_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/193_3.png b/public/images/pokemon/icons/variant/2/193_3.png
new file mode 100644
index 00000000000..defaaa1ece3
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/193_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/199_2.png b/public/images/pokemon/icons/variant/2/199_2.png
new file mode 100644
index 00000000000..050cb7836e6
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/199_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/199_3.png b/public/images/pokemon/icons/variant/2/199_3.png
new file mode 100644
index 00000000000..f3c63115f78
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/199_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/203_2.png b/public/images/pokemon/icons/variant/2/203_2.png
new file mode 100644
index 00000000000..8ca96e9d14c
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/203_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/203_3.png b/public/images/pokemon/icons/variant/2/203_3.png
new file mode 100644
index 00000000000..8fcb3c7eb3e
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/203_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/213_2.png b/public/images/pokemon/icons/variant/2/213_2.png
new file mode 100644
index 00000000000..832fe44e1cd
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/213_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/213_3.png b/public/images/pokemon/icons/variant/2/213_3.png
new file mode 100644
index 00000000000..6a0edbc1bff
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/213_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/216_1.png b/public/images/pokemon/icons/variant/2/216_1.png
new file mode 100644
index 00000000000..141771743e7
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/216_1.png differ
diff --git a/public/images/pokemon/icons/variant/2/230_2.png b/public/images/pokemon/icons/variant/2/230_2.png
new file mode 100644
index 00000000000..531b9e30568
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/230_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/230_3.png b/public/images/pokemon/icons/variant/2/230_3.png
new file mode 100644
index 00000000000..334483d449e
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/230_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/233_2.png b/public/images/pokemon/icons/variant/2/233_2.png
new file mode 100644
index 00000000000..b36994631dc
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/233_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/233_3.png b/public/images/pokemon/icons/variant/2/233_3.png
new file mode 100644
index 00000000000..09d9ae1fe59
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/233_3.png differ
diff --git a/public/images/pokemon/icons/variant/2/240_2.png b/public/images/pokemon/icons/variant/2/240_2.png
new file mode 100644
index 00000000000..118ad1f4fd2
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/240_2.png differ
diff --git a/public/images/pokemon/icons/variant/2/240_3.png b/public/images/pokemon/icons/variant/2/240_3.png
new file mode 100644
index 00000000000..5d21cedde2d
Binary files /dev/null and b/public/images/pokemon/icons/variant/2/240_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/255-f_2.png b/public/images/pokemon/icons/variant/3/255-f_2.png
new file mode 100644
index 00000000000..adf8c6ea8bc
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/255-f_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/255-f_3.png b/public/images/pokemon/icons/variant/3/255-f_3.png
new file mode 100644
index 00000000000..48fc5610e94
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/255-f_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
new file mode 100644
index 00000000000..adf8c6ea8bc
Binary files /dev/null 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
new file mode 100644
index 00000000000..6ed47e69afa
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/255_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/256-f_2.png b/public/images/pokemon/icons/variant/3/256-f_2.png
new file mode 100644
index 00000000000..b372f1ff981
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/256-f_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/256-f_3.png b/public/images/pokemon/icons/variant/3/256-f_3.png
new file mode 100644
index 00000000000..5d36370218b
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/256-f_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
new file mode 100644
index 00000000000..b372f1ff981
Binary files /dev/null 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
new file mode 100644
index 00000000000..0c529f838ba
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/256_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/257-f_2.png b/public/images/pokemon/icons/variant/3/257-f_2.png
new file mode 100644
index 00000000000..05dec9629ed
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257-f_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/257-f_3.png b/public/images/pokemon/icons/variant/3/257-f_3.png
new file mode 100644
index 00000000000..df9584837b0
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257-f_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/257-mega_2.png b/public/images/pokemon/icons/variant/3/257-mega_2.png
new file mode 100644
index 00000000000..e04d8d8e1fe
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257-mega_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/257-mega_3.png b/public/images/pokemon/icons/variant/3/257-mega_3.png
new file mode 100644
index 00000000000..f32e684a503
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257-mega_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/257_2.png b/public/images/pokemon/icons/variant/3/257_2.png
new file mode 100644
index 00000000000..305fab85238
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/257_3.png b/public/images/pokemon/icons/variant/3/257_3.png
new file mode 100644
index 00000000000..c7853c73d4f
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/257_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/261_2.png b/public/images/pokemon/icons/variant/3/261_2.png
new file mode 100644
index 00000000000..31d46738062
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/261_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/261_3.png b/public/images/pokemon/icons/variant/3/261_3.png
new file mode 100644
index 00000000000..a00afc04114
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/261_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/262_2.png b/public/images/pokemon/icons/variant/3/262_2.png
new file mode 100644
index 00000000000..0490ad8b552
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/262_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/262_3.png b/public/images/pokemon/icons/variant/3/262_3.png
new file mode 100644
index 00000000000..eec06b91c5c
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/262_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/327_2.png b/public/images/pokemon/icons/variant/3/327_2.png
new file mode 100644
index 00000000000..3013d175e7b
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/327_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/327_3.png b/public/images/pokemon/icons/variant/3/327_3.png
new file mode 100644
index 00000000000..85d494eb661
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/327_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/337_2.png b/public/images/pokemon/icons/variant/3/337_2.png
new file mode 100644
index 00000000000..feb9de9766c
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/337_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/337_3.png b/public/images/pokemon/icons/variant/3/337_3.png
new file mode 100644
index 00000000000..456109305ad
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/337_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/352_1.png b/public/images/pokemon/icons/variant/3/352_1.png
index f6e0f96024a..2368c95ed59 100644
Binary files a/public/images/pokemon/icons/variant/3/352_1.png and b/public/images/pokemon/icons/variant/3/352_1.png differ
diff --git a/public/images/pokemon/icons/variant/3/352_2.png b/public/images/pokemon/icons/variant/3/352_2.png
index 88d67f91e1a..d0776e840c3 100644
Binary files a/public/images/pokemon/icons/variant/3/352_2.png and b/public/images/pokemon/icons/variant/3/352_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/352_3.png b/public/images/pokemon/icons/variant/3/352_3.png
index e4f659efac0..36189d852a2 100644
Binary files a/public/images/pokemon/icons/variant/3/352_3.png and b/public/images/pokemon/icons/variant/3/352_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/370_2.png b/public/images/pokemon/icons/variant/3/370_2.png
new file mode 100644
index 00000000000..97be23cb47b
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/370_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/370_3.png b/public/images/pokemon/icons/variant/3/370_3.png
new file mode 100644
index 00000000000..39bbbf7277f
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/370_3.png differ
diff --git a/public/images/pokemon/icons/variant/3/382-primal_2.png b/public/images/pokemon/icons/variant/3/382-primal_2.png
index 2380442f03d..ef646e58170 100644
Binary files a/public/images/pokemon/icons/variant/3/382-primal_2.png and b/public/images/pokemon/icons/variant/3/382-primal_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/382_2.png b/public/images/pokemon/icons/variant/3/382_2.png
index 040d5b47203..987672917b5 100644
Binary files a/public/images/pokemon/icons/variant/3/382_2.png and b/public/images/pokemon/icons/variant/3/382_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/427_2.png b/public/images/pokemon/icons/variant/3/427_2.png
new file mode 100644
index 00000000000..ceaf11acb48
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/427_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/427_3.png b/public/images/pokemon/icons/variant/3/427_3.png
new file mode 100644
index 00000000000..5972f5e9489
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/427_3.png 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
new file mode 100644
index 00000000000..32c3293a796
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/428-mega_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/428_2.png b/public/images/pokemon/icons/variant/3/428_2.png
new file mode 100644
index 00000000000..5b325f3256a
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/428_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/429_1.png b/public/images/pokemon/icons/variant/3/429_1.png
new file mode 100644
index 00000000000..667f389f5c1
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/429_1.png differ
diff --git a/public/images/pokemon/icons/variant/3/429_2.png b/public/images/pokemon/icons/variant/3/429_2.png
new file mode 100644
index 00000000000..85cd47bd85f
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/429_2.png differ
diff --git a/public/images/pokemon/icons/variant/3/429_3.png b/public/images/pokemon/icons/variant/3/429_3.png
new file mode 100644
index 00000000000..bb9b2384514
Binary files /dev/null and b/public/images/pokemon/icons/variant/3/429_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/393_2.png b/public/images/pokemon/icons/variant/4/393_2.png
new file mode 100644
index 00000000000..e26a72dd850
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/393_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/393_3.png b/public/images/pokemon/icons/variant/4/393_3.png
new file mode 100644
index 00000000000..7fcd8815e4f
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/393_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/394_2.png b/public/images/pokemon/icons/variant/4/394_2.png
new file mode 100644
index 00000000000..637cc289736
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/394_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/394_3.png b/public/images/pokemon/icons/variant/4/394_3.png
new file mode 100644
index 00000000000..2a471dcc51e
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/394_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/395_2.png b/public/images/pokemon/icons/variant/4/395_2.png
new file mode 100644
index 00000000000..733fede6d6b
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/395_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/395_3.png b/public/images/pokemon/icons/variant/4/395_3.png
new file mode 100644
index 00000000000..43bd23c5c58
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/395_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/418_2.png b/public/images/pokemon/icons/variant/4/418_2.png
new file mode 100644
index 00000000000..7712de363c1
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/418_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/418_3.png b/public/images/pokemon/icons/variant/4/418_3.png
new file mode 100644
index 00000000000..c400f59a7ab
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/418_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/419_2.png b/public/images/pokemon/icons/variant/4/419_2.png
new file mode 100644
index 00000000000..a95721362bd
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/419_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/419_3.png b/public/images/pokemon/icons/variant/4/419_3.png
new file mode 100644
index 00000000000..89fa83adf14
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/419_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/424_2.png b/public/images/pokemon/icons/variant/4/424_2.png
new file mode 100644
index 00000000000..356858005eb
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/424_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/424_3.png b/public/images/pokemon/icons/variant/4/424_3.png
new file mode 100644
index 00000000000..78e066ba68c
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/424_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/438_2.png b/public/images/pokemon/icons/variant/4/438_2.png
new file mode 100644
index 00000000000..17e9774a8da
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/438_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/438_3.png b/public/images/pokemon/icons/variant/4/438_3.png
new file mode 100644
index 00000000000..d5022d89135
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/438_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/441_2.png b/public/images/pokemon/icons/variant/4/441_2.png
new file mode 100644
index 00000000000..de8e6a96d56
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/441_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/441_3.png b/public/images/pokemon/icons/variant/4/441_3.png
new file mode 100644
index 00000000000..1ad59d63241
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/441_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/456_2.png b/public/images/pokemon/icons/variant/4/456_2.png
new file mode 100644
index 00000000000..c3817b56fb4
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/456_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/456_3.png b/public/images/pokemon/icons/variant/4/456_3.png
new file mode 100644
index 00000000000..1af49a05518
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/456_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/457_2.png b/public/images/pokemon/icons/variant/4/457_2.png
new file mode 100644
index 00000000000..8f120cc478d
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/457_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/457_3.png b/public/images/pokemon/icons/variant/4/457_3.png
new file mode 100644
index 00000000000..e65119dd11a
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/457_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/467_2.png b/public/images/pokemon/icons/variant/4/467_2.png
new file mode 100644
index 00000000000..46395657b20
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/467_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/467_3.png b/public/images/pokemon/icons/variant/4/467_3.png
new file mode 100644
index 00000000000..0a5821dc61f
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/467_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/469_2.png b/public/images/pokemon/icons/variant/4/469_2.png
new file mode 100644
index 00000000000..8eb2dfece00
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/469_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/469_3.png b/public/images/pokemon/icons/variant/4/469_3.png
new file mode 100644
index 00000000000..10f4c01442b
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/469_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/474_2.png b/public/images/pokemon/icons/variant/4/474_2.png
new file mode 100644
index 00000000000..cbc6b709c8d
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/474_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/474_3.png b/public/images/pokemon/icons/variant/4/474_3.png
new file mode 100644
index 00000000000..5cc48efdaf2
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/474_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-fan_2.png b/public/images/pokemon/icons/variant/4/479-fan_2.png
new file mode 100644
index 00000000000..2d421219259
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-fan_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-fan_3.png b/public/images/pokemon/icons/variant/4/479-fan_3.png
new file mode 100644
index 00000000000..590e3c7e7a2
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-fan_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-frost_2.png b/public/images/pokemon/icons/variant/4/479-frost_2.png
new file mode 100644
index 00000000000..abe9280ab03
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-frost_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-frost_3.png b/public/images/pokemon/icons/variant/4/479-frost_3.png
new file mode 100644
index 00000000000..55576d669da
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-frost_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-heat_2.png b/public/images/pokemon/icons/variant/4/479-heat_2.png
new file mode 100644
index 00000000000..9a440f95b3b
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-heat_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-heat_3.png b/public/images/pokemon/icons/variant/4/479-heat_3.png
new file mode 100644
index 00000000000..5c9482a5ff8
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-heat_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-mow_2.png b/public/images/pokemon/icons/variant/4/479-mow_2.png
new file mode 100644
index 00000000000..9a785ccafd4
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-mow_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-mow_3.png b/public/images/pokemon/icons/variant/4/479-mow_3.png
new file mode 100644
index 00000000000..ac6b5121458
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-mow_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-wash_2.png b/public/images/pokemon/icons/variant/4/479-wash_2.png
new file mode 100644
index 00000000000..8f09f7b8992
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-wash_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479-wash_3.png b/public/images/pokemon/icons/variant/4/479-wash_3.png
new file mode 100644
index 00000000000..8b5e3bb99fb
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479-wash_3.png differ
diff --git a/public/images/pokemon/icons/variant/4/479_2.png b/public/images/pokemon/icons/variant/4/479_2.png
new file mode 100644
index 00000000000..3e9c85463b8
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479_2.png differ
diff --git a/public/images/pokemon/icons/variant/4/479_3.png b/public/images/pokemon/icons/variant/4/479_3.png
new file mode 100644
index 00000000000..ec7a623f0fe
Binary files /dev/null and b/public/images/pokemon/icons/variant/4/479_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/524_2.png b/public/images/pokemon/icons/variant/5/524_2.png
new file mode 100644
index 00000000000..a93dcb3c02f
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/524_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/524_3.png b/public/images/pokemon/icons/variant/5/524_3.png
new file mode 100644
index 00000000000..25f6deb2438
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/524_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/525_2.png b/public/images/pokemon/icons/variant/5/525_2.png
new file mode 100644
index 00000000000..794d8596d0d
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/525_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/525_3.png b/public/images/pokemon/icons/variant/5/525_3.png
new file mode 100644
index 00000000000..8b96d696d69
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/525_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/526_2.png b/public/images/pokemon/icons/variant/5/526_2.png
new file mode 100644
index 00000000000..13b1cf0d0ac
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/526_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/526_3.png b/public/images/pokemon/icons/variant/5/526_3.png
new file mode 100644
index 00000000000..e563cfc41be
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/526_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/546_2.png b/public/images/pokemon/icons/variant/5/546_2.png
index e5db5b4f74f..3b5ab0b300b 100644
Binary files a/public/images/pokemon/icons/variant/5/546_2.png and b/public/images/pokemon/icons/variant/5/546_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/546_3.png b/public/images/pokemon/icons/variant/5/546_3.png
index 126bd405d95..2bc5d147c8c 100644
Binary files a/public/images/pokemon/icons/variant/5/546_3.png and b/public/images/pokemon/icons/variant/5/546_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/556_2.png b/public/images/pokemon/icons/variant/5/556_2.png
new file mode 100644
index 00000000000..06c906d32d8
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/556_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/556_3.png b/public/images/pokemon/icons/variant/5/556_3.png
new file mode 100644
index 00000000000..d617014f75f
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/556_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/571_2.png b/public/images/pokemon/icons/variant/5/571_2.png
index 1e238ee619d..8153cdb98e9 100644
Binary files a/public/images/pokemon/icons/variant/5/571_2.png and b/public/images/pokemon/icons/variant/5/571_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/571_3.png b/public/images/pokemon/icons/variant/5/571_3.png
index 528bfc4b719..f8602ad7aff 100644
Binary files a/public/images/pokemon/icons/variant/5/571_3.png and b/public/images/pokemon/icons/variant/5/571_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/594_2.png b/public/images/pokemon/icons/variant/5/594_2.png
new file mode 100644
index 00000000000..a646222959f
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/594_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/594_3.png b/public/images/pokemon/icons/variant/5/594_3.png
new file mode 100644
index 00000000000..8fb7c319cf2
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/594_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/618_2.png b/public/images/pokemon/icons/variant/5/618_2.png
new file mode 100644
index 00000000000..8b134146ccf
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/618_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/618_3.png b/public/images/pokemon/icons/variant/5/618_3.png
new file mode 100644
index 00000000000..fd9f3994b22
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/618_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/631_2.png b/public/images/pokemon/icons/variant/5/631_2.png
new file mode 100644
index 00000000000..564fb16c4a0
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/631_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/631_3.png b/public/images/pokemon/icons/variant/5/631_3.png
new file mode 100644
index 00000000000..08779f3e130
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/631_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/636_2.png b/public/images/pokemon/icons/variant/5/636_2.png
new file mode 100644
index 00000000000..57a29619e10
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/636_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/636_3.png b/public/images/pokemon/icons/variant/5/636_3.png
new file mode 100644
index 00000000000..d63a8d77787
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/636_3.png differ
diff --git a/public/images/pokemon/icons/variant/5/637_2.png b/public/images/pokemon/icons/variant/5/637_2.png
new file mode 100644
index 00000000000..e44609653b7
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/637_2.png differ
diff --git a/public/images/pokemon/icons/variant/5/637_3.png b/public/images/pokemon/icons/variant/5/637_3.png
new file mode 100644
index 00000000000..29d176bea57
Binary files /dev/null and b/public/images/pokemon/icons/variant/5/637_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/2670_2.png b/public/images/pokemon/icons/variant/6/2670_2.png
new file mode 100644
index 00000000000..4f9321285d4
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/2670_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/2670_3.png b/public/images/pokemon/icons/variant/6/2670_3.png
new file mode 100644
index 00000000000..ef884ede7c8
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/2670_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-blue_2.png b/public/images/pokemon/icons/variant/6/669-blue_2.png
new file mode 100644
index 00000000000..d6f545f8db4
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-blue_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-blue_3.png b/public/images/pokemon/icons/variant/6/669-blue_3.png
new file mode 100644
index 00000000000..72df3b2555a
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-blue_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-orange_2.png b/public/images/pokemon/icons/variant/6/669-orange_2.png
new file mode 100644
index 00000000000..d2fe737b886
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-orange_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-orange_3.png b/public/images/pokemon/icons/variant/6/669-orange_3.png
new file mode 100644
index 00000000000..886794562fb
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-orange_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-red_2.png b/public/images/pokemon/icons/variant/6/669-red_2.png
new file mode 100644
index 00000000000..b86bc30ad3d
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-red_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-red_3.png b/public/images/pokemon/icons/variant/6/669-red_3.png
new file mode 100644
index 00000000000..7400bf698d3
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-red_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-white_2.png b/public/images/pokemon/icons/variant/6/669-white_2.png
new file mode 100644
index 00000000000..d3cc24cdb4b
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-white_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-white_3.png b/public/images/pokemon/icons/variant/6/669-white_3.png
new file mode 100644
index 00000000000..fab0591042d
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-white_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-yellow_2.png b/public/images/pokemon/icons/variant/6/669-yellow_2.png
new file mode 100644
index 00000000000..87feaaf1f1d
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-yellow_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/669-yellow_3.png b/public/images/pokemon/icons/variant/6/669-yellow_3.png
new file mode 100644
index 00000000000..41fe7eddd72
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/669-yellow_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-blue_2.png b/public/images/pokemon/icons/variant/6/670-blue_2.png
new file mode 100644
index 00000000000..650685edd9a
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-blue_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-blue_3.png b/public/images/pokemon/icons/variant/6/670-blue_3.png
new file mode 100644
index 00000000000..50a0051db07
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-blue_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-orange_2.png b/public/images/pokemon/icons/variant/6/670-orange_2.png
new file mode 100644
index 00000000000..349923809b0
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-orange_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-orange_3.png b/public/images/pokemon/icons/variant/6/670-orange_3.png
new file mode 100644
index 00000000000..5b49789aa16
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-orange_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-red_2.png b/public/images/pokemon/icons/variant/6/670-red_2.png
new file mode 100644
index 00000000000..e50036769d8
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-red_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-red_3.png b/public/images/pokemon/icons/variant/6/670-red_3.png
new file mode 100644
index 00000000000..591e95e3ea8
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-red_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-white_2.png b/public/images/pokemon/icons/variant/6/670-white_2.png
new file mode 100644
index 00000000000..6c5fe0d1770
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-white_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-white_3.png b/public/images/pokemon/icons/variant/6/670-white_3.png
new file mode 100644
index 00000000000..73a1767a90f
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-white_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-yellow_2.png b/public/images/pokemon/icons/variant/6/670-yellow_2.png
new file mode 100644
index 00000000000..1cc3cfddf3e
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-yellow_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/670-yellow_3.png b/public/images/pokemon/icons/variant/6/670-yellow_3.png
new file mode 100644
index 00000000000..6152ca04d95
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/670-yellow_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-blue_2.png b/public/images/pokemon/icons/variant/6/671-blue_2.png
new file mode 100644
index 00000000000..44de46ce581
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-blue_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-blue_3.png b/public/images/pokemon/icons/variant/6/671-blue_3.png
new file mode 100644
index 00000000000..9546669842e
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-blue_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-orange_2.png b/public/images/pokemon/icons/variant/6/671-orange_2.png
new file mode 100644
index 00000000000..419fc8d4781
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-orange_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-orange_3.png b/public/images/pokemon/icons/variant/6/671-orange_3.png
new file mode 100644
index 00000000000..dc5730f086e
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-orange_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-red_2.png b/public/images/pokemon/icons/variant/6/671-red_2.png
new file mode 100644
index 00000000000..0a2f5d20fd6
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-red_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-red_3.png b/public/images/pokemon/icons/variant/6/671-red_3.png
new file mode 100644
index 00000000000..62b6be12943
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-red_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-white_2.png b/public/images/pokemon/icons/variant/6/671-white_2.png
new file mode 100644
index 00000000000..7bb347d0799
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-white_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-white_3.png b/public/images/pokemon/icons/variant/6/671-white_3.png
new file mode 100644
index 00000000000..9de027625c2
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-white_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-yellow_2.png b/public/images/pokemon/icons/variant/6/671-yellow_2.png
new file mode 100644
index 00000000000..48aea0a7d99
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-yellow_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/671-yellow_3.png b/public/images/pokemon/icons/variant/6/671-yellow_3.png
new file mode 100644
index 00000000000..57c17f66d77
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/671-yellow_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/677_2.png b/public/images/pokemon/icons/variant/6/677_2.png
new file mode 100644
index 00000000000..df72af379d6
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/677_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/677_3.png b/public/images/pokemon/icons/variant/6/677_3.png
new file mode 100644
index 00000000000..3eaf9b54ef8
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/677_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/678-female_2.png b/public/images/pokemon/icons/variant/6/678-female_2.png
new file mode 100644
index 00000000000..220e8a97077
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/678-female_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/678-female_3.png b/public/images/pokemon/icons/variant/6/678-female_3.png
new file mode 100644
index 00000000000..d27883df1ae
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/678-female_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/678_2.png b/public/images/pokemon/icons/variant/6/678_2.png
new file mode 100644
index 00000000000..9c625e911c0
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/678_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/678_3.png b/public/images/pokemon/icons/variant/6/678_3.png
new file mode 100644
index 00000000000..372759b3aa4
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/678_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/698_2.png b/public/images/pokemon/icons/variant/6/698_2.png
new file mode 100644
index 00000000000..61b7d962358
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/698_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/698_3.png b/public/images/pokemon/icons/variant/6/698_3.png
new file mode 100644
index 00000000000..8165d2686d7
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/698_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/699_2.png b/public/images/pokemon/icons/variant/6/699_2.png
new file mode 100644
index 00000000000..9bf9f4c0441
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/699_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/699_3.png b/public/images/pokemon/icons/variant/6/699_3.png
new file mode 100644
index 00000000000..d6b861addbd
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/699_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/702_2.png b/public/images/pokemon/icons/variant/6/702_2.png
new file mode 100644
index 00000000000..d7b70505077
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/702_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/702_3.png b/public/images/pokemon/icons/variant/6/702_3.png
new file mode 100644
index 00000000000..91e443c323d
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/702_3.png differ
diff --git a/public/images/pokemon/icons/variant/6/703_2.png b/public/images/pokemon/icons/variant/6/703_2.png
new file mode 100644
index 00000000000..e30a1896440
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/703_2.png differ
diff --git a/public/images/pokemon/icons/variant/6/703_3.png b/public/images/pokemon/icons/variant/6/703_3.png
new file mode 100644
index 00000000000..ac69636d1ec
Binary files /dev/null and b/public/images/pokemon/icons/variant/6/703_3.png differ
diff --git a/public/images/pokemon/icons/variant/7/2027_2.png b/public/images/pokemon/icons/variant/7/2027_2.png
new file mode 100644
index 00000000000..33e95951d2e
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2027_2.png differ
diff --git a/public/images/pokemon/icons/variant/7/2027_3.png b/public/images/pokemon/icons/variant/7/2027_3.png
new file mode 100644
index 00000000000..19849e146a3
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2027_3.png differ
diff --git a/public/images/pokemon/icons/variant/7/2028_2.png b/public/images/pokemon/icons/variant/7/2028_2.png
new file mode 100644
index 00000000000..a05e916a6cd
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2028_2.png differ
diff --git a/public/images/pokemon/icons/variant/7/2028_3.png b/public/images/pokemon/icons/variant/7/2028_3.png
new file mode 100644
index 00000000000..3521427080f
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/2028_3.png differ
diff --git a/public/images/pokemon/icons/variant/7/803_2.png b/public/images/pokemon/icons/variant/7/803_2.png
new file mode 100644
index 00000000000..3e20203fdef
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/803_2.png differ
diff --git a/public/images/pokemon/icons/variant/7/803_3.png b/public/images/pokemon/icons/variant/7/803_3.png
new file mode 100644
index 00000000000..3225ab47b11
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/803_3.png differ
diff --git a/public/images/pokemon/icons/variant/7/804_2.png b/public/images/pokemon/icons/variant/7/804_2.png
new file mode 100644
index 00000000000..aa5a0541637
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/804_2.png differ
diff --git a/public/images/pokemon/icons/variant/7/804_3.png b/public/images/pokemon/icons/variant/7/804_3.png
new file mode 100644
index 00000000000..a4fc1828c29
Binary files /dev/null and b/public/images/pokemon/icons/variant/7/804_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/1003_2.png b/public/images/pokemon/icons/variant/8/1003_2.png
new file mode 100644
index 00000000000..2cbc2f4e26a
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1003_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/1003_3.png b/public/images/pokemon/icons/variant/8/1003_3.png
new file mode 100644
index 00000000000..36e80525b0f
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1003_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/1006_2.png b/public/images/pokemon/icons/variant/8/1006_2.png
new file mode 100644
index 00000000000..65f7ce87a83
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1006_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/1006_3.png b/public/images/pokemon/icons/variant/8/1006_3.png
new file mode 100644
index 00000000000..97240b73609
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1006_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/1010_2.png b/public/images/pokemon/icons/variant/8/1010_2.png
new file mode 100644
index 00000000000..7e20810c2b4
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1010_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/1010_3.png b/public/images/pokemon/icons/variant/8/1010_3.png
new file mode 100644
index 00000000000..ff6cd6e71b0
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/1010_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/4079_2.png b/public/images/pokemon/icons/variant/8/4079_2.png
new file mode 100644
index 00000000000..7ae8cf28c75
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4079_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/4079_3.png b/public/images/pokemon/icons/variant/8/4079_3.png
new file mode 100644
index 00000000000..95133e719e7
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4079_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/4080_2.png b/public/images/pokemon/icons/variant/8/4080_2.png
new file mode 100644
index 00000000000..cfeffb41ca7
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4080_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/4080_3.png b/public/images/pokemon/icons/variant/8/4080_3.png
new file mode 100644
index 00000000000..36e4fd9e55a
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4080_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/4199_2.png b/public/images/pokemon/icons/variant/8/4199_2.png
new file mode 100644
index 00000000000..151aad6c285
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4199_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/4199_3.png b/public/images/pokemon/icons/variant/8/4199_3.png
new file mode 100644
index 00000000000..72e730de86e
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4199_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/4562_2.png b/public/images/pokemon/icons/variant/8/4562_2.png
new file mode 100644
index 00000000000..3b8add56b50
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4562_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/4562_3.png b/public/images/pokemon/icons/variant/8/4562_3.png
new file mode 100644
index 00000000000..b3cfdd0d7c4
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/4562_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/867_2.png b/public/images/pokemon/icons/variant/8/867_2.png
new file mode 100644
index 00000000000..7330147db2a
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/867_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/867_3.png b/public/images/pokemon/icons/variant/8/867_3.png
new file mode 100644
index 00000000000..f93d7c8bfb4
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/867_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/880_2.png b/public/images/pokemon/icons/variant/8/880_2.png
new file mode 100644
index 00000000000..be07577cd25
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/880_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/880_3.png b/public/images/pokemon/icons/variant/8/880_3.png
new file mode 100644
index 00000000000..e02ed7193ad
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/880_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/881_2.png b/public/images/pokemon/icons/variant/8/881_2.png
new file mode 100644
index 00000000000..1d861c0a9f6
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/881_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/881_3.png b/public/images/pokemon/icons/variant/8/881_3.png
new file mode 100644
index 00000000000..a88bfb50dab
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/881_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/882_2.png b/public/images/pokemon/icons/variant/8/882_2.png
new file mode 100644
index 00000000000..d80cda17872
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/882_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/882_3.png b/public/images/pokemon/icons/variant/8/882_3.png
new file mode 100644
index 00000000000..14715f47721
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/882_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/883_2.png b/public/images/pokemon/icons/variant/8/883_2.png
new file mode 100644
index 00000000000..18215b74d5b
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/883_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/883_3.png b/public/images/pokemon/icons/variant/8/883_3.png
new file mode 100644
index 00000000000..25172d687e7
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/883_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/888-crowned_2.png b/public/images/pokemon/icons/variant/8/888-crowned_2.png
new file mode 100644
index 00000000000..51e654cc108
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/888-crowned_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/888-crowned_3.png b/public/images/pokemon/icons/variant/8/888-crowned_3.png
new file mode 100644
index 00000000000..8e45189e15f
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/888-crowned_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/888_2.png b/public/images/pokemon/icons/variant/8/888_2.png
new file mode 100644
index 00000000000..58f023ed3ea
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/888_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/888_3.png b/public/images/pokemon/icons/variant/8/888_3.png
new file mode 100644
index 00000000000..336cbecadd0
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/888_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/889-crowned_2.png b/public/images/pokemon/icons/variant/8/889-crowned_2.png
new file mode 100644
index 00000000000..3a72aa9c587
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/889-crowned_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/889-crowned_3.png b/public/images/pokemon/icons/variant/8/889-crowned_3.png
new file mode 100644
index 00000000000..81929666ba1
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/889-crowned_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/889_2.png b/public/images/pokemon/icons/variant/8/889_2.png
new file mode 100644
index 00000000000..91bde36e526
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/889_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/889_3.png b/public/images/pokemon/icons/variant/8/889_3.png
new file mode 100644
index 00000000000..93b547d3e03
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/889_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
new file mode 100644
index 00000000000..73f71bd49d3
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/909_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/909_3.png b/public/images/pokemon/icons/variant/8/909_3.png
new file mode 100644
index 00000000000..5fb79e5b917
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/909_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/912_2.png b/public/images/pokemon/icons/variant/8/912_2.png
new file mode 100644
index 00000000000..80bc8fb2c46
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/912_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/912_3.png b/public/images/pokemon/icons/variant/8/912_3.png
new file mode 100644
index 00000000000..c52bdd2fb73
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/912_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/913_2.png b/public/images/pokemon/icons/variant/8/913_2.png
new file mode 100644
index 00000000000..bb39165f68d
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/913_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/913_3.png b/public/images/pokemon/icons/variant/8/913_3.png
new file mode 100644
index 00000000000..71cb697ee3b
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/913_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/914_2.png b/public/images/pokemon/icons/variant/8/914_2.png
new file mode 100644
index 00000000000..ecf60fef07f
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/914_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/914_3.png b/public/images/pokemon/icons/variant/8/914_3.png
new file mode 100644
index 00000000000..c7ea5441d4b
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/914_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/940_2.png b/public/images/pokemon/icons/variant/8/940_2.png
new file mode 100644
index 00000000000..2344679d987
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/940_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/940_3.png b/public/images/pokemon/icons/variant/8/940_3.png
new file mode 100644
index 00000000000..56a17f4d4dd
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/940_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/941_2.png b/public/images/pokemon/icons/variant/8/941_2.png
new file mode 100644
index 00000000000..57ed730a37c
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/941_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/941_3.png b/public/images/pokemon/icons/variant/8/941_3.png
new file mode 100644
index 00000000000..6d0dea04b0e
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/941_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/953_2.png b/public/images/pokemon/icons/variant/8/953_2.png
new file mode 100644
index 00000000000..8b200581cff
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/953_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/953_3.png b/public/images/pokemon/icons/variant/8/953_3.png
new file mode 100644
index 00000000000..0e35868ebc7
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/953_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/954_2.png b/public/images/pokemon/icons/variant/8/954_2.png
new file mode 100644
index 00000000000..7e3607698bf
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/954_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/954_3.png b/public/images/pokemon/icons/variant/8/954_3.png
new file mode 100644
index 00000000000..affd07a9df9
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/954_3.png differ
diff --git a/public/images/pokemon/icons/variant/8/981_2.png b/public/images/pokemon/icons/variant/8/981_2.png
new file mode 100644
index 00000000000..1bceb5c2291
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/981_2.png differ
diff --git a/public/images/pokemon/icons/variant/8/981_3.png b/public/images/pokemon/icons/variant/8/981_3.png
new file mode 100644
index 00000000000..217b607125e
Binary files /dev/null and b/public/images/pokemon/icons/variant/8/981_3.png differ
diff --git a/public/images/pokemon/shiny/279.png b/public/images/pokemon/shiny/279.png
index c43634e8602..26dba547913 100644
Binary files a/public/images/pokemon/shiny/279.png and b/public/images/pokemon/shiny/279.png differ
diff --git a/public/images/pokemon/variant/279.json b/public/images/pokemon/variant/279.json
index a7b97ac3161..5c193f7939b 100644
--- a/public/images/pokemon/variant/279.json
+++ b/public/images/pokemon/variant/279.json
@@ -1,38 +1,49 @@
{
"0": {
+ "bc4524": "af5457",
"31638c": "324a26",
- "101010": "101010",
"5aa5ce": "40683c",
- "a5e6ff": "b6d9ac",
- "7bceef": "789c6e",
- "ced6ef": "c09e99",
- "737384": "774644",
+ "ce4252": "af2c4f",
"ffffff": "f1dcd8",
"8c4231": "420b0c",
- "ffde4a": "c66f68",
- "c57b31": "551917",
"ffffad": "f4bfb6",
+ "ffde4a": "c66f68",
+ "7bceef": "789c6e",
+ "a5e6ff": "b6d9ac",
+ "737384": "774644",
"f7b531": "af5457",
- "ce4252": "af2c4f",
- "bc4524": "af5457",
- "00e5e7": "00e5e7"
+ "c57b31": "551917",
+ "ced6ef": "c09e99"
},
"1": {
+ "bc4524": "3d325e",
"31638c": "143a72",
- "101010": "101010",
"5aa5ce": "4060bc",
- "a5e6ff": "b4b3ff",
- "7bceef": "657ddf",
- "ced6ef": "a8b5dd",
- "737384": "737384",
+ "ce4252": "b75558",
"ffffff": "e5ecff",
"8c4231": "17103f",
- "ffde4a": "534e72",
- "c57b31": "2a1f50",
"ffffad": "87879b",
+ "ffde4a": "534e72",
+ "7bceef": "657ddf",
+ "a5e6ff": "b4b3ff",
"f7b531": "3d325e",
- "ce4252": "b75558",
- "bc4524": "3d325e",
- "00e5e7": "00e5e7"
+ "c57b31": "2a1f50",
+ "ced6ef": "a8b5dd"
+ },
+ "2": {
+ "ce4252": "215991",
+ "ffde4a": "f16f40",
+ "ffffad": "ffb274",
+ "737384": "884c43",
+ "c57b31": "761c03",
+ "7bceef": "be3d2f",
+ "8c4231": "5a0700",
+ "5aa5ce": "892722",
+ "8c4232": "761c03",
+ "ffffff": "f5e1d1",
+ "a5e6ff": "dd533a",
+ "f7b531": "bc4524",
+ "ced6ef": "d19e92",
+ "31638c": "610f0e"
}
-}
\ No newline at end of file
+}
diff --git a/public/images/pokemon/variant/279_1.json b/public/images/pokemon/variant/279_1.json
deleted file mode 100644
index 3f884262e14..00000000000
--- a/public/images/pokemon/variant/279_1.json
+++ /dev/null
@@ -1,3611 +0,0 @@
-{
- "textures": [
- {
- "image": "279_1.png",
- "format": "RGBA8888",
- "size": {
- "w": 422,
- "h": 422
- },
- "scale": 1,
- "frames": [
- {
- "filename": "0003.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0046.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0131.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0040.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0081.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0124.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0168.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0033.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0161.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0045.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0088.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0004.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0005.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0006.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0047.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0048.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0089.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0090.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0091.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0132.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0133.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0134.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0007.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0008.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0049.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0050.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0051.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0092.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0093.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0094.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0135.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0136.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0009.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0010.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0011.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0052.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0053.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0054.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0095.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0096.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0137.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0138.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0139.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0012.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0013.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0014.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0055.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0056.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0097.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0098.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0099.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0140.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0141.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0142.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0015.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0016.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0057.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0058.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0059.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0100.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0101.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0102.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0143.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0144.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0038.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0123.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0166.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0039.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0082.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0125.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0167.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0083.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0119.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 9,
- "w": 82,
- "h": 60
- },
- "frame": {
- "x": 186,
- "y": 158,
- "w": 82,
- "h": 60
- }
- },
- {
- "filename": "0076.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 94,
- "h": 52
- },
- "frame": {
- "x": 268,
- "y": 159,
- "w": 94,
- "h": 52
- }
- },
- {
- "filename": "0085.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0128.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0037.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0080.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0165.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0034.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0162.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0126.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 0,
- "y": 159,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0002.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0087.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0130.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0017.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0018.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0019.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0060.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0061.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0062.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0103.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0104.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0145.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0146.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0147.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0041.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0084.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0169.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0020.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0021.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0022.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0063.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0064.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0105.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0106.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0107.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0148.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0149.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0150.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0023.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0024.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0065.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0066.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0067.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0108.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0109.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0110.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0151.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0152.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0079.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0122.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0025.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0026.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0027.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0068.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0069.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0070.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0111.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0112.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0153.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0154.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0155.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0028.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0029.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0030.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0071.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0072.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0113.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0114.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0115.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0156.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0157.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0158.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0042.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0127.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0170.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0031.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0032.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0073.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0074.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0075.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0116.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0117.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0118.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0159.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0160.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0043.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0086.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0171.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0077.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0120.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0001.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0044.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0129.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0035.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0078.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0163.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0036.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0121.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0164.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- }
- ]
- }
- ],
- "meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "3.0",
- "smartupdate": "$TexturePacker:SmartUpdate:37124082e206aa3cddb045440ab1e9cf:8d64288649efa3066ed9b372190e868f:b1d275d5bba320dd22d2f2c7e56d52ec$"
- }
-}
\ No newline at end of file
diff --git a/public/images/pokemon/variant/279_1.png b/public/images/pokemon/variant/279_1.png
deleted file mode 100644
index f2aa7b8ac3a..00000000000
Binary files a/public/images/pokemon/variant/279_1.png and /dev/null differ
diff --git a/public/images/pokemon/variant/279_2.json b/public/images/pokemon/variant/279_2.json
deleted file mode 100644
index 441f7841115..00000000000
--- a/public/images/pokemon/variant/279_2.json
+++ /dev/null
@@ -1,3611 +0,0 @@
-{
- "textures": [
- {
- "image": "279_2.png",
- "format": "RGBA8888",
- "size": {
- "w": 422,
- "h": 422
- },
- "scale": 1,
- "frames": [
- {
- "filename": "0003.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0046.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0131.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0040.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0081.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0124.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0168.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0033.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0161.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0045.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0088.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0004.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0005.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0006.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0047.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0048.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0089.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0090.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0091.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0132.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0133.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0134.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0007.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0008.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0049.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0050.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0051.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0092.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0093.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0094.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0135.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0136.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0009.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0010.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0011.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0052.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0053.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0054.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0095.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0096.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0137.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0138.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0139.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0012.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0013.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0014.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0055.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0056.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0097.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0098.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0099.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0140.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0141.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0142.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0015.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0016.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0057.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0058.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0059.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0100.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0101.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0102.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0143.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0144.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0038.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0123.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0166.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0039.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0082.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0125.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0167.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0083.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0119.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 9,
- "w": 82,
- "h": 60
- },
- "frame": {
- "x": 186,
- "y": 158,
- "w": 82,
- "h": 60
- }
- },
- {
- "filename": "0076.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 94,
- "h": 52
- },
- "frame": {
- "x": 268,
- "y": 159,
- "w": 94,
- "h": 52
- }
- },
- {
- "filename": "0085.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0128.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0037.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0080.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0165.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0034.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0162.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0126.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 0,
- "y": 159,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0002.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0087.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0130.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0017.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0018.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0019.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0060.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0061.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0062.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0103.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0104.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0145.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0146.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0147.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0041.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0084.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0169.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0020.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0021.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0022.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0063.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0064.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0105.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0106.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0107.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0148.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0149.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0150.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0023.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0024.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0065.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0066.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0067.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0108.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0109.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0110.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0151.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0152.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0079.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0122.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0025.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0026.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0027.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0068.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0069.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0070.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0111.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0112.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0153.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0154.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0155.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0028.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0029.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0030.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0071.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0072.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0113.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0114.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0115.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0156.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0157.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0158.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0042.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0127.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0170.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0031.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0032.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0073.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0074.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0075.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0116.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0117.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0118.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0159.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0160.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0043.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0086.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0171.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0077.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0120.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0001.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0044.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0129.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0035.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0078.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0163.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0036.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0121.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0164.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- }
- ]
- }
- ],
- "meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "3.0",
- "smartupdate": "$TexturePacker:SmartUpdate:37124082e206aa3cddb045440ab1e9cf:8d64288649efa3066ed9b372190e868f:b1d275d5bba320dd22d2f2c7e56d52ec$"
- }
-}
\ No newline at end of file
diff --git a/public/images/pokemon/variant/279_2.png b/public/images/pokemon/variant/279_2.png
deleted file mode 100644
index cde1727d123..00000000000
Binary files a/public/images/pokemon/variant/279_2.png and /dev/null differ
diff --git a/public/images/pokemon/variant/279_3.json b/public/images/pokemon/variant/279_3.json
deleted file mode 100644
index e2415bee4cd..00000000000
--- a/public/images/pokemon/variant/279_3.json
+++ /dev/null
@@ -1,3611 +0,0 @@
-{
- "textures": [
- {
- "image": "279_3.png",
- "format": "RGBA8888",
- "size": {
- "w": 422,
- "h": 422
- },
- "scale": 1,
- "frames": [
- {
- "filename": "0003.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0046.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0131.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 1,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0040.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0081.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0124.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0168.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 96,
- "h": 53
- },
- "frame": {
- "x": 96,
- "y": 0,
- "w": 96,
- "h": 53
- }
- },
- {
- "filename": "0033.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0161.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 96,
- "h": 52
- },
- "frame": {
- "x": 192,
- "y": 0,
- "w": 96,
- "h": 52
- }
- },
- {
- "filename": "0045.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0088.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 0,
- "w": 94,
- "h": 53
- },
- "frame": {
- "x": 288,
- "y": 0,
- "w": 94,
- "h": 53
- }
- },
- {
- "filename": "0004.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0005.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0006.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0047.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0048.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0089.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0090.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0091.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0132.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0133.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0134.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 1,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 192,
- "y": 52,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0007.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0008.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0049.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0050.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0051.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0092.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0093.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0094.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0135.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0136.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 2,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 285,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0009.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0010.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0011.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0052.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0053.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0054.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0095.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0096.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0137.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0138.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0139.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 3,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0012.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0013.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0014.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0055.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0056.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0097.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0098.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0099.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0140.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0141.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0142.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 4,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 53,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0015.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0016.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0057.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0058.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0059.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0100.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0101.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0102.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0143.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0144.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 186,
- "y": 105,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0038.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0123.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0166.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 7,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 279,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0039.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0082.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0125.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0167.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 0,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0083.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 5,
- "w": 93,
- "h": 53
- },
- "frame": {
- "x": 93,
- "y": 106,
- "w": 93,
- "h": 53
- }
- },
- {
- "filename": "0119.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 9,
- "w": 82,
- "h": 60
- },
- "frame": {
- "x": 186,
- "y": 158,
- "w": 82,
- "h": 60
- }
- },
- {
- "filename": "0076.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 0,
- "y": 9,
- "w": 94,
- "h": 52
- },
- "frame": {
- "x": 268,
- "y": 159,
- "w": 94,
- "h": 52
- }
- },
- {
- "filename": "0085.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0128.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 57,
- "h": 68
- },
- "frame": {
- "x": 362,
- "y": 159,
- "w": 57,
- "h": 68
- }
- },
- {
- "filename": "0037.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0080.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0165.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 7,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 268,
- "y": 211,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0034.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0162.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 349,
- "y": 227,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0126.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 5,
- "w": 81,
- "h": 60
- },
- "frame": {
- "x": 0,
- "y": 159,
- "w": 81,
- "h": 60
- }
- },
- {
- "filename": "0002.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0087.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0130.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 6,
- "y": 0,
- "w": 82,
- "h": 59
- },
- "frame": {
- "x": 81,
- "y": 159,
- "w": 82,
- "h": 59
- }
- },
- {
- "filename": "0017.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0018.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0019.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0060.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0061.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0062.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0103.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0104.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0145.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0146.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0147.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 6,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 81,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0041.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0084.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0169.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 68,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 219,
- "w": 68,
- "h": 63
- }
- },
- {
- "filename": "0020.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0021.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0022.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0063.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0064.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0105.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0106.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0107.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0148.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0149.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0150.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 7,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 174,
- "y": 218,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0023.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0024.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0065.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0066.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0067.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0108.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0109.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0110.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0151.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0152.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 8,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 68,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0079.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0122.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 67,
- "h": 63
- },
- "frame": {
- "x": 0,
- "y": 282,
- "w": 67,
- "h": 63
- }
- },
- {
- "filename": "0025.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0026.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0027.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0068.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0069.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0070.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0111.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0112.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0153.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0154.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0155.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 9,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 161,
- "y": 270,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0028.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0029.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0030.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0071.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0072.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0113.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0114.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0115.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0156.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0157.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0158.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 10,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 254,
- "y": 271,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0042.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0127.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0170.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 3,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 290,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0031.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0032.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0073.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0074.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0075.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0116.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0117.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0118.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0159.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0160.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 2,
- "y": 11,
- "w": 93,
- "h": 52
- },
- "frame": {
- "x": 67,
- "y": 322,
- "w": 93,
- "h": 52
- }
- },
- {
- "filename": "0043.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0086.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0171.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 1,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 0,
- "y": 345,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0077.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0120.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 63,
- "h": 66
- },
- "frame": {
- "x": 160,
- "y": 322,
- "w": 63,
- "h": 66
- }
- },
- {
- "filename": "0001.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0044.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0129.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 0,
- "w": 67,
- "h": 62
- },
- "frame": {
- "x": 223,
- "y": 323,
- "w": 67,
- "h": 62
- }
- },
- {
- "filename": "0035.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0078.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0163.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 9,
- "w": 57,
- "h": 67
- },
- "frame": {
- "x": 290,
- "y": 323,
- "w": 57,
- "h": 67
- }
- },
- {
- "filename": "0036.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0121.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- },
- {
- "filename": "0164.png",
- "rotated": false,
- "trimmed": true,
- "sourceSize": {
- "w": 96,
- "h": 76
- },
- "spriteSourceSize": {
- "x": 14,
- "y": 7,
- "w": 62,
- "h": 66
- },
- "frame": {
- "x": 347,
- "y": 356,
- "w": 62,
- "h": 66
- }
- }
- ]
- }
- ],
- "meta": {
- "app": "https://www.codeandweb.com/texturepacker",
- "version": "3.0",
- "smartupdate": "$TexturePacker:SmartUpdate:37124082e206aa3cddb045440ab1e9cf:8d64288649efa3066ed9b372190e868f:b1d275d5bba320dd22d2f2c7e56d52ec$"
- }
-}
\ No newline at end of file
diff --git a/public/images/pokemon/variant/279_3.png b/public/images/pokemon/variant/279_3.png
deleted file mode 100644
index a3b93047551..00000000000
Binary files a/public/images/pokemon/variant/279_3.png and /dev/null differ
diff --git a/public/images/pokemon/variant/_masterlist.json b/public/images/pokemon/variant/_masterlist.json
index 87f80fd17c4..9efbf5bc150 100644
--- a/public/images/pokemon/variant/_masterlist.json
+++ b/public/images/pokemon/variant/_masterlist.json
@@ -1017,7 +1017,7 @@
"279": [
1,
1,
- 2
+ 1
],
"280": [
0,
diff --git a/public/images/trainer/courtney.png b/public/images/trainer/courtney.png
index 991e7ac006f..0efdb615fcd 100644
Binary files a/public/images/trainer/courtney.png and b/public/images/trainer/courtney.png differ
diff --git a/public/images/ui/egg_summary_bg.png b/public/images/ui/egg_summary_bg.png
new file mode 100644
index 00000000000..658f5df0e96
Binary files /dev/null and b/public/images/ui/egg_summary_bg.png differ
diff --git a/public/images/ui/egg_summary_bg_blank.png b/public/images/ui/egg_summary_bg_blank.png
new file mode 100644
index 00000000000..09bcb63cfa3
Binary files /dev/null and b/public/images/ui/egg_summary_bg_blank.png differ
diff --git a/public/images/ui/icon_egg_move.png b/public/images/ui/icon_egg_move.png
new file mode 100644
index 00000000000..a5b0bff4ace
Binary files /dev/null and b/public/images/ui/icon_egg_move.png differ
diff --git a/public/images/ui/icon_lock.png b/public/images/ui/icon_lock.png
new file mode 100644
index 00000000000..6a12efa15e8
Binary files /dev/null and b/public/images/ui/icon_lock.png differ
diff --git a/public/images/ui/icon_stop.png b/public/images/ui/icon_stop.png
new file mode 100644
index 00000000000..6d9c201695a
Binary files /dev/null and b/public/images/ui/icon_stop.png differ
diff --git a/public/images/ui/legacy/egg_summary_bg.png b/public/images/ui/legacy/egg_summary_bg.png
new file mode 100644
index 00000000000..658f5df0e96
Binary files /dev/null and b/public/images/ui/legacy/egg_summary_bg.png differ
diff --git a/public/images/ui/legacy/icon_egg_move.png b/public/images/ui/legacy/icon_egg_move.png
new file mode 100644
index 00000000000..a5b0bff4ace
Binary files /dev/null and b/public/images/ui/legacy/icon_egg_move.png differ
diff --git a/public/images/ui/legacy/icon_lock.png b/public/images/ui/legacy/icon_lock.png
new file mode 100644
index 00000000000..6a12efa15e8
Binary files /dev/null and b/public/images/ui/legacy/icon_lock.png differ
diff --git a/public/images/ui/legacy/icon_stop.png b/public/images/ui/legacy/icon_stop.png
new file mode 100644
index 00000000000..6d9c201695a
Binary files /dev/null and b/public/images/ui/legacy/icon_stop.png differ
diff --git a/src/battle-scene.ts b/src/battle-scene.ts
index 2a920864850..c8100e0d3b9 100644
--- a/src/battle-scene.ts
+++ b/src/battle-scene.ts
@@ -130,7 +130,7 @@ export default class BattleScene extends SceneBase {
public gameSpeed: integer = 1;
public damageNumbersMode: integer = 0;
public reroll: boolean = false;
- public shopCursorTarget: number = ShopCursorTarget.CHECK_TEAM;
+ public shopCursorTarget: number = ShopCursorTarget.REWARDS;
public showMovesetFlyout: boolean = true;
public showArenaFlyout: boolean = true;
public showTimeOfDayWidget: boolean = true;
@@ -841,12 +841,13 @@ export default class BattleScene extends SceneBase {
}
addEnemyPokemon(species: PokemonSpecies, level: integer, trainerSlot: TrainerSlot, boss: boolean = false, dataSource?: PokemonData, postProcess?: (enemyPokemon: EnemyPokemon) => void): EnemyPokemon {
+ if (Overrides.OPP_LEVEL_OVERRIDE > 0) {
+ level = Overrides.OPP_LEVEL_OVERRIDE;
+ }
if (Overrides.OPP_SPECIES_OVERRIDE) {
species = getPokemonSpecies(Overrides.OPP_SPECIES_OVERRIDE);
- }
-
- if (Overrides.OPP_LEVEL_OVERRIDE !== 0) {
- level = Overrides.OPP_LEVEL_OVERRIDE;
+ // The fact that a Pokemon is a boss or not can change based on its Species and level
+ boss = this.getEncounterBossSegments(this.currentBattle.waveIndex, level, species) > 1;
}
const pokemon = new EnemyPokemon(this, species, level, trainerSlot, boss, dataSource);
@@ -973,6 +974,7 @@ export default class BattleScene extends SceneBase {
this.setSeed(Overrides.SEED_OVERRIDE || Utils.randomString(24));
console.log("Seed:", this.seed);
+ this.resetSeed(); // Properly resets RNG after saving and quitting a session
this.disableMenu = false;
@@ -1327,6 +1329,13 @@ export default class BattleScene extends SceneBase {
}
getEncounterBossSegments(waveIndex: integer, level: integer, species?: PokemonSpecies, forceBoss: boolean = false): integer {
+ if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1) {
+ return Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE;
+ } else if (Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE === 1) {
+ // The rest of the code expects to be returned 0 and not 1 if the enemy is not a boss
+ return 0;
+ }
+
if (this.gameMode.isDaily && this.gameMode.isWaveFinal(waveIndex)) {
return 5;
}
@@ -1791,6 +1800,7 @@ export default class BattleScene extends SceneBase {
config = config ?? {};
try {
const keyDetails = key.split("/");
+ config["volume"] = config["volume"] ?? 1;
switch (keyDetails[0]) {
case "level_up_fanfare":
case "item_fanfare":
@@ -1800,11 +1810,11 @@ export default class BattleScene extends SceneBase {
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;
+ config["volume"] *= (this.masterVolume * this.bgmVolume);
break;
case "battle_anims":
case "cry":
- config["volume"] = this.masterVolume * this.fieldVolume;
+ config["volume"] *= (this.masterVolume * this.fieldVolume);
//PRSFX sound files are unusually loud
if (keyDetails[1].startsWith("PRSFX- ")) {
config["volume"] *= 0.5;
@@ -1812,10 +1822,10 @@ export default class BattleScene extends SceneBase {
break;
case "ui":
//As of, right now this applies to the "select", "menu_open", "error" sound effects
- config["volume"] = this.masterVolume * this.uiVolume;
+ config["volume"] *= (this.masterVolume * this.uiVolume);
break;
case "se":
- config["volume"] = this.masterVolume * this.seVolume;
+ config["volume"] *= (this.masterVolume * this.seVolume);
break;
}
this.sound.play(key, config);
@@ -2732,6 +2742,29 @@ export default class BattleScene extends SceneBase {
(window as any).gameInfo = gameInfo;
}
+ /**
+ * This function retrieves the sprite and audio keys for active Pokemon.
+ * Active Pokemon include both enemy and player Pokemon of the current wave.
+ * Note: Questions on garbage collection go to @frutescens
+ * @returns a string array of active sprite and audio keys that should not be deleted
+ */
+ getActiveKeys(): string[] {
+ const keys: string[] = [];
+ const playerParty = this.getParty();
+ playerParty.forEach(p => {
+ keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
+ keys.push("pkmn__" + p.species.getSpriteId(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant, true));
+ keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
+ });
+ // enemyParty has to be operated on separately from playerParty because playerPokemon =/= enemyPokemon
+ const enemyParty = this.getEnemyParty();
+ enemyParty.forEach(p => {
+ keys.push(p.species.getSpriteKey(p.gender === Gender.FEMALE, p.species.formIndex, p.shiny, p.variant));
+ keys.push("cry/" + p.species.getCryKey(p.species.formIndex));
+ });
+ return keys;
+ }
+
/**
* Initialized the 2nd phase of the final boss (e.g. form-change for Eternatus)
* @param pokemon The (enemy) pokemon
diff --git a/src/data/ability.ts b/src/data/ability.ts
index d947bcddd99..16ae7a2b2d2 100644
--- a/src/data/ability.ts
+++ b/src/data/ability.ts
@@ -2,20 +2,18 @@ import Pokemon, { HitResult, PlayerPokemon, PokemonMove } from "../field/pokemon
import { Type } from "./type";
import { Constructor } from "#app/utils";
import * as Utils from "../utils";
-import { BattleStat, getBattleStatName } from "./battle-stat";
import { getPokemonNameWithAffix } from "../messages";
import { Weather, WeatherType } from "./weather";
import { BattlerTag, GroundedTag, GulpMissileTag, SemiInvulnerableTag } 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 } from "./move";
+import Move, { AttackMove, MoveCategory, MoveFlags, MoveTarget, FlinchAttr, OneHitKOAttr, HitHealAttr, allMoves, StatusMove, SelfStatusMove, VariablePowerAttr, applyMoveAttrs, IncrementMovePriorityAttr, VariableMoveTypeAttr, RandomMovesetMoveAttr, RandomMoveAttr, NaturePowerAttr, CopyMoveAttr, MoveAttr, MultiHitAttr, ChargeAttr, SacrificialAttr, SacrificialAttrOnHit, NeutralDamageAgainstFlyingTypeMultiplierAttr, FixedDamageAttr } from "./move";
import { ArenaTagSide, ArenaTrapTag } from "./arena-tag";
-import { Stat, getStatName } from "./pokemon-stat";
import { BerryModifier, PokemonHeldItemModifier } from "../modifier/modifier";
import { TerrainType } from "./terrain";
import { SpeciesFormChangeManualTrigger, SpeciesFormChangeRevertWeatherFormTrigger, SpeciesFormChangeWeatherTrigger } from "./pokemon-forms";
import i18next from "i18next";
-import { Localizable } from "#app/interfaces/locales.js";
+import { Localizable } from "#app/interfaces/locales";
import { Command } from "../ui/command-ui-handler";
import { BerryModifierType } from "#app/modifier/modifier-type";
import { getPokeballName } from "./pokeball";
@@ -25,10 +23,11 @@ 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, type BattleStat, type EffectiveStat, BATTLE_STATS, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat";
import { MovePhase } from "#app/phases/move-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
import BattleScene from "#app/battle-scene";
export class Ability implements Localizable {
@@ -126,7 +125,7 @@ type AbAttrCondition = (pokemon: Pokemon) => boolean;
type PokemonAttackCondition = (user: Pokemon | null, target: Pokemon | null, move: Move) => boolean;
type PokemonDefendCondition = (target: Pokemon, user: Pokemon, move: Move) => boolean;
-type PokemonStatChangeCondition = (target: Pokemon, statsChanged: BattleStat[], levels: integer) => boolean;
+type PokemonStatStageChangeCondition = (target: Pokemon, statsChanged: BattleStat[], stages: number) => boolean;
export abstract class AbAttr {
public showAbility: boolean;
@@ -203,38 +202,36 @@ export class PostBattleInitFormChangeAbAttr extends PostBattleInitAbAttr {
}
}
-export class PostBattleInitStatChangeAbAttr extends PostBattleInitAbAttr {
+export class PostBattleInitStatStageChangeAbAttr extends PostBattleInitAbAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
private selfTarget: boolean;
- constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean) {
+ constructor(stats: BattleStat[], stages: number, selfTarget?: boolean) {
super();
- this.stats = typeof(stats) === "number"
- ? [ stats as BattleStat ]
- : stats as BattleStat[];
- this.levels = levels;
+ this.stats = stats;
+ this.stages = stages;
this.selfTarget = !!selfTarget;
}
applyPostBattleInit(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
- const statChangePhases: StatChangePhase[] = [];
+ const statStageChangePhases: StatStageChangePhase[] = [];
if (!simulated) {
if (this.selfTarget) {
- statChangePhases.push(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
+ statStageChangePhases.push(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages));
} else {
for (const opponent of pokemon.getOpponents()) {
- statChangePhases.push(new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels));
+ statStageChangePhases.push(new StatStageChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.stages));
}
}
- for (const statChangePhase of statChangePhases) {
- if (!this.selfTarget && !statChangePhase.getPokemon()?.summonData) {
- pokemon.scene.pushPhase(statChangePhase);
+ for (const statStageChangePhase of statStageChangePhases) {
+ if (!this.selfTarget && !statStageChangePhase.getPokemon()?.summonData) {
+ pokemon.scene.pushPhase(statStageChangePhase);
} else { // TODO: This causes the ability bar to be shown at the wrong time
- pokemon.scene.unshiftPhase(statChangePhase);
+ pokemon.scene.unshiftPhase(statStageChangePhase);
}
}
}
@@ -402,15 +399,15 @@ export class TypeImmunityHealAbAttr extends TypeImmunityAbAttr {
}
}
-class TypeImmunityStatChangeAbAttr extends TypeImmunityAbAttr {
+class TypeImmunityStatStageChangeAbAttr extends TypeImmunityAbAttr {
private stat: BattleStat;
- private levels: integer;
+ private stages: number;
- constructor(immuneType: Type, stat: BattleStat, levels: integer, condition?: AbAttrCondition) {
+ constructor(immuneType: Type, stat: BattleStat, stages: number, condition?: AbAttrCondition) {
super(immuneType, condition);
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
}
applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
@@ -419,7 +416,7 @@ class TypeImmunityStatChangeAbAttr extends TypeImmunityAbAttr {
if (ret) {
cancelled.value = true; // Suppresses "No Effect" message
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages));
}
}
@@ -475,6 +472,47 @@ export class NonSuperEffectiveImmunityAbAttr extends TypeImmunityAbAttr {
}
}
+/**
+ * Attribute implementing the effects of {@link https://bulbapedia.bulbagarden.net/wiki/Tera_Shell_(Ability) | Tera Shell}
+ * When the source is at full HP, incoming attacks will have a maximum 0.5x type effectiveness multiplier.
+ * @extends PreDefendAbAttr
+ */
+export class FullHpResistTypeAbAttr extends PreDefendAbAttr {
+ /**
+ * Reduces a type multiplier to 0.5 if the source is at full HP.
+ * @param pokemon {@linkcode Pokemon} the Pokemon with this ability
+ * @param passive n/a
+ * @param simulated n/a (this doesn't change game state)
+ * @param attacker n/a
+ * @param move {@linkcode Move} the move being used on the source
+ * @param cancelled n/a
+ * @param args `[0]` a container for the move's current type effectiveness multiplier
+ * @returns `true` if the move's effectiveness is reduced; `false` otherwise
+ */
+ applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move | null, cancelled: Utils.BooleanHolder | null, args: any[]): boolean | Promise {
+ const typeMultiplier = args[0];
+ if (!(typeMultiplier && typeMultiplier instanceof Utils.NumberHolder)) {
+ return false;
+ }
+
+ if (move && move.hasAttr(FixedDamageAttr)) {
+ return false;
+ }
+
+ if (pokemon.isFullHp() && typeMultiplier.value > 0.5) {
+ typeMultiplier.value = 0.5;
+ return true;
+ }
+ return false;
+ }
+
+ getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
+ return i18next.t("abilityTriggers:fullHpResistType", {
+ pokemonNameWithAffix: getPokemonNameWithAffix(pokemon)
+ });
+ }
+}
+
export class PostDefendAbAttr extends AbAttr {
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise {
return false;
@@ -518,7 +556,7 @@ export class PostDefendGulpMissileAbAttr extends PostDefendAbAttr {
}
if (battlerTag.tagType === BattlerTagType.GULP_MISSILE_ARROKUDA) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ BattleStat.DEF ], -1));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), false, [ Stat.DEF ], -1));
} else {
attacker.trySetStatus(StatusEffect.PARALYSIS, true, pokemon);
}
@@ -547,8 +585,8 @@ export class FieldPriorityMoveImmunityAbAttr extends PreDefendAbAttr {
}
}
-export class PostStatChangeAbAttr extends AbAttr {
- applyPostStatChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], levelChanged: integer, selfTarget: boolean, args: any[]): boolean | Promise {
+export class PostStatStageChangeAbAttr extends AbAttr {
+ applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], stagesChanged: integer, selfTarget: boolean, args: any[]): boolean | Promise {
return false;
}
}
@@ -594,20 +632,20 @@ export class WonderSkinAbAttr extends PreDefendAbAttr {
}
}
-export class MoveImmunityStatChangeAbAttr extends MoveImmunityAbAttr {
+export class MoveImmunityStatStageChangeAbAttr extends MoveImmunityAbAttr {
private stat: BattleStat;
- private levels: integer;
+ private stages: number;
- constructor(immuneCondition: PreDefendAbAttrCondition, stat: BattleStat, levels: integer) {
+ constructor(immuneCondition: PreDefendAbAttrCondition, stat: BattleStat, stages: number) {
super(immuneCondition);
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
}
applyPreDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, cancelled: Utils.BooleanHolder, args: any[]): boolean {
const ret = super.applyPreDefend(pokemon, passive, simulated, attacker, move, cancelled, args);
if (ret && !simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages));
}
return ret;
@@ -642,19 +680,19 @@ export class ReverseDrainAbAttr extends PostDefendAbAttr {
}
}
-export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
+export class PostDefendStatStageChangeAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition;
private stat: BattleStat;
- private levels: integer;
+ private stages: number;
private selfTarget: boolean;
private allOthers: boolean;
- constructor(condition: PokemonDefendCondition, stat: BattleStat, levels: integer, selfTarget: boolean = true, allOthers: boolean = false) {
+ constructor(condition: PokemonDefendCondition, stat: BattleStat, stages: number, selfTarget: boolean = true, allOthers: boolean = false) {
super(true);
this.condition = condition;
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
this.selfTarget = selfTarget;
this.allOthers = allOthers;
}
@@ -668,11 +706,11 @@ export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
if (this.allOthers) {
const otherPokemon = pokemon.getAlly() ? pokemon.getOpponents().concat([ pokemon.getAlly() ]) : pokemon.getOpponents();
for (const other of otherPokemon) {
- other.scene.unshiftPhase(new StatChangePhase(other.scene, (other).getBattlerIndex(), false, [ this.stat ], this.levels));
+ other.scene.unshiftPhase(new StatStageChangePhase(other.scene, (other).getBattlerIndex(), false, [ this.stat ], this.stages));
}
return true;
}
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), this.selfTarget, [ this.stat ], this.stages));
return true;
}
@@ -680,20 +718,20 @@ export class PostDefendStatChangeAbAttr extends PostDefendAbAttr {
}
}
-export class PostDefendHpGatedStatChangeAbAttr extends PostDefendAbAttr {
+export class PostDefendHpGatedStatStageChangeAbAttr extends PostDefendAbAttr {
private condition: PokemonDefendCondition;
private hpGate: number;
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
private selfTarget: boolean;
- constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], levels: integer, selfTarget: boolean = true) {
+ constructor(condition: PokemonDefendCondition, hpGate: number, stats: BattleStat[], stages: number, selfTarget: boolean = true) {
super(true);
this.condition = condition;
this.hpGate = hpGate;
this.stats = stats;
- this.levels = levels;
+ this.stages = stages;
this.selfTarget = selfTarget;
}
@@ -703,8 +741,8 @@ export class PostDefendHpGatedStatChangeAbAttr extends PostDefendAbAttr {
const damageReceived = lastAttackReceived?.damage || 0;
if (this.condition(pokemon, attacker, move) && (pokemon.hp <= hpGateFlat && (pokemon.hp + damageReceived) > hpGateFlat)) {
- if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.levels));
+ if (!simulated ) {
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (this.selfTarget ? pokemon : attacker).getBattlerIndex(), true, this.stats, this.stages));
}
return true;
}
@@ -809,7 +847,7 @@ export class PostDefendTerrainChangeAbAttr extends PostDefendAbAttr {
}
export class PostDefendContactApplyStatusEffectAbAttr extends PostDefendAbAttr {
- private chance: integer;
+ public chance: integer;
private effects: StatusEffect[];
constructor(chance: integer, ...effects: StatusEffect[]) {
@@ -872,20 +910,20 @@ export class PostDefendContactApplyTagChanceAbAttr extends PostDefendAbAttr {
}
}
-export class PostDefendCritStatChangeAbAttr extends PostDefendAbAttr {
+export class PostDefendCritStatStageChangeAbAttr extends PostDefendAbAttr {
private stat: BattleStat;
- private levels: integer;
+ private stages: number;
- constructor(stat: BattleStat, levels: integer) {
+ constructor(stat: BattleStat, stages: number) {
super();
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
}
applyPostDefend(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean {
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ this.stat ], this.stages));
}
return true;
@@ -1072,23 +1110,23 @@ export class PostDefendMoveDisableAbAttr extends PostDefendAbAttr {
}
}
-export class PostStatChangeStatChangeAbAttr extends PostStatChangeAbAttr {
- private condition: PokemonStatChangeCondition;
+export class PostStatStageChangeStatStageChangeAbAttr extends PostStatStageChangeAbAttr {
+ private condition: PokemonStatStageChangeCondition;
private statsToChange: BattleStat[];
- private levels: integer;
+ private stages: number;
- constructor(condition: PokemonStatChangeCondition, statsToChange: BattleStat[], levels: integer) {
+ constructor(condition: PokemonStatStageChangeCondition, statsToChange: BattleStat[], stages: number) {
super(true);
this.condition = condition;
this.statsToChange = statsToChange;
- this.levels = levels;
+ this.stages = stages;
}
- applyPostStatChange(pokemon: Pokemon, simulated: boolean, statsChanged: BattleStat[], levelsChanged: integer, selfTarget: boolean, args: any[]): boolean {
- if (this.condition(pokemon, statsChanged, levelsChanged) && !selfTarget) {
+ applyPostStatStageChange(pokemon: Pokemon, simulated: boolean, statStagesChanged: BattleStat[], stagesChanged: number, selfTarget: boolean, args: any[]): boolean {
+ if (this.condition(pokemon, statStagesChanged, stagesChanged) && !selfTarget) {
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, (pokemon).getBattlerIndex(), true, this.statsToChange, this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, (pokemon).getBattlerIndex(), true, this.statsToChange, this.stages));
}
return true;
}
@@ -1169,13 +1207,13 @@ export class FieldPreventExplosiveMovesAbAttr extends AbAttr {
}
/**
- * Multiplies a BattleStat if the checked Pokemon lacks this ability.
+ * Multiplies a Stat if the checked Pokemon lacks this ability.
* If this ability cannot stack, a BooleanHolder can be used to prevent this from stacking.
- * @see {@link applyFieldBattleStatMultiplierAbAttrs}
- * @see {@link applyFieldBattleStat}
+ * @see {@link applyFieldStatMultiplierAbAttrs}
+ * @see {@link applyFieldStat}
* @see {@link Utils.BooleanHolder}
*/
-export class FieldMultiplyBattleStatAbAttr extends AbAttr {
+export class FieldMultiplyStatAbAttr extends AbAttr {
private stat: Stat;
private multiplier: number;
private canStack: boolean;
@@ -1189,7 +1227,7 @@ export class FieldMultiplyBattleStatAbAttr extends AbAttr {
}
/**
- * applyFieldBattleStat: Tries to multiply a Pokemon's BattleStat
+ * applyFieldStat: Tries to multiply a Pokemon's Stat
* @param pokemon {@linkcode Pokemon} the Pokemon using this ability
* @param passive {@linkcode boolean} unused
* @param stat {@linkcode Stat} the type of the checked stat
@@ -1199,12 +1237,12 @@ export class FieldMultiplyBattleStatAbAttr extends AbAttr {
* @param args {any[]} unused
* @returns true if this changed the checked stat, false otherwise.
*/
- applyFieldBattleStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean {
+ applyFieldStat(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, args: any[]): boolean {
if (!this.canStack && hasApplied.value) {
return false;
}
- if (this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyBattleStatAbAttr).every(attr => (attr as FieldMultiplyBattleStatAbAttr).stat !== stat)) {
+ if (this.stat === stat && checkedPokemon.getAbilityAttrs(FieldMultiplyStatAbAttr).every(attr => (attr as FieldMultiplyStatAbAttr).stat !== stat)) {
statValue.value *= this.multiplier;
hasApplied.value = true;
return true;
@@ -1538,22 +1576,22 @@ export class AllyMoveCategoryPowerBoostAbAttr extends FieldMovePowerBoostAbAttr
}
}
-export class BattleStatMultiplierAbAttr extends AbAttr {
- private battleStat: BattleStat;
+export class StatMultiplierAbAttr extends AbAttr {
+ private stat: BattleStat;
private multiplier: number;
private condition: PokemonAttackCondition | null;
- constructor(battleStat: BattleStat, multiplier: number, condition?: PokemonAttackCondition) {
+ constructor(stat: BattleStat, multiplier: number, condition?: PokemonAttackCondition) {
super(false);
- this.battleStat = battleStat;
+ this.stat = stat;
this.multiplier = multiplier;
this.condition = condition ?? null;
}
- applyBattleStat(pokemon: Pokemon, passive: boolean, simulated: boolean, battleStat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise {
+ applyStatStage(pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, statValue: Utils.NumberHolder, args: any[]): boolean | Promise {
const move = (args[0] as Move);
- if (battleStat === this.battleStat && (!this.condition || this.condition(pokemon, null, move))) {
+ if (stat === this.stat && (!this.condition || this.condition(pokemon, null, move))) {
statValue.value *= this.multiplier;
return true;
}
@@ -1724,15 +1762,15 @@ export class PostVictoryAbAttr extends AbAttr {
}
}
-class PostVictoryStatChangeAbAttr extends PostVictoryAbAttr {
+class PostVictoryStatStageChangeAbAttr extends PostVictoryAbAttr {
private stat: BattleStat | ((p: Pokemon) => BattleStat);
- private levels: integer;
+ private stages: number;
- constructor(stat: BattleStat | ((p: Pokemon) => BattleStat), levels: integer) {
+ constructor(stat: BattleStat | ((p: Pokemon) => BattleStat), stages: number) {
super();
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
}
applyPostVictory(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise {
@@ -1740,7 +1778,7 @@ class PostVictoryStatChangeAbAttr extends PostVictoryAbAttr {
? this.stat(pokemon)
: this.stat;
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages));
}
return true;
}
@@ -1774,15 +1812,15 @@ export class PostKnockOutAbAttr extends AbAttr {
}
}
-export class PostKnockOutStatChangeAbAttr extends PostKnockOutAbAttr {
+export class PostKnockOutStatStageChangeAbAttr extends PostKnockOutAbAttr {
private stat: BattleStat | ((p: Pokemon) => BattleStat);
- private levels: integer;
+ private stages: number;
- constructor(stat: BattleStat | ((p: Pokemon) => BattleStat), levels: integer) {
+ constructor(stat: BattleStat | ((p: Pokemon) => BattleStat), stages: number) {
super();
this.stat = stat;
- this.levels = levels;
+ this.stages = stages;
}
applyPostKnockOut(pokemon: Pokemon, passive: boolean, simulated: boolean, knockedOut: Pokemon, args: any[]): boolean | Promise {
@@ -1790,7 +1828,7 @@ export class PostKnockOutStatChangeAbAttr extends PostKnockOutAbAttr {
? this.stat(pokemon)
: this.stat;
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ stat ], this.stages));
}
return true;
}
@@ -1814,37 +1852,21 @@ export class CopyFaintedAllyAbilityAbAttr extends PostKnockOutAbAttr {
}
}
-export class IgnoreOpponentStatChangesAbAttr extends AbAttr {
- constructor() {
+export class IgnoreOpponentStatStagesAbAttr extends AbAttr {
+ private stats: readonly BattleStat[];
+
+ constructor(stats?: BattleStat[]) {
super(false);
+
+ this.stats = stats ?? BATTLE_STATS;
}
- apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]) {
- (args[0] as Utils.IntegerHolder).value = 0;
-
- return true;
- }
-}
-/**
- * Ignores opponent's evasion stat changes when determining if a move hits or not
- * @extends AbAttr
- * @see {@linkcode apply}
- */
-export class IgnoreOpponentEvasionAbAttr extends AbAttr {
- constructor() {
- super(false);
- }
- /**
- * Checks if enemy Pokemon is trapped by an Arena Trap-esque ability
- * @param pokemon N/A
- * @param passive N/A
- * @param cancelled N/A
- * @param args [0] {@linkcode Utils.IntegerHolder} of BattleStat.EVA
- * @returns if evasion level was successfully considered as 0
- */
- apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]) {
- (args[0] as Utils.IntegerHolder).value = 0;
- return true;
+ apply(_pokemon: Pokemon, _passive: boolean, simulated: boolean, _cancelled: Utils.BooleanHolder, args: any[]) {
+ if (this.stats.includes(args[0])) {
+ (args[1] as Utils.BooleanHolder).value = true;
+ return true;
+ }
+ return false;
}
}
@@ -1866,21 +1888,21 @@ export class IntimidateImmunityAbAttr extends AbAttr {
}
}
-export class PostIntimidateStatChangeAbAttr extends AbAttr {
+export class PostIntimidateStatStageChangeAbAttr extends AbAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
private overwrites: boolean;
- constructor(stats: BattleStat[], levels: integer, overwrites?: boolean) {
+ constructor(stats: BattleStat[], stages: number, overwrites?: boolean) {
super(true);
this.stats = stats;
- this.levels = levels;
+ this.stages = stages;
this.overwrites = !!overwrites;
}
- apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
+ apply(pokemon: Pokemon, passive: boolean, simulated:boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (!simulated) {
- pokemon.scene.pushPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.levels));
+ pokemon.scene.pushPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, this.stages));
}
cancelled.value = this.overwrites;
return true;
@@ -1985,19 +2007,17 @@ export class PostSummonAddBattlerTagAbAttr extends PostSummonAbAttr {
}
}
-export class PostSummonStatChangeAbAttr extends PostSummonAbAttr {
+export class PostSummonStatStageChangeAbAttr extends PostSummonAbAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
private selfTarget: boolean;
private intimidate: boolean;
- constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, intimidate?: boolean) {
+ constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, intimidate?: boolean) {
super(false);
- this.stats = typeof(stats) === "number"
- ? [ stats as BattleStat ]
- : stats as BattleStat[];
- this.levels = levels;
+ this.stats = stats;
+ this.stages = stages;
this.selfTarget = !!selfTarget;
this.intimidate = !!intimidate;
}
@@ -2009,20 +2029,19 @@ export class PostSummonStatChangeAbAttr extends PostSummonAbAttr {
queueShowAbility(pokemon, passive); // TODO: Better solution than manually showing the ability here
if (this.selfTarget) {
- // we unshift the StatChangePhase to put it right after the showAbility and not at the end of the
+ // we unshift the StatStageChangePhase to put it right after the showAbility and not at the end of the
// phase list (which could be after CommandPhase for example)
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages));
return true;
}
for (const opponent of pokemon.getOpponents()) {
const cancelled = new Utils.BooleanHolder(false);
if (this.intimidate) {
applyAbAttrs(IntimidateImmunityAbAttr, opponent, cancelled, simulated);
- applyAbAttrs(PostIntimidateStatChangeAbAttr, opponent, cancelled, simulated);
+ applyAbAttrs(PostIntimidateStatStageChangeAbAttr, opponent, cancelled, simulated);
}
if (!cancelled.value) {
- const statChangePhase = new StatChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.levels);
- pokemon.scene.unshiftPhase(statChangePhase);
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, opponent.getBattlerIndex(), false, this.stats, this.stages));
}
}
return true;
@@ -2063,7 +2082,7 @@ export class PostSummonAllyHealAbAttr extends PostSummonAbAttr {
* @param args N/A
* @returns if the move was successful
*/
-export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr {
+export class PostSummonClearAllyStatStagesAbAttr extends PostSummonAbAttr {
constructor() {
super();
}
@@ -2072,8 +2091,8 @@ export class PostSummonClearAllyStatsAbAttr extends PostSummonAbAttr {
const target = pokemon.getAlly();
if (target?.isActive(true)) {
if (!simulated) {
- for (let s = 0; s < target.summonData.battleStats.length; s++) {
- target.summonData.battleStats[s] = 0;
+ for (const s of BATTLE_STATS) {
+ target.setStatStage(s, 0);
}
target.scene.queueMessage(i18next.t("abilityTriggers:postSummonClearAllyStats", { pokemonNameWithAffix: getPokemonNameWithAffix(target) }));
@@ -2102,7 +2121,7 @@ export class DownloadAbAttr extends PostSummonAbAttr {
// TODO: Implement the Substitute feature(s) once move is implemented.
/**
* Checks to see if it is the opening turn (starting a new game), if so, Download won't work. This is because Download takes into account
- * vitamins and items, so it needs to use the BattleStat and the stat alone.
+ * vitamins and items, so it needs to use the Stat and the stat alone.
* @param {Pokemon} pokemon Pokemon that is using the move, as well as seeing the opposing pokemon.
* @param {boolean} passive N/A
* @param {any[]} args N/A
@@ -2115,21 +2134,21 @@ export class DownloadAbAttr extends PostSummonAbAttr {
for (const opponent of pokemon.getOpponents()) {
this.enemyCountTally++;
- this.enemyDef += opponent.getBattleStat(Stat.DEF);
- this.enemySpDef += opponent.getBattleStat(Stat.SPDEF);
+ this.enemyDef += opponent.getEffectiveStat(Stat.DEF);
+ this.enemySpDef += opponent.getEffectiveStat(Stat.SPDEF);
}
this.enemyDef = Math.round(this.enemyDef / this.enemyCountTally);
this.enemySpDef = Math.round(this.enemySpDef / this.enemyCountTally);
if (this.enemyDef < this.enemySpDef) {
- this.stats = [BattleStat.ATK];
+ this.stats = [ Stat.ATK ];
} else {
- this.stats = [BattleStat.SPATK];
+ this.stats = [ Stat.SPATK ];
}
if (this.enemyDef > 0 && this.enemySpDef > 0) { // only activate if there's actually an enemy to download from
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, this.stats, 1));
}
return true;
}
@@ -2298,12 +2317,14 @@ export class PostSummonCopyAllyStatsAbAttr extends PostSummonAbAttr {
}
const ally = pokemon.getAlly();
- if (!ally || ally.summonData.battleStats.every((change) => change === 0)) {
+ if (!ally || ally.getStatStages().every(s => s === 0)) {
return false;
}
if (!simulated) {
- pokemon.summonData.battleStats = ally.summonData.battleStats;
+ for (const s of BATTLE_STATS) {
+ pokemon.setStatStage(s, ally.getStatStage(s));
+ }
pokemon.updateInfo();
}
@@ -2342,14 +2363,27 @@ export class PostSummonTransformAbAttr extends PostSummonAbAttr {
pokemon.summonData.ability = target.getAbility().id;
pokemon.summonData.gender = target.getGender();
pokemon.summonData.fusionGender = target.getFusionGender();
- pokemon.summonData.stats = [ pokemon.stats[Stat.HP] ].concat(target.stats.slice(1));
- pokemon.summonData.battleStats = target.summonData.battleStats.slice(0);
+
+ // Copy all stats (except HP)
+ for (const s of EFFECTIVE_STATS) {
+ pokemon.setStat(s, target.getStat(s, false), false);
+ }
+
+ // Copy all stat stages
+ for (const s of BATTLE_STATS) {
+ pokemon.setStatStage(s, target.getStatStage(s));
+ }
+
pokemon.summonData.moveset = target.getMoveset().map(m => new PokemonMove(m!.moveId, m!.ppUsed, m!.ppUp)); // TODO: are those bangs correct?
pokemon.summonData.types = target.getTypes();
+
pokemon.scene.playSound("battle_anims/PRSFX- Transform");
- pokemon.loadAssets(false).then(() => pokemon.playAnim());
+ pokemon.loadAssets(false).then(() => {
+ pokemon.playAnim();
+ pokemon.updateInfo();
+ });
pokemon.scene.queueMessage(i18next.t("abilityTriggers:postSummonTransform", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), targetName: target.name, }));
@@ -2387,7 +2421,7 @@ export class PostSummonWeatherSuppressedFormChangeAbAttr extends PostSummonAbAtt
/**
* Triggers weather-based form change when summoned into an active weather.
- * Used by Forecast.
+ * Used by Forecast and Flower Gift.
* @extends PostSummonAbAttr
*/
export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr {
@@ -2410,7 +2444,10 @@ export class PostSummonFormChangeByWeatherAbAttr extends PostSummonAbAttr {
* @returns whether the form change was triggered
*/
applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
- if (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST) {
+ const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST);
+ const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT);
+
+ if (isCastformWithForecast || isCherrimWithFlowerGift) {
if (simulated) {
return simulated;
}
@@ -2550,13 +2587,13 @@ export class PreSwitchOutFormChangeAbAttr extends PreSwitchOutAbAttr {
}
-export class PreStatChangeAbAttr extends AbAttr {
- applyPreStatChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise {
+export class PreStatStageChangeAbAttr extends AbAttr {
+ applyPreStatStageChange(pokemon: Pokemon | null, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise {
return false;
}
}
-export class ProtectStatAbAttr extends PreStatChangeAbAttr {
+export class ProtectStatAbAttr extends PreStatStageChangeAbAttr {
private protectedStat?: BattleStat;
constructor(protectedStat?: BattleStat) {
@@ -2565,7 +2602,7 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr {
this.protectedStat = protectedStat;
}
- applyPreStatChange(pokemon: Pokemon, passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, args: any[]): boolean {
+ applyPreStatStageChange(_pokemon: Pokemon, _passive: boolean, simulated: boolean, stat: BattleStat, cancelled: Utils.BooleanHolder, _args: any[]): boolean {
if (Utils.isNullOrUndefined(this.protectedStat) || stat === this.protectedStat) {
cancelled.value = true;
return true;
@@ -2574,11 +2611,11 @@ export class ProtectStatAbAttr extends PreStatChangeAbAttr {
return false;
}
- getTriggerMessage(pokemon: Pokemon, abilityName: string, ...args: any[]): string {
+ getTriggerMessage(pokemon: Pokemon, abilityName: string, ..._args: any[]): string {
return i18next.t("abilityTriggers:protectStat", {
pokemonNameWithAffix: getPokemonNameWithAffix(pokemon),
abilityName,
- statName: this.protectedStat ? getBattleStatName(this.protectedStat) : i18next.t("battle:stats")
+ statName: this.protectedStat ? i18next.t(getStatKey(this.protectedStat)) : i18next.t("battle:stats")
});
}
}
@@ -3083,37 +3120,41 @@ export class PostWeatherChangeAbAttr extends AbAttr {
/**
* Triggers weather-based form change when weather changes.
- * Used by Forecast.
+ * Used by Forecast and Flower Gift.
* @extends PostWeatherChangeAbAttr
*/
export class PostWeatherChangeFormChangeAbAttr extends PostWeatherChangeAbAttr {
private ability: Abilities;
+ private formRevertingWeathers: WeatherType[];
- constructor(ability: Abilities) {
+ constructor(ability: Abilities, formRevertingWeathers: WeatherType[]) {
super(false);
this.ability = ability;
+ this.formRevertingWeathers = formRevertingWeathers;
}
/**
* Calls {@linkcode Arena.triggerWeatherBasedFormChangesToNormal | triggerWeatherBasedFormChangesToNormal} when the
* weather changed to form-reverting weather, otherwise calls {@linkcode Arena.triggerWeatherBasedFormChanges | triggerWeatherBasedFormChanges}
- * @param {Pokemon} pokemon the Pokemon that changed the weather
+ * @param {Pokemon} pokemon the Pokemon with this ability
* @param passive n/a
* @param weather n/a
* @param args n/a
* @returns whether the form change was triggered
*/
applyPostWeatherChange(pokemon: Pokemon, passive: boolean, simulated: boolean, weather: WeatherType, args: any[]): boolean {
- if (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST) {
+ const isCastformWithForecast = (pokemon.species.speciesId === Species.CASTFORM && this.ability === Abilities.FORECAST);
+ const isCherrimWithFlowerGift = (pokemon.species.speciesId === Species.CHERRIM && this.ability === Abilities.FLOWER_GIFT);
+
+ if (isCastformWithForecast || isCherrimWithFlowerGift) {
if (simulated) {
return simulated;
}
- const formRevertingWeathers: WeatherType[] = [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG ];
const weatherType = pokemon.scene.arena.weather?.weatherType;
- if (weatherType && formRevertingWeathers.includes(weatherType)) {
+ if (weatherType && this.formRevertingWeathers.includes(weatherType)) {
pokemon.scene.arena.triggerWeatherBasedFormChangesToNormal();
} else {
pokemon.scene.arena.triggerWeatherBasedFormChanges();
@@ -3417,51 +3458,53 @@ export class MoodyAbAttr extends PostTurnAbAttr {
super(true);
}
/**
- * Randomly increases one BattleStat by 2 stages and decreases a different BattleStat by 1 stage
+ * Randomly increases one stat stage by 2 and decreases a different stat stage by 1
* @param {Pokemon} pokemon Pokemon that has this ability
* @param passive N/A
* @param simulated true if applying in a simulated call.
* @param args N/A
* @returns true
*
- * Any BattleStats at +6 or -6 are excluded from being increased or decreased, respectively
- * If the pokemon already has all BattleStats raised to stage 6, it will only decrease one BattleStat by 1 stage
- * If the pokemon already has all BattleStats lowered to stage -6, it will only increase one BattleStat by 2 stages
+ * Any stat stages at +6 or -6 are excluded from being increased or decreased, respectively
+ * If the pokemon already has all stat stages raised to 6, it will only decrease one stat stage by 1
+ * If the pokemon already has all stat stages lowered to -6, it will only increase one stat stage by 2
*/
applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
- const selectableStats = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD];
- const increaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] < 6);
- let decreaseStatArray = selectableStats.filter(s => pokemon.summonData.battleStats[s] > -6);
+ const canRaise = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) < 6);
+ let canLower = EFFECTIVE_STATS.filter(s => pokemon.getStatStage(s) > -6);
- if (!simulated && increaseStatArray.length > 0) {
- const increaseStat = increaseStatArray[Utils.randInt(increaseStatArray.length)];
- decreaseStatArray = decreaseStatArray.filter(s => s !== increaseStat);
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [increaseStat], 2));
- }
- if (!simulated && decreaseStatArray.length > 0) {
- const decreaseStat = decreaseStatArray[Utils.randInt(decreaseStatArray.length)];
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [decreaseStat], -1));
+ if (!simulated) {
+ if (canRaise.length > 0) {
+ const raisedStat = canRaise[pokemon.randSeedInt(canRaise.length)];
+ canLower = canRaise.filter(s => s !== raisedStat);
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ raisedStat ], 2));
+ }
+ if (canLower.length > 0) {
+ const loweredStat = canLower[pokemon.randSeedInt(canLower.length)];
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ loweredStat ], -1));
+ }
}
+
return true;
}
}
-export class PostTurnStatChangeAbAttr extends PostTurnAbAttr {
+export class PostTurnStatStageChangeAbAttr extends PostTurnAbAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
- constructor(stats: BattleStat | BattleStat[], levels: integer) {
+ constructor(stats: BattleStat[], stages: number) {
super(true);
this.stats = Array.isArray(stats)
? stats
: [ stats ];
- this.levels = levels;
+ this.stages = stages;
}
applyPostTurn(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean {
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages));
}
return true;
}
@@ -3647,10 +3690,10 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
// If the move is an AttackMove or a StatusMove the Dancer must replicate the move on the source of the Dance
if (move.getMove() instanceof AttackMove || move.getMove() instanceof StatusMove) {
const target = this.getTarget(dancer, source, targets);
- dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true));
+ dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, target, move, true, true));
} else if (move.getMove() instanceof SelfStatusMove) {
// If the move is a SelfStatusMove (ie. Swords Dance) the Dancer should replicate it on itself
- dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true));
+ dancer.scene.unshiftPhase(new MovePhase(dancer.scene, dancer, [dancer.getBattlerIndex()], move, true, true));
}
}
return true;
@@ -3673,7 +3716,7 @@ export class PostDancingMoveAbAttr extends PostMoveUsedAbAttr {
}
}
-export class StatChangeMultiplierAbAttr extends AbAttr {
+export class StatStageChangeMultiplierAbAttr extends AbAttr {
private multiplier: integer;
constructor(multiplier: integer) {
@@ -3689,10 +3732,10 @@ export class StatChangeMultiplierAbAttr extends AbAttr {
}
}
-export class StatChangeCopyAbAttr extends AbAttr {
+export class StatStageChangeCopyAbAttr extends AbAttr {
apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean | Promise {
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as integer), true, false, false));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, (args[0] as BattleStat[]), (args[1] as number), true, false, false));
}
return true;
}
@@ -4092,22 +4135,22 @@ export class FlinchEffectAbAttr extends AbAttr {
}
}
-export class FlinchStatChangeAbAttr extends FlinchEffectAbAttr {
+export class FlinchStatStageChangeAbAttr extends FlinchEffectAbAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
- constructor(stats: BattleStat | BattleStat[], levels: integer) {
+ constructor(stats: BattleStat[], stages: number) {
super();
this.stats = Array.isArray(stats)
? stats
: [ stats ];
- this.levels = levels;
+ this.stages = stages;
}
apply(pokemon: Pokemon, passive: boolean, simulated: boolean, cancelled: Utils.BooleanHolder, args: any[]): boolean {
if (!simulated) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, this.stats, this.stages));
}
return true;
}
@@ -4307,9 +4350,9 @@ export class MoneyAbAttr extends PostBattleAbAttr {
* Applies a stat change after a Pokémon is summoned,
* conditioned on the presence of a specific arena tag.
*
- * @extends {PostSummonStatChangeAbAttr}
+ * @extends {PostSummonStatStageChangeAbAttr}
*/
-export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAttr {
+export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageChangeAbAttr {
/**
* The type of arena tag that conditions the stat change.
* @private
@@ -4318,13 +4361,13 @@ export class PostSummonStatChangeOnArenaAbAttr extends PostSummonStatChangeAbAtt
private tagType: ArenaTagType;
/**
- * Creates an instance of PostSummonStatChangeOnArenaAbAttr.
+ * Creates an instance of PostSummonStatStageChangeOnArenaAbAttr.
* Initializes the stat change to increase Attack by 1 stage if the specified arena tag is present.
*
* @param {ArenaTagType} tagType - The type of arena tag to check for.
*/
constructor(tagType: ArenaTagType) {
- super([BattleStat.ATK], 1, true, false);
+ super([ Stat.ATK ], 1, true, false);
this.tagType = tagType;
}
@@ -4498,7 +4541,7 @@ async function applyAbAttrsInternal(
applyFunc: AbAttrApplyFunc,
args: any[],
showAbilityInstant: boolean = false,
- quiet: boolean = false,
+ simulated: boolean = false,
messages: string[] = [],
) {
for (const passive of [false, true]) {
@@ -4520,33 +4563,29 @@ async function applyAbAttrsInternal(
if (result instanceof Promise) {
result = await result;
}
-
if (result) {
if (pokemon.summonData && !pokemon.summonData.abilitiesApplied.includes(ability.id)) {
pokemon.summonData.abilitiesApplied.push(ability.id);
}
- if (pokemon.battleData && !quiet && !pokemon.battleData.abilitiesApplied.includes(ability.id)) {
+ if (pokemon.battleData && !simulated && !pokemon.battleData.abilitiesApplied.includes(ability.id)) {
pokemon.battleData.abilitiesApplied.push(ability.id);
}
-
- if (attr.showAbility && !quiet) {
+ if (attr.showAbility && !simulated) {
if (showAbilityInstant) {
pokemon.scene.abilityBar.showAbility(pokemon, passive);
} else {
queueShowAbility(pokemon, passive);
}
}
-
- if (!quiet) {
- const message = attr.getTriggerMessage(pokemon, ability.name, args);
- if (message) {
+ const message = attr.getTriggerMessage(pokemon, ability.name, args);
+ if (message) {
+ if (!simulated) {
pokemon.scene.queueMessage(message);
- messages.push(message);
}
}
+ messages.push(message!);
}
}
-
pokemon.scene.clearPhaseQueueSplice();
}
}
@@ -4575,14 +4614,14 @@ export function applyPostMoveUsedAbAttrs(attrType: Constructor(attrType, pokemon, (attr, passive) => attr.applyPostMoveUsed(pokemon, move, source, targets, simulated, args), args, false, simulated);
}
-export function applyBattleStatMultiplierAbAttrs(attrType: Constructor,
- pokemon: Pokemon, battleStat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise {
- return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyBattleStat(pokemon, passive, simulated, battleStat, statValue, args), args, false, simulated);
+export function applyStatMultiplierAbAttrs(attrType: Constructor,
+ pokemon: Pokemon, stat: BattleStat, statValue: Utils.NumberHolder, simulated: boolean = false, ...args: any[]): Promise {
+ return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyStatStage(pokemon, passive, simulated, stat, statValue, args), args);
}
/**
- * Applies a field Battle Stat multiplier attribute
- * @param attrType {@linkcode FieldMultiplyBattleStatAbAttr} should always be FieldMultiplyBattleStatAbAttr for the time being
+ * Applies a field Stat multiplier attribute
+ * @param attrType {@linkcode FieldMultiplyStatAbAttr} should always be FieldMultiplyBattleStatAbAttr for the time being
* @param pokemon {@linkcode Pokemon} the Pokemon applying this ability
* @param stat {@linkcode Stat} the type of the checked stat
* @param statValue {@linkcode Utils.NumberHolder} the value of the checked stat
@@ -4590,9 +4629,9 @@ export function applyBattleStatMultiplierAbAttrs(attrType: Constructor,
+export function applyFieldStatMultiplierAbAttrs(attrType: Constructor,
pokemon: Pokemon, stat: Stat, statValue: Utils.NumberHolder, checkedPokemon: Pokemon, hasApplied: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise {
- return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldBattleStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args, false, simulated);
+ return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyFieldStat(pokemon, passive, simulated, stat, statValue, checkedPokemon, hasApplied, args), args);
}
export function applyPreAttackAbAttrs(attrType: Constructor,
@@ -4625,14 +4664,14 @@ export function applyPreSwitchOutAbAttrs(attrType: Constructor(attrType, pokemon, (attr, passive) => attr.applyPreSwitchOut(pokemon, passive, simulated, args), args, true, simulated);
}
-export function applyPreStatChangeAbAttrs(attrType: Constructor,
+export function applyPreStatStageChangeAbAttrs(attrType: Constructor,
pokemon: Pokemon | null, stat: BattleStat, cancelled: Utils.BooleanHolder, simulated: boolean = false, ...args: any[]): Promise {
- return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated);
+ return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPreStatStageChange(pokemon, passive, simulated, stat, cancelled, args), args, false, simulated);
}
-export function applyPostStatChangeAbAttrs(attrType: Constructor,
- pokemon: Pokemon, stats: BattleStat[], levels: integer, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise {
- return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostStatChange(pokemon, simulated, stats, levels, selfTarget, args), args, false, simulated);
+export function applyPostStatStageChangeAbAttrs(attrType: Constructor,
+ pokemon: Pokemon, stats: BattleStat[], stages: integer, selfTarget: boolean, simulated: boolean = false, ...args: any[]): Promise {
+ return applyAbAttrsInternal(attrType, pokemon, (attr, _passive) => attr.applyPostStatStageChange(pokemon, simulated, stats, stages, selfTarget, args), args, false, simulated);
}
export function applyPreSetStatusAbAttrs(attrType: Constructor,
@@ -4707,7 +4746,8 @@ function setAbilityRevealed(pokemon: Pokemon): void {
*/
function getPokemonWithWeatherBasedForms(scene: BattleScene) {
return scene.getField(true).filter(p =>
- p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM
+ (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM)
+ || (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM)
);
}
@@ -4721,7 +4761,7 @@ export function initAbilities() {
.attr(PostSummonWeatherChangeAbAttr, WeatherType.RAIN)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.RAIN),
new Ability(Abilities.SPEED_BOOST, 3)
- .attr(PostTurnStatChangeAbAttr, BattleStat.SPD, 1),
+ .attr(PostTurnStatStageChangeAbAttr, [ Stat.SPD ], 1),
new Ability(Abilities.BATTLE_ARMOR, 3)
.attr(BlockCritAbAttr)
.ignorable(),
@@ -4736,7 +4776,7 @@ export function initAbilities() {
.attr(StatusEffectImmunityAbAttr, StatusEffect.PARALYSIS)
.ignorable(),
new Ability(Abilities.SAND_VEIL, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.EVA, 1.2)
+ .attr(StatMultiplierAbAttr, Stat.EVA, 1.2)
.attr(BlockWeatherDamageAttr, WeatherType.SANDSTORM)
.condition(getWeatherCondition(WeatherType.SANDSTORM))
.ignorable(),
@@ -4762,7 +4802,7 @@ export function initAbilities() {
.attr(PostFaintUnsuppressedWeatherFormChangeAbAttr)
.bypassFaint(),
new Ability(Abilities.COMPOUND_EYES, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.3),
+ .attr(StatMultiplierAbAttr, Stat.ACC, 1.3),
new Ability(Abilities.INSOMNIA, 3)
.attr(StatusEffectImmunityAbAttr, StatusEffect.SLEEP)
.attr(BattlerTagImmunityAbAttr, BattlerTagType.DROWSY)
@@ -4787,7 +4827,7 @@ export function initAbilities() {
.attr(ForceSwitchOutImmunityAbAttr)
.ignorable(),
new Ability(Abilities.INTIMIDATE, 3)
- .attr(PostSummonStatChangeAbAttr, BattleStat.ATK, -1, false, true),
+ .attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], -1, false, true),
new Ability(Abilities.SHADOW_TAG, 3)
.attr(ArenaTrapAbAttr, (user, target) => {
if (target.hasAbility(Abilities.SHADOW_TAG)) {
@@ -4818,26 +4858,26 @@ export function initAbilities() {
.attr(PreSwitchOutResetStatusAbAttr),
new Ability(Abilities.LIGHTNING_ROD, 3)
.attr(RedirectTypeMoveAbAttr, Type.ELECTRIC)
- .attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPATK, 1)
+ .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPATK, 1)
.ignorable(),
new Ability(Abilities.SERENE_GRACE, 3)
.attr(MoveEffectChanceMultiplierAbAttr, 2)
.partial(),
new Ability(Abilities.SWIFT_SWIM, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
+ .attr(StatMultiplierAbAttr, Stat.SPD, 2)
.condition(getWeatherCondition(WeatherType.RAIN, WeatherType.HEAVY_RAIN)),
new Ability(Abilities.CHLOROPHYLL, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
+ .attr(StatMultiplierAbAttr, Stat.SPD, 2)
.condition(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN)),
new Ability(Abilities.ILLUMINATE, 3)
- .attr(ProtectStatAbAttr, BattleStat.ACC)
+ .attr(ProtectStatAbAttr, Stat.ACC)
.attr(DoubleBattleChanceAbAttr)
.ignorable(),
new Ability(Abilities.TRACE, 3)
.attr(PostSummonCopyAbilityAbAttr)
.attr(UncopiableAbilityAbAttr),
new Ability(Abilities.HUGE_POWER, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2),
+ .attr(StatMultiplierAbAttr, Stat.ATK, 2),
new Ability(Abilities.POISON_POINT, 3)
.attr(PostDefendContactApplyStatusEffectAbAttr, 30, StatusEffect.POISON)
.bypassFaint(),
@@ -4882,31 +4922,31 @@ export function initAbilities() {
new Ability(Abilities.RUN_AWAY, 3)
.attr(RunSuccessAbAttr),
new Ability(Abilities.KEEN_EYE, 3)
- .attr(ProtectStatAbAttr, BattleStat.ACC)
+ .attr(ProtectStatAbAttr, Stat.ACC)
.ignorable(),
new Ability(Abilities.HYPER_CUTTER, 3)
- .attr(ProtectStatAbAttr, BattleStat.ATK)
+ .attr(ProtectStatAbAttr, Stat.ATK)
.ignorable(),
new Ability(Abilities.PICKUP, 3)
.attr(PostBattleLootAbAttr),
new Ability(Abilities.TRUANT, 3)
.attr(PostSummonAddBattlerTagAbAttr, BattlerTagType.TRUANT, 1, false),
new Ability(Abilities.HUSTLE, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 0.8, (user, target, move) => move.category === MoveCategory.PHYSICAL),
+ .attr(StatMultiplierAbAttr, Stat.ATK, 1.5)
+ .attr(StatMultiplierAbAttr, Stat.ACC, 0.8, (_user, _target, move) => move.category === MoveCategory.PHYSICAL),
new Ability(Abilities.CUTE_CHARM, 3)
.attr(PostDefendContactApplyTagChanceAbAttr, 30, BattlerTagType.INFATUATED),
new Ability(Abilities.PLUS, 3)
- .conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), BattleStatMultiplierAbAttr, BattleStat.SPATK, 1.5)
+ .conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
.ignorable(),
new Ability(Abilities.MINUS, 3)
- .conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), BattleStatMultiplierAbAttr, BattleStat.SPATK, 1.5)
+ .conditionalAttr(p => p.scene.currentBattle.double && [Abilities.PLUS, Abilities.MINUS].some(a => p.getAlly().hasAbility(a)), StatMultiplierAbAttr, Stat.SPATK, 1.5)
.ignorable(),
new Ability(Abilities.FORECAST, 3)
.attr(UncopiableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr)
.attr(PostSummonFormChangeByWeatherAbAttr, Abilities.FORECAST)
- .attr(PostWeatherChangeFormChangeAbAttr, Abilities.FORECAST),
+ .attr(PostWeatherChangeFormChangeAbAttr, Abilities.FORECAST, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG ]),
new Ability(Abilities.STICKY_HOLD, 3)
.attr(BlockItemTheftAbAttr)
.bypassFaint()
@@ -4915,9 +4955,9 @@ export function initAbilities() {
.conditionalAttr(pokemon => !Utils.randSeedInt(3), PostTurnResetStatusAbAttr),
new Ability(Abilities.GUTS, 3)
.attr(BypassBurnDamageReductionAbAttr)
- .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5),
+ .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.ATK, 1.5),
new Ability(Abilities.MARVEL_SCALE, 3)
- .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), BattleStatMultiplierAbAttr, BattleStat.DEF, 1.5)
+ .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.DEF, 1.5)
.ignorable(),
new Ability(Abilities.LIQUID_OOZE, 3)
.attr(ReverseDrainAbAttr),
@@ -4950,7 +4990,7 @@ export function initAbilities() {
.attr(ProtectStatAbAttr)
.ignorable(),
new Ability(Abilities.PURE_POWER, 3)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 2),
+ .attr(StatMultiplierAbAttr, Stat.ATK, 2),
new Ability(Abilities.SHELL_ARMOR, 3)
.attr(BlockCritAbAttr)
.ignorable(),
@@ -4961,25 +5001,25 @@ export function initAbilities() {
.attr(PostFaintUnsuppressedWeatherFormChangeAbAttr)
.bypassFaint(),
new Ability(Abilities.TANGLED_FEET, 4)
- .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), BattleStatMultiplierAbAttr, BattleStat.EVA, 2)
+ .conditionalAttr(pokemon => !!pokemon.getTag(BattlerTagType.CONFUSED), StatMultiplierAbAttr, Stat.EVA, 2)
.ignorable(),
new Ability(Abilities.MOTOR_DRIVE, 4)
- .attr(TypeImmunityStatChangeAbAttr, Type.ELECTRIC, BattleStat.SPD, 1)
+ .attr(TypeImmunityStatStageChangeAbAttr, Type.ELECTRIC, Stat.SPD, 1)
.ignorable(),
new Ability(Abilities.RIVALRY, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => user?.gender !== Gender.GENDERLESS && target?.gender !== Gender.GENDERLESS && user?.gender === target?.gender, 1.25, true)
.attr(MovePowerBoostAbAttr, (user, target, move) => user?.gender !== Gender.GENDERLESS && target?.gender !== Gender.GENDERLESS && user?.gender !== target?.gender, 0.75),
new Ability(Abilities.STEADFAST, 4)
- .attr(FlinchStatChangeAbAttr, BattleStat.SPD, 1),
+ .attr(FlinchStatStageChangeAbAttr, [ Stat.SPD ], 1),
new Ability(Abilities.SNOW_CLOAK, 4)
- .attr(BattleStatMultiplierAbAttr, BattleStat.EVA, 1.2)
+ .attr(StatMultiplierAbAttr, Stat.EVA, 1.2)
.attr(BlockWeatherDamageAttr, WeatherType.HAIL)
.condition(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW))
.ignorable(),
new Ability(Abilities.GLUTTONY, 4)
.attr(ReduceBerryUseThresholdAbAttr),
new Ability(Abilities.ANGER_POINT, 4)
- .attr(PostDefendCritStatChangeAbAttr, BattleStat.ATK, 6),
+ .attr(PostDefendCritStatStageChangeAbAttr, Stat.ATK, 6),
new Ability(Abilities.UNBURDEN, 4)
.unimplemented(),
new Ability(Abilities.HEATPROOF, 4)
@@ -4987,7 +5027,7 @@ export function initAbilities() {
.attr(ReduceBurnDamageAbAttr, 0.5)
.ignorable(),
new Ability(Abilities.SIMPLE, 4)
- .attr(StatChangeMultiplierAbAttr, 2)
+ .attr(StatStageChangeMultiplierAbAttr, 2)
.ignorable(),
new Ability(Abilities.DRY_SKIN, 4)
.attr(PostWeatherLapseDamageAbAttr, 2, WeatherType.SUNNY, WeatherType.HARSH_SUN)
@@ -5012,11 +5052,11 @@ export function initAbilities() {
.condition(getWeatherCondition(WeatherType.RAIN, WeatherType.HEAVY_RAIN)),
new Ability(Abilities.SOLAR_POWER, 4)
.attr(PostWeatherLapseDamageAbAttr, 2, WeatherType.SUNNY, WeatherType.HARSH_SUN)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPATK, 1.5)
+ .attr(StatMultiplierAbAttr, Stat.SPATK, 1.5)
.condition(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN)),
new Ability(Abilities.QUICK_FEET, 4)
- .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
- .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), BattleStatMultiplierAbAttr, BattleStat.SPD, 1.5),
+ .conditionalAttr(pokemon => pokemon.status ? pokemon.status.effect === StatusEffect.PARALYSIS : false, StatMultiplierAbAttr, Stat.SPD, 2)
+ .conditionalAttr(pokemon => !!pokemon.status || pokemon.hasAbility(Abilities.COMATOSE), StatMultiplierAbAttr, Stat.SPD, 1.5),
new Ability(Abilities.NORMALIZE, 4)
.attr(MoveTypeChangeAbAttr, Type.NORMAL, 1.2, (user, target, move) => {
return ![Moves.HIDDEN_POWER, Moves.WEATHER_BALL, Moves.NATURAL_GIFT, Moves.JUDGMENT, Moves.TECHNO_BLAST].includes(move.id);
@@ -5029,7 +5069,7 @@ export function initAbilities() {
.attr(AlwaysHitAbAttr)
.attr(DoubleBattleChanceAbAttr),
new Ability(Abilities.STALL, 4)
- .attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => true, -0.5),
+ .attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => true, -0.2),
new Ability(Abilities.TECHNICIAN, 4)
.attr(MovePowerBoostAbAttr, (user, target, move) => {
const power = new Utils.NumberHolder(move.power);
@@ -5056,7 +5096,7 @@ export function initAbilities() {
new Ability(Abilities.FOREWARN, 4)
.attr(ForewarnAbAttr),
new Ability(Abilities.UNAWARE, 4)
- .attr(IgnoreOpponentStatChangesAbAttr)
+ .attr(IgnoreOpponentStatStagesAbAttr)
.ignorable(),
new Ability(Abilities.TINTED_LENS, 4)
//@ts-ignore
@@ -5071,7 +5111,7 @@ export function initAbilities() {
.attr(IntimidateImmunityAbAttr),
new Ability(Abilities.STORM_DRAIN, 4)
.attr(RedirectTypeMoveAbAttr, Type.WATER)
- .attr(TypeImmunityStatChangeAbAttr, Type.WATER, BattleStat.SPATK, 1)
+ .attr(TypeImmunityStatStageChangeAbAttr, Type.WATER, Stat.SPATK, 1)
.ignorable(),
new Ability(Abilities.ICE_BODY, 4)
.attr(BlockWeatherDamageAttr, WeatherType.HAIL)
@@ -5095,12 +5135,14 @@ export function initAbilities() {
.attr(UnsuppressableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr),
new Ability(Abilities.FLOWER_GIFT, 4)
- .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), BattleStatMultiplierAbAttr, BattleStat.ATK, 1.5)
- .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), BattleStatMultiplierAbAttr, BattleStat.SPDEF, 1.5)
+ .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), StatMultiplierAbAttr, Stat.ATK, 1.5)
+ .conditionalAttr(getWeatherCondition(WeatherType.SUNNY || WeatherType.HARSH_SUN), StatMultiplierAbAttr, Stat.SPDEF, 1.5)
.attr(UncopiableAbilityAbAttr)
.attr(NoFusionAbilityAbAttr)
- .ignorable()
- .partial(),
+ .attr(PostSummonFormChangeByWeatherAbAttr, Abilities.FLOWER_GIFT)
+ .attr(PostWeatherChangeFormChangeAbAttr, Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ])
+ .partial() // Should also boosts stats of ally
+ .ignorable(),
new Ability(Abilities.BAD_DREAMS, 4)
.attr(PostTurnHurtIfSleepingAbAttr),
new Ability(Abilities.PICKPOCKET, 5)
@@ -5111,15 +5153,15 @@ export function initAbilities() {
.attr(MoveEffectChanceMultiplierAbAttr, 0)
.partial(),
new Ability(Abilities.CONTRARY, 5)
- .attr(StatChangeMultiplierAbAttr, -1)
+ .attr(StatStageChangeMultiplierAbAttr, -1)
.ignorable(),
new Ability(Abilities.UNNERVE, 5)
.attr(PreventBerryUseAbAttr),
new Ability(Abilities.DEFIANT, 5)
- .attr(PostStatChangeStatChangeAbAttr, (target, statsChanged, levels) => levels < 0, [BattleStat.ATK], 2),
+ .attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [Stat.ATK], 2),
new Ability(Abilities.DEFEATIST, 5)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ATK, 0.5)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPATK, 0.5)
+ .attr(StatMultiplierAbAttr, Stat.ATK, 0.5)
+ .attr(StatMultiplierAbAttr, Stat.SPATK, 0.5)
.condition((pokemon) => pokemon.getHpRatio() <= 0.5),
new Ability(Abilities.CURSED_BODY, 5)
.attr(PostDefendMoveDisableAbAttr, 30)
@@ -5130,8 +5172,8 @@ export function initAbilities() {
.ignorable()
.unimplemented(),
new Ability(Abilities.WEAK_ARMOR, 5)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, BattleStat.DEF, -1)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, BattleStat.SPD, 2),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.DEF, -1)
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category === MoveCategory.PHYSICAL, Stat.SPD, 2),
new Ability(Abilities.HEAVY_METAL, 5)
.attr(WeightMultiplierAbAttr, 2)
.ignorable(),
@@ -5167,10 +5209,10 @@ export function initAbilities() {
new Ability(Abilities.REGENERATOR, 5)
.attr(PreSwitchOutHealAbAttr),
new Ability(Abilities.BIG_PECKS, 5)
- .attr(ProtectStatAbAttr, BattleStat.DEF)
+ .attr(ProtectStatAbAttr, Stat.DEF)
.ignorable(),
new Ability(Abilities.SAND_RUSH, 5)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
+ .attr(StatMultiplierAbAttr, Stat.SPD, 2)
.attr(BlockWeatherDamageAttr, WeatherType.SANDSTORM)
.condition(getWeatherCondition(WeatherType.SANDSTORM)),
new Ability(Abilities.WONDER_SKIN, 5)
@@ -5192,18 +5234,18 @@ export function initAbilities() {
.attr(PostDefendAbilityGiveAbAttr, Abilities.MUMMY)
.bypassFaint(),
new Ability(Abilities.MOXIE, 5)
- .attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1),
+ .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1),
new Ability(Abilities.JUSTIFIED, 5)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.DARK && move.category !== MoveCategory.STATUS, BattleStat.ATK, 1),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.type === Type.DARK && move.category !== MoveCategory.STATUS, Stat.ATK, 1),
new Ability(Abilities.RATTLED, 5)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS && (move.type === Type.DARK || move.type === Type.BUG ||
- move.type === Type.GHOST), BattleStat.SPD, 1)
- .attr(PostIntimidateStatChangeAbAttr, [BattleStat.SPD], 1),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS && (move.type === Type.DARK || move.type === Type.BUG ||
+ move.type === Type.GHOST), Stat.SPD, 1)
+ .attr(PostIntimidateStatStageChangeAbAttr, [Stat.SPD], 1),
new Ability(Abilities.MAGIC_BOUNCE, 5)
.ignorable()
.unimplemented(),
new Ability(Abilities.SAP_SIPPER, 5)
- .attr(TypeImmunityStatChangeAbAttr, Type.GRASS, BattleStat.ATK, 1)
+ .attr(TypeImmunityStatStageChangeAbAttr, Type.GRASS, Stat.ATK, 1)
.ignorable(),
new Ability(Abilities.PRANKSTER, 5)
.attr(ChangeMovePriorityAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS, 1),
@@ -5226,7 +5268,7 @@ export function initAbilities() {
.attr(NoFusionAbilityAbAttr)
.bypassFaint(),
new Ability(Abilities.VICTORY_STAR, 5)
- .attr(BattleStatMultiplierAbAttr, BattleStat.ACC, 1.1)
+ .attr(StatMultiplierAbAttr, Stat.ACC, 1.1)
.partial(),
new Ability(Abilities.TURBOBLAZE, 5)
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonTurboblaze", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
@@ -5255,7 +5297,7 @@ export function initAbilities() {
.attr(MoveImmunityAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.BALLBOMB_MOVE))
.ignorable(),
new Ability(Abilities.COMPETITIVE, 6)
- .attr(PostStatChangeStatChangeAbAttr, (target, statsChanged, levels) => levels < 0, [BattleStat.SPATK], 2),
+ .attr(PostStatStageChangeStatStageChangeAbAttr, (target, statsChanged, stages) => stages < 0, [Stat.SPATK], 2),
new Ability(Abilities.STRONG_JAW, 6)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.BITING_MOVE), 1.5),
new Ability(Abilities.REFRIGERATE, 6)
@@ -5275,7 +5317,7 @@ export function initAbilities() {
new Ability(Abilities.MEGA_LAUNCHER, 6)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.PULSE_MOVE), 1.5),
new Ability(Abilities.GRASS_PELT, 6)
- .conditionalAttr(getTerrainCondition(TerrainType.GRASSY), BattleStatMultiplierAbAttr, BattleStat.DEF, 1.5)
+ .conditionalAttr(getTerrainCondition(TerrainType.GRASSY), StatMultiplierAbAttr, Stat.DEF, 1.5)
.ignorable(),
new Ability(Abilities.SYMBIOSIS, 6)
.unimplemented(),
@@ -5284,7 +5326,7 @@ export function initAbilities() {
new Ability(Abilities.PIXILATE, 6)
.attr(MoveTypeChangeAbAttr, Type.FAIRY, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)),
new Ability(Abilities.GOOEY, 6)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), BattleStat.SPD, -1, false),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), Stat.SPD, -1, false),
new Ability(Abilities.AERILATE, 6)
.attr(MoveTypeChangeAbAttr, Type.FLYING, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)),
new Ability(Abilities.PARENTAL_BOND, 6)
@@ -5318,7 +5360,7 @@ export function initAbilities() {
.attr(PostFaintClearWeatherAbAttr)
.bypassFaint(),
new Ability(Abilities.STAMINA, 7)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.DEF, 1),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.DEF, 1),
new Ability(Abilities.WIMP_OUT, 7)
.condition(getSheerForceHitDisableAbCondition())
.unimplemented(),
@@ -5326,7 +5368,7 @@ export function initAbilities() {
.condition(getSheerForceHitDisableAbCondition())
.unimplemented(),
new Ability(Abilities.WATER_COMPACTION, 7)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.WATER && move.category !== MoveCategory.STATUS, BattleStat.DEF, 2),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.type === Type.WATER && move.category !== MoveCategory.STATUS, Stat.DEF, 2),
new Ability(Abilities.MERCILESS, 7)
.attr(ConditionalCritAbAttr, (user, target, move) => target?.status?.effect === StatusEffect.TOXIC || target?.status?.effect === StatusEffect.POISON),
new Ability(Abilities.SHIELDS_DOWN, 7)
@@ -5350,10 +5392,10 @@ export function initAbilities() {
new Ability(Abilities.STEELWORKER, 7)
.attr(MoveTypePowerBoostAbAttr, Type.STEEL),
new Ability(Abilities.BERSERK, 7)
- .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [BattleStat.SPATK], 1)
+ .attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [Stat.SPATK], 1)
.condition(getSheerForceHitDisableAbCondition()),
new Ability(Abilities.SLUSH_RUSH, 7)
- .attr(BattleStatMultiplierAbAttr, BattleStat.SPD, 2)
+ .attr(StatMultiplierAbAttr, Stat.SPD, 2)
.condition(getWeatherCondition(WeatherType.HAIL, WeatherType.SNOW)),
new Ability(Abilities.LONG_REACH, 7)
.attr(IgnoreContactAbAttr),
@@ -5364,7 +5406,7 @@ export function initAbilities() {
new Ability(Abilities.GALVANIZE, 7)
.attr(MoveTypeChangeAbAttr, Type.ELECTRIC, 1.2, (user, target, move) => move.type === Type.NORMAL && !move.hasAttr(VariableMoveTypeAttr)),
new Ability(Abilities.SURGE_SURFER, 7)
- .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), BattleStatMultiplierAbAttr, BattleStat.SPD, 2),
+ .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), StatMultiplierAbAttr, Stat.SPD, 2),
new Ability(Abilities.SCHOOLING, 7)
.attr(PostBattleInitFormChangeAbAttr, () => 0)
.attr(PostSummonFormChangeAbAttr, p => p.level < 20 || p.getHpRatio() <= 0.25 ? 0 : 1)
@@ -5433,9 +5475,9 @@ export function initAbilities() {
.attr(FieldPriorityMoveImmunityAbAttr)
.ignorable(),
new Ability(Abilities.SOUL_HEART, 7)
- .attr(PostKnockOutStatChangeAbAttr, BattleStat.SPATK, 1),
+ .attr(PostKnockOutStatStageChangeAbAttr, Stat.SPATK, 1),
new Ability(Abilities.TANGLING_HAIR, 7)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), BattleStat.SPD, -1, false),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.hasFlag(MoveFlags.MAKES_CONTACT), Stat.SPD, -1, false),
new Ability(Abilities.RECEIVER, 7)
.attr(CopyFaintedAllyAbilityAbAttr)
.attr(UncopiableAbilityAbAttr),
@@ -5443,18 +5485,17 @@ export function initAbilities() {
.attr(CopyFaintedAllyAbilityAbAttr)
.attr(UncopiableAbilityAbAttr),
new Ability(Abilities.BEAST_BOOST, 7)
- .attr(PostVictoryStatChangeAbAttr, p => {
- const battleStats = Utils.getEnumValues(BattleStat).slice(0, -3).map(s => s as BattleStat);
- let highestBattleStat = 0;
- let highestBattleStatIndex = 0;
- battleStats.map((bs: BattleStat, i: integer) => {
- const stat = p.getStat(bs + 1);
- if (stat > highestBattleStat) {
- highestBattleStatIndex = i;
- highestBattleStat = stat;
+ .attr(PostVictoryStatStageChangeAbAttr, p => {
+ let highestStat: EffectiveStat;
+ let highestValue = 0;
+ for (const s of EFFECTIVE_STATS) {
+ const value = p.getStat(s, false);
+ if (value > highestValue) {
+ highestStat = s;
+ highestValue = value;
}
- });
- return highestBattleStatIndex;
+ }
+ return highestStat!;
}, 1),
new Ability(Abilities.RKS_SYSTEM, 7)
.attr(UncopiableAbilityAbAttr)
@@ -5483,10 +5524,10 @@ export function initAbilities() {
//@ts-ignore
.attr(MovePowerBoostAbAttr, (user, target, move) => target.getAttackTypeEffectiveness(move.type, user) >= 2, 1.25), // TODO: fix TS issues
new Ability(Abilities.INTREPID_SWORD, 8)
- .attr(PostSummonStatChangeAbAttr, BattleStat.ATK, 1, true)
+ .attr(PostSummonStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
.condition(getOncePerBattleCondition(Abilities.INTREPID_SWORD)),
new Ability(Abilities.DAUNTLESS_SHIELD, 8)
- .attr(PostSummonStatChangeAbAttr, BattleStat.DEF, 1, true)
+ .attr(PostSummonStatStageChangeAbAttr, [ Stat.DEF ], 1, true)
.condition(getOncePerBattleCondition(Abilities.DAUNTLESS_SHIELD)),
new Ability(Abilities.LIBERO, 8)
.attr(PokemonTypeChangeAbAttr),
@@ -5495,7 +5536,7 @@ export function initAbilities() {
.attr(FetchBallAbAttr)
.condition(getOncePerBattleCondition(Abilities.BALL_FETCH)),
new Ability(Abilities.COTTON_DOWN, 8)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, BattleStat.SPD, -1, false, true)
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, Stat.SPD, -1, false, true)
.bypassFaint(),
new Ability(Abilities.PROPELLER_TAIL, 8)
.attr(BlockRedirectAbAttr),
@@ -5512,7 +5553,7 @@ export function initAbilities() {
new Ability(Abilities.STALWART, 8)
.attr(BlockRedirectAbAttr),
new Ability(Abilities.STEAM_ENGINE, 8)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => (move.type === Type.FIRE || move.type === Type.WATER) && move.category !== MoveCategory.STATUS, BattleStat.SPD, 6),
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => (move.type === Type.FIRE || move.type === Type.WATER) && move.category !== MoveCategory.STATUS, Stat.SPD, 6),
new Ability(Abilities.PUNK_ROCK, 8)
.attr(MovePowerBoostAbAttr, (user, target, move) => move.hasFlag(MoveFlags.SOUND_BASED), 1.3)
.attr(ReceivedMoveDamageMultiplierAbAttr, (target, user, move) => move.hasFlag(MoveFlags.SOUND_BASED), 0.5)
@@ -5583,26 +5624,26 @@ export function initAbilities() {
new Ability(Abilities.UNSEEN_FIST, 8)
.attr(IgnoreProtectOnContactAbAttr),
new Ability(Abilities.CURIOUS_MEDICINE, 8)
- .attr(PostSummonClearAllyStatsAbAttr),
+ .attr(PostSummonClearAllyStatStagesAbAttr),
new Ability(Abilities.TRANSISTOR, 8)
.attr(MoveTypePowerBoostAbAttr, Type.ELECTRIC),
new Ability(Abilities.DRAGONS_MAW, 8)
.attr(MoveTypePowerBoostAbAttr, Type.DRAGON),
new Ability(Abilities.CHILLING_NEIGH, 8)
- .attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1),
+ .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1),
new Ability(Abilities.GRIM_NEIGH, 8)
- .attr(PostVictoryStatChangeAbAttr, BattleStat.SPATK, 1),
+ .attr(PostVictoryStatStageChangeAbAttr, Stat.SPATK, 1),
new Ability(Abilities.AS_ONE_GLASTRIER, 8)
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAsOneGlastrier", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
.attr(PreventBerryUseAbAttr)
- .attr(PostVictoryStatChangeAbAttr, BattleStat.ATK, 1)
+ .attr(PostVictoryStatStageChangeAbAttr, Stat.ATK, 1)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr),
new Ability(Abilities.AS_ONE_SPECTRIER, 8)
.attr(PostSummonMessageAbAttr, (pokemon: Pokemon) => i18next.t("abilityTriggers:postSummonAsOneSpectrier", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }))
.attr(PreventBerryUseAbAttr)
- .attr(PostVictoryStatChangeAbAttr, BattleStat.SPATK, 1)
+ .attr(PostVictoryStatStageChangeAbAttr, Stat.SPATK, 1)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(UnsuppressableAbilityAbAttr),
@@ -5612,26 +5653,26 @@ export function initAbilities() {
new Ability(Abilities.SEED_SOWER, 9)
.attr(PostDefendTerrainChangeAbAttr, TerrainType.GRASSY),
new Ability(Abilities.THERMAL_EXCHANGE, 9)
- .attr(PostDefendStatChangeAbAttr, (target, user, move) => move.type === Type.FIRE && move.category !== MoveCategory.STATUS, BattleStat.ATK, 1)
+ .attr(PostDefendStatStageChangeAbAttr, (target, user, move) => move.type === Type.FIRE && move.category !== MoveCategory.STATUS, Stat.ATK, 1)
.attr(StatusEffectImmunityAbAttr, StatusEffect.BURN)
.ignorable(),
new Ability(Abilities.ANGER_SHELL, 9)
- .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], 1)
- .attr(PostDefendHpGatedStatChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ BattleStat.DEF, BattleStat.SPDEF ], -1)
+ .attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 1)
+ .attr(PostDefendHpGatedStatStageChangeAbAttr, (target, user, move) => move.category !== MoveCategory.STATUS, 0.5, [ Stat.DEF, Stat.SPDEF ], -1)
.condition(getSheerForceHitDisableAbCondition()),
new Ability(Abilities.PURIFYING_SALT, 9)
.attr(StatusEffectImmunityAbAttr)
.attr(ReceivedTypeDamageMultiplierAbAttr, Type.GHOST, 0.5)
.ignorable(),
new Ability(Abilities.WELL_BAKED_BODY, 9)
- .attr(TypeImmunityStatChangeAbAttr, Type.FIRE, BattleStat.DEF, 2)
+ .attr(TypeImmunityStatStageChangeAbAttr, Type.FIRE, Stat.DEF, 2)
.ignorable(),
new Ability(Abilities.WIND_RIDER, 9)
- .attr(MoveImmunityStatChangeAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.WIND_MOVE) && move.category !== MoveCategory.STATUS, BattleStat.ATK, 1)
- .attr(PostSummonStatChangeOnArenaAbAttr, ArenaTagType.TAILWIND)
+ .attr(MoveImmunityStatStageChangeAbAttr, (pokemon, attacker, move) => pokemon !== attacker && move.hasFlag(MoveFlags.WIND_MOVE) && move.category !== MoveCategory.STATUS, Stat.ATK, 1)
+ .attr(PostSummonStatStageChangeOnArenaAbAttr, ArenaTagType.TAILWIND)
.ignorable(),
new Ability(Abilities.GUARD_DOG, 9)
- .attr(PostIntimidateStatChangeAbAttr, [BattleStat.ATK], 1, true)
+ .attr(PostIntimidateStatStageChangeAbAttr, [Stat.ATK], 1, true)
.attr(ForceSwitchOutImmunityAbAttr)
.ignorable(),
new Ability(Abilities.ROCKY_PAYLOAD, 9)
@@ -5672,31 +5713,31 @@ export function initAbilities() {
.ignorable()
.partial(),
new Ability(Abilities.VESSEL_OF_RUIN, 9)
- .attr(FieldMultiplyBattleStatAbAttr, Stat.SPATK, 0.75)
- .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.SPATK) }))
+ .attr(FieldMultiplyStatAbAttr, Stat.SPATK, 0.75)
+ .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonVesselOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPATK)) }))
.ignorable(),
new Ability(Abilities.SWORD_OF_RUIN, 9)
- .attr(FieldMultiplyBattleStatAbAttr, Stat.DEF, 0.75)
- .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.DEF) }))
+ .attr(FieldMultiplyStatAbAttr, Stat.DEF, 0.75)
+ .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonSwordOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.DEF)) }))
.ignorable(),
new Ability(Abilities.TABLETS_OF_RUIN, 9)
- .attr(FieldMultiplyBattleStatAbAttr, Stat.ATK, 0.75)
- .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonTabletsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.ATK) }))
+ .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(FieldMultiplyBattleStatAbAttr, Stat.SPDEF, 0.75)
- .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: getStatName(Stat.SPDEF) }))
+ .attr(FieldMultiplyStatAbAttr, Stat.SPDEF, 0.75)
+ .attr(PostSummonMessageAbAttr, (user) => i18next.t("abilityTriggers:postSummonBeadsOfRuin", { pokemonNameWithAffix: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.SPDEF)) }))
.ignorable(),
new Ability(Abilities.ORICHALCUM_PULSE, 9)
.attr(PostSummonWeatherChangeAbAttr, WeatherType.SUNNY)
.attr(PostBiomeChangeWeatherChangeAbAttr, WeatherType.SUNNY)
- .conditionalAttr(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN), BattleStatMultiplierAbAttr, BattleStat.ATK, 4 / 3),
+ .conditionalAttr(getWeatherCondition(WeatherType.SUNNY, WeatherType.HARSH_SUN), StatMultiplierAbAttr, Stat.ATK, 4 / 3),
new Ability(Abilities.HADRON_ENGINE, 9)
.attr(PostSummonTerrainChangeAbAttr, TerrainType.ELECTRIC)
.attr(PostBiomeChangeTerrainChangeAbAttr, TerrainType.ELECTRIC)
- .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), BattleStatMultiplierAbAttr, BattleStat.SPATK, 4 / 3),
+ .conditionalAttr(getTerrainCondition(TerrainType.ELECTRIC), StatMultiplierAbAttr, Stat.SPATK, 4 / 3),
new Ability(Abilities.OPPORTUNIST, 9)
- .attr(StatChangeCopyAbAttr),
+ .attr(StatStageChangeCopyAbAttr),
new Ability(Abilities.CUD_CHEW, 9)
.unimplemented(),
new Ability(Abilities.SHARPNESS, 9)
@@ -5717,16 +5758,16 @@ export function initAbilities() {
.partial() // Healing not blocked by Heal Block
.ignorable(),
new Ability(Abilities.MYCELIUM_MIGHT, 9)
- .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS, -0.5)
+ .attr(ChangeMovePriorityAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS, -0.2)
.attr(PreventBypassSpeedChanceAbAttr, (pokemon, move) => move.category === MoveCategory.STATUS)
.attr(MoveAbilityBypassAbAttr, (pokemon, move: Move) => move.category === MoveCategory.STATUS),
new Ability(Abilities.MINDS_EYE, 9)
.attr(IgnoreTypeImmunityAbAttr, Type.GHOST, [Type.NORMAL, Type.FIGHTING])
- .attr(ProtectStatAbAttr, BattleStat.ACC)
- .attr(IgnoreOpponentEvasionAbAttr)
+ .attr(ProtectStatAbAttr, Stat.ACC)
+ .attr(IgnoreOpponentStatStagesAbAttr, [ Stat.EVA ])
.ignorable(),
new Ability(Abilities.SUPERSWEET_SYRUP, 9)
- .attr(PostSummonStatChangeAbAttr, BattleStat.EVA, -1)
+ .attr(PostSummonStatStageChangeAbAttr, [ Stat.EVA ], -1)
.condition(getOncePerBattleCondition(Abilities.SUPERSWEET_SYRUP)),
new Ability(Abilities.HOSPITALITY, 9)
.attr(PostSummonAllyHealAbAttr, 4, true)
@@ -5734,25 +5775,25 @@ export function initAbilities() {
new Ability(Abilities.TOXIC_CHAIN, 9)
.attr(PostAttackApplyStatusEffectAbAttr, false, 30, StatusEffect.TOXIC),
new Ability(Abilities.EMBODY_ASPECT_TEAL, 9)
- .attr(PostBattleInitStatChangeAbAttr, BattleStat.SPD, 1, true)
+ .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPD ], 1, true)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr)
.partial(),
new Ability(Abilities.EMBODY_ASPECT_WELLSPRING, 9)
- .attr(PostBattleInitStatChangeAbAttr, BattleStat.SPDEF, 1, true)
+ .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.SPDEF ], 1, true)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr)
.partial(),
new Ability(Abilities.EMBODY_ASPECT_HEARTHFLAME, 9)
- .attr(PostBattleInitStatChangeAbAttr, BattleStat.ATK, 1, true)
+ .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.ATK ], 1, true)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr)
.partial(),
new Ability(Abilities.EMBODY_ASPECT_CORNERSTONE, 9)
- .attr(PostBattleInitStatChangeAbAttr, BattleStat.DEF, 1, true)
+ .attr(PostBattleInitStatStageChangeAbAttr, [ Stat.DEF ], 1, true)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
.attr(NoTransformAbilityAbAttr)
@@ -5765,10 +5806,10 @@ export function initAbilities() {
.attr(NoTransformAbilityAbAttr)
.attr(NoFusionAbilityAbAttr),
new Ability(Abilities.TERA_SHELL, 9)
+ .attr(FullHpResistTypeAbAttr)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
- .ignorable()
- .unimplemented(),
+ .ignorable(),
new Ability(Abilities.TERAFORM_ZERO, 9)
.attr(UncopiableAbilityAbAttr)
.attr(UnswappableAbilityAbAttr)
diff --git a/src/data/arena-tag.ts b/src/data/arena-tag.ts
index a60ea5c2981..fdc32b75c19 100644
--- a/src/data/arena-tag.ts
+++ b/src/data/arena-tag.ts
@@ -7,17 +7,17 @@ import Pokemon, { HitResult, PokemonMove } from "../field/pokemon";
import { StatusEffect } from "./status-effect";
import { BattlerIndex } from "../battle";
import { BlockNonDirectDamageAbAttr, ChangeMovePriorityAbAttr, ProtectStatAbAttr, applyAbAttrs } from "./ability";
-import { BattleStat } from "./battle-stat";
+import { Stat } from "#enums/stat";
import { CommonAnim, CommonBattleAnim } from "./battle-anims";
import i18next from "i18next";
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 { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
-import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
-import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
-import { StatChangePhase } from "#app/phases/stat-change-phase.js";
+import { MoveEffectPhase } from "#app/phases/move-effect-phase";
+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";
export enum ArenaTagSide {
BOTH,
@@ -786,8 +786,8 @@ class StickyWebTag extends ArenaTrapTag {
applyAbAttrs(ProtectStatAbAttr, pokemon, cancelled);
if (!cancelled.value) {
pokemon.scene.queueMessage(i18next.t("arenaTag:stickyWebActivateTrap", { pokemonName: pokemon.getNameToRender() }));
- const statLevels = new Utils.NumberHolder(-1);
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [BattleStat.SPD], statLevels.value));
+ const stages = new Utils.NumberHolder(-1);
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.SPD ], stages.value));
}
}
@@ -875,7 +875,7 @@ class TailwindTag extends ArenaTag {
// Raise attack by one stage if party member has WIND_RIDER ability
if (pokemon.hasAbility(Abilities.WIND_RIDER)) {
pokemon.scene.unshiftPhase(new ShowAbilityPhase(pokemon.scene, pokemon.getBattlerIndex()));
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.ATK], 1, true));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.ATK ], 1, true));
}
}
}
@@ -905,6 +905,21 @@ class HappyHourTag extends ArenaTag {
}
}
+class SafeguardTag extends ArenaTag {
+ constructor(turnCount: integer, sourceId: integer, side: ArenaTagSide) {
+ super(ArenaTagType.SAFEGUARD, turnCount, Moves.SAFEGUARD, sourceId, side);
+ }
+
+ onAdd(arena: Arena): void {
+ arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
+ }
+
+ onRemove(arena: Arena): void {
+ arena.scene.queueMessage(i18next.t(`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`));
+ }
+}
+
+
export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMove: Moves | undefined, sourceId: integer, targetIndex?: BattlerIndex, side: ArenaTagSide = ArenaTagSide.BOTH): ArenaTag | null {
switch (tagType) {
case ArenaTagType.MIST:
@@ -950,6 +965,8 @@ export function getArenaTag(tagType: ArenaTagType, turnCount: integer, sourceMov
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);
default:
return null;
}
diff --git a/src/data/battle-anims.ts b/src/data/battle-anims.ts
index a2f6e41f4ae..da4e7f6a33b 100644
--- a/src/data/battle-anims.ts
+++ b/src/data/battle-anims.ts
@@ -788,10 +788,10 @@ export abstract class BattleAnim {
targetSprite.pipelineData["tone"] = [ 0.0, 0.0, 0.0, 0.0 ];
targetSprite.setAngle(0);
if (!this.isHideUser() && userSprite) {
- userSprite.setVisible(true);
+ this.user?.getSprite().setVisible(true); // using this.user to fix context loss due to isOppAnim swap (#481)
}
if (!this.isHideTarget() && (targetSprite !== userSprite || !this.isHideUser())) {
- targetSprite.setVisible(true);
+ this.target?.getSprite().setVisible(true); // using this.target to fix context loss due to isOppAnim swap (#481)
}
for (const ms of Object.values(spriteCache).flat()) {
if (ms) {
diff --git a/src/data/battle-stat.ts b/src/data/battle-stat.ts
deleted file mode 100644
index a0cb7ca88e1..00000000000
--- a/src/data/battle-stat.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-import i18next, { ParseKeys } from "i18next";
-
-export enum BattleStat {
- ATK,
- DEF,
- SPATK,
- SPDEF,
- SPD,
- ACC,
- EVA,
- RAND,
- HP
-}
-
-export function getBattleStatName(stat: BattleStat) {
- switch (stat) {
- case BattleStat.ATK:
- return i18next.t("pokemonInfo:Stat.ATK");
- case BattleStat.DEF:
- return i18next.t("pokemonInfo:Stat.DEF");
- case BattleStat.SPATK:
- return i18next.t("pokemonInfo:Stat.SPATK");
- case BattleStat.SPDEF:
- return i18next.t("pokemonInfo:Stat.SPDEF");
- case BattleStat.SPD:
- return i18next.t("pokemonInfo:Stat.SPD");
- case BattleStat.ACC:
- return i18next.t("pokemonInfo:Stat.ACC");
- case BattleStat.EVA:
- return i18next.t("pokemonInfo:Stat.EVA");
- case BattleStat.HP:
- return i18next.t("pokemonInfo:Stat.HPStat");
- default:
- return "???";
- }
-}
-
-export function getBattleStatLevelChangeDescription(pokemonNameWithAffix: string, stats: string, levels: integer, up: boolean, count: number = 1) {
- const stringKey = (() => {
- if (up) {
- switch (levels) {
- case 1:
- return "battle:statRose";
- case 2:
- return "battle:statSharplyRose";
- case 3:
- case 4:
- case 5:
- case 6:
- return "battle:statRoseDrastically";
- default:
- return "battle:statWontGoAnyHigher";
- }
- } else {
- switch (levels) {
- case 1:
- return "battle:statFell";
- case 2:
- return "battle:statHarshlyFell";
- case 3:
- case 4:
- case 5:
- case 6:
- return "battle:statSeverelyFell";
- default:
- return "battle:statWontGoAnyLower";
- }
- }
- })();
- return i18next.t(stringKey as ParseKeys, { pokemonNameWithAffix, stats, count });
-}
diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts
index 8c05d296e76..66bcc7b9c3c 100644
--- a/src/data/battler-tags.ts
+++ b/src/data/battler-tags.ts
@@ -1,7 +1,6 @@
import { ChargeAnim, CommonAnim, CommonBattleAnim, MoveChargeAnim } from "./battle-anims";
import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { MoveResult, HitResult } from "../field/pokemon";
-import { Stat, getStatName } from "./pokemon-stat";
import { StatusEffect } from "./status-effect";
import * as Utils from "../utils";
import { ChargeAttr, MoveFlags, allMoves } from "./move";
@@ -9,20 +8,20 @@ import { Type } from "./type";
import { BlockNonDirectDamageAbAttr, FlinchEffectAbAttr, ReverseDrainAbAttr, applyAbAttrs } from "./ability";
import { TerrainType } from "./terrain";
import { WeatherType } from "./weather";
-import { BattleStat } from "./battle-stat";
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.js";
-import { CommonAnimPhase } from "#app/phases/common-anim-phase.js";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
-import { MovePhase } from "#app/phases/move-phase.js";
-import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
-import { ShowAbilityPhase } from "#app/phases/show-ability-phase.js";
-import { StatChangePhase, StatChangeCallback } from "#app/phases/stat-change-phase.js";
+import i18next from "#app/plugins/i18n";
+import { Stat, type BattleStat, type EffectiveStat, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat";
+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";
export enum BattlerTagLapseType {
FAINT,
@@ -40,13 +39,15 @@ export class BattlerTag {
public turnCount: number;
public sourceMove: Moves;
public sourceId?: number;
+ public isBatonPassable: boolean;
- constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number) {
+ constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: number, sourceMove?: Moves, sourceId?: number, isBatonPassable: boolean = false) {
this.tagType = tagType;
this.lapseTypes = Array.isArray(lapseType) ? lapseType : [ lapseType ];
this.turnCount = turnCount;
this.sourceMove = sourceMove!; // TODO: is this bang correct?
this.sourceId = sourceId;
+ this.isBatonPassable = isBatonPassable;
}
canAdd(pokemon: Pokemon): boolean {
@@ -207,12 +208,12 @@ export class ShellTrapTag extends BattlerTag {
export class TrappedTag extends BattlerTag {
constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType, turnCount: number, sourceMove: Moves, sourceId: number) {
- super(tagType, lapseType, turnCount, sourceMove, sourceId);
+ super(tagType, lapseType, turnCount, sourceMove, sourceId, true);
}
canAdd(pokemon: Pokemon): boolean {
const isGhost = pokemon.isOfType(Type.GHOST);
- const isTrapped = pokemon.getTag(BattlerTagType.TRAPPED);
+ const isTrapped = pokemon.getTag(TrappedTag);
return !isTrapped && !isGhost;
}
@@ -245,6 +246,23 @@ export class TrappedTag extends BattlerTag {
}
}
+/**
+ * BattlerTag implementing No Retreat's trapping effect.
+ * This is treated separately from other trapping effects to prevent
+ * Ghost-type Pokemon from being able to reuse the move.
+ * @extends TrappedTag
+ */
+class NoRetreatTag extends TrappedTag {
+ constructor(sourceId: number) {
+ super(BattlerTagType.NO_RETREAT, BattlerTagLapseType.CUSTOM, 0, Moves.NO_RETREAT, sourceId);
+ }
+
+ /** overrides {@linkcode TrappedTag.apply}, removing the Ghost-type condition */
+ canAdd(pokemon: Pokemon): boolean {
+ return !pokemon.getTag(TrappedTag);
+ }
+}
+
/**
* BattlerTag that represents the {@link https://bulbapedia.bulbagarden.net/wiki/Flinch Flinch} status condition
*/
@@ -310,7 +328,7 @@ export class InterruptedTag extends BattlerTag {
*/
export class ConfusedTag extends BattlerTag {
constructor(turnCount: number, sourceMove: Moves) {
- super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove);
+ super(BattlerTagType.CONFUSED, BattlerTagLapseType.MOVE, turnCount, sourceMove, undefined, true);
}
canAdd(pokemon: Pokemon): boolean {
@@ -345,8 +363,8 @@ export class ConfusedTag extends BattlerTag {
// 1/3 chance of hitting self with a 40 base power move
if (pokemon.randSeedInt(3) === 0) {
- const atk = pokemon.getBattleStat(Stat.ATK);
- const def = pokemon.getBattleStat(Stat.DEF);
+ 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.randSeedInt(15, 85) / 100));
pokemon.scene.queueMessage(i18next.t("battlerTags:confusedLapseHurtItself"));
pokemon.damageAndUpdate(damage);
@@ -370,7 +388,7 @@ export class ConfusedTag extends BattlerTag {
*/
export class DestinyBondTag extends BattlerTag {
constructor(sourceMove: Moves, sourceId: number) {
- super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId);
+ super(BattlerTagType.DESTINY_BOND, BattlerTagLapseType.PRE_MOVE, 1, sourceMove, sourceId, true);
}
/**
@@ -489,7 +507,7 @@ export class SeedTag extends BattlerTag {
private sourceIndex: number;
constructor(sourceId: number) {
- super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId);
+ super(BattlerTagType.SEEDED, BattlerTagLapseType.TURN_END, 1, Moves.LEECH_SEED, sourceId, true);
}
/**
@@ -750,7 +768,7 @@ export class OctolockTag extends TrappedTag {
const shouldLapse = lapseType !== BattlerTagLapseType.CUSTOM || super.lapse(pokemon, lapseType);
if (shouldLapse) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF, BattleStat.SPDEF], -1));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), false, [ Stat.DEF, Stat.SPDEF ], -1));
return true;
}
@@ -760,7 +778,7 @@ export class OctolockTag extends TrappedTag {
export class AquaRingTag extends BattlerTag {
constructor() {
- super(BattlerTagType.AQUA_RING, BattlerTagLapseType.TURN_END, 1, Moves.AQUA_RING, undefined);
+ super(BattlerTagType.AQUA_RING, BattlerTagLapseType.TURN_END, 1, Moves.AQUA_RING, undefined, true);
}
onAdd(pokemon: Pokemon): void {
@@ -792,7 +810,7 @@ export class AquaRingTag extends BattlerTag {
/** Tag used to allow moves that interact with {@link Moves.MINIMIZE} to function */
export class MinimizeTag extends BattlerTag {
constructor() {
- super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE, undefined);
+ super(BattlerTagType.MINIMIZED, BattlerTagLapseType.TURN_END, 1, Moves.MINIMIZE);
}
canAdd(pokemon: Pokemon): boolean {
@@ -864,7 +882,7 @@ export abstract class DamagingTrapTag extends TrappedTag {
}
canAdd(pokemon: Pokemon): boolean {
- return !pokemon.isOfType(Type.GHOST) && !pokemon.findTag(t => t instanceof DamagingTrapTag);
+ return !pokemon.getTag(TrappedTag);
}
lapse(pokemon: Pokemon, lapseType: BattlerTagLapseType): boolean {
@@ -1076,7 +1094,7 @@ export class ContactDamageProtectedTag extends ProtectedTag {
}
}
-export class ContactStatChangeProtectedTag extends ProtectedTag {
+export class ContactStatStageChangeProtectedTag extends ProtectedTag {
private stat: BattleStat;
private levels: number;
@@ -1093,7 +1111,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
*/
loadTag(source: BattlerTag | any): void {
super.loadTag(source);
- this.stat = source.stat as BattleStat;
+ this.stat = source.stat;
this.levels = source.levels;
}
@@ -1104,7 +1122,7 @@ export class ContactStatChangeProtectedTag extends ProtectedTag {
const effectPhase = pokemon.scene.getCurrentPhase();
if (effectPhase instanceof MoveEffectPhase && effectPhase.move.getMove().hasFlag(MoveFlags.MAKES_CONTACT)) {
const attacker = effectPhase.getPokemon();
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, attacker.getBattlerIndex(), true, [ this.stat ], this.levels));
}
}
@@ -1190,7 +1208,7 @@ export class SturdyTag extends BattlerTag {
export class PerishSongTag extends BattlerTag {
constructor(turnCount: number) {
- super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG);
+ super(BattlerTagType.PERISH_SONG, BattlerTagLapseType.TURN_END, turnCount, Moves.PERISH_SONG, undefined, true);
}
canAdd(pokemon: Pokemon): boolean {
@@ -1246,7 +1264,7 @@ export class AbilityBattlerTag extends BattlerTag {
public ability: Abilities;
constructor(tagType: BattlerTagType, ability: Abilities, lapseType: BattlerTagLapseType, turnCount: number) {
- super(tagType, lapseType, turnCount, undefined);
+ super(tagType, lapseType, turnCount);
this.ability = ability;
}
@@ -1331,11 +1349,10 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
onAdd(pokemon: Pokemon): void {
super.onAdd(pokemon);
- const stats = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ];
- let highestStat: Stat;
- stats.map(s => pokemon.getBattleStat(s)).reduce((highestValue: number, value: number, i: number) => {
+ let highestStat: EffectiveStat;
+ EFFECTIVE_STATS.map(s => pokemon.getEffectiveStat(s)).reduce((highestValue: number, value: number, i: number) => {
if (value > highestValue) {
- highestStat = stats[i];
+ highestStat = EFFECTIVE_STATS[i];
return value;
}
return highestValue;
@@ -1353,7 +1370,7 @@ export class HighestStatBoostTag extends AbilityBattlerTag {
break;
}
- pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: getStatName(highestStat) }), null, false, null, true);
+ pokemon.scene.queueMessage(i18next.t("battlerTags:highestStatBoostOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), statName: i18next.t(getStatKey(highestStat)) }), null, false, null, true);
}
onRemove(pokemon: Pokemon): void {
@@ -1423,7 +1440,7 @@ export class TypeImmuneTag extends BattlerTag {
public immuneType: Type;
constructor(tagType: BattlerTagType, sourceMove: Moves, immuneType: Type, length: number = 1) {
- super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove);
+ super(tagType, BattlerTagLapseType.TURN_END, length, sourceMove, undefined, true);
this.immuneType = immuneType;
}
@@ -1487,7 +1504,7 @@ export class TypeBoostTag extends BattlerTag {
export class CritBoostTag extends BattlerTag {
constructor(tagType: BattlerTagType, sourceMove: Moves) {
- super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove);
+ super(tagType, BattlerTagLapseType.TURN_END, 1, sourceMove, undefined, true);
}
onAdd(pokemon: Pokemon): void {
@@ -1507,6 +1524,25 @@ export class CritBoostTag extends BattlerTag {
}
}
+/**
+ * Tag for the effects of Dragon Cheer, which boosts the critical hit ratio of the user's allies.
+ * @extends {CritBoostTag}
+ */
+export class DragonCheerTag extends CritBoostTag {
+ /** The types of the user's ally when the tag is added */
+ public typesOnAdd: Type[];
+
+ constructor() {
+ super(BattlerTagType.CRIT_BOOST, Moves.DRAGON_CHEER);
+ }
+
+ onAdd(pokemon: Pokemon): void {
+ super.onAdd(pokemon);
+
+ this.typesOnAdd = pokemon.getTypes(true);
+ }
+}
+
export class SaltCuredTag extends BattlerTag {
private sourceIndex: number;
@@ -1560,7 +1596,7 @@ export class CursedTag extends BattlerTag {
private sourceIndex: number;
constructor(sourceId: number) {
- super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId);
+ super(BattlerTagType.CURSED, BattlerTagLapseType.TURN_END, 1, Moves.CURSE, sourceId, true);
}
/**
@@ -1678,25 +1714,25 @@ export class IceFaceBlockDamageTag extends FormBlockDamageTag {
*/
export class StockpilingTag extends BattlerTag {
public stockpiledCount: number = 0;
- public statChangeCounts: { [BattleStat.DEF]: number; [BattleStat.SPDEF]: number } = {
- [BattleStat.DEF]: 0,
- [BattleStat.SPDEF]: 0
+ public statChangeCounts: { [Stat.DEF]: number; [Stat.SPDEF]: number } = {
+ [Stat.DEF]: 0,
+ [Stat.SPDEF]: 0
};
constructor(sourceMove: Moves = Moves.NONE) {
super(BattlerTagType.STOCKPILING, BattlerTagLapseType.CUSTOM, 1, sourceMove);
}
- private onStatsChanged: StatChangeCallback = (_, statsChanged, statChanges) => {
- const defChange = statChanges[statsChanged.indexOf(BattleStat.DEF)] ?? 0;
- const spDefChange = statChanges[statsChanged.indexOf(BattleStat.SPDEF)] ?? 0;
+ private onStatStagesChanged: StatStageChangeCallback = (_, statsChanged, statChanges) => {
+ const defChange = statChanges[statsChanged.indexOf(Stat.DEF)] ?? 0;
+ const spDefChange = statChanges[statsChanged.indexOf(Stat.SPDEF)] ?? 0;
if (defChange) {
- this.statChangeCounts[BattleStat.DEF]++;
+ this.statChangeCounts[Stat.DEF]++;
}
if (spDefChange) {
- this.statChangeCounts[BattleStat.SPDEF]++;
+ this.statChangeCounts[Stat.SPDEF]++;
}
};
@@ -1704,8 +1740,8 @@ export class StockpilingTag extends BattlerTag {
super.loadTag(source);
this.stockpiledCount = source.stockpiledCount || 0;
this.statChangeCounts = {
- [ BattleStat.DEF ]: source.statChangeCounts?.[ BattleStat.DEF ] ?? 0,
- [ BattleStat.SPDEF ]: source.statChangeCounts?.[ BattleStat.SPDEF ] ?? 0,
+ [ Stat.DEF ]: source.statChangeCounts?.[ Stat.DEF ] ?? 0,
+ [ Stat.SPDEF ]: source.statChangeCounts?.[ Stat.SPDEF ] ?? 0,
};
}
@@ -1725,9 +1761,9 @@ export class StockpilingTag extends BattlerTag {
}));
// Attempt to increase DEF and SPDEF by one stage, keeping track of successful changes.
- pokemon.scene.unshiftPhase(new StatChangePhase(
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(
pokemon.scene, pokemon.getBattlerIndex(), true,
- [BattleStat.SPDEF, BattleStat.DEF], 1, true, false, true, this.onStatsChanged
+ [Stat.SPDEF, Stat.DEF], 1, true, false, true, this.onStatStagesChanged
));
}
}
@@ -1741,15 +1777,15 @@ export class StockpilingTag extends BattlerTag {
* one stage for each stack which had successfully changed that particular stat during onAdd.
*/
onRemove(pokemon: Pokemon): void {
- const defChange = this.statChangeCounts[BattleStat.DEF];
- const spDefChange = this.statChangeCounts[BattleStat.SPDEF];
+ const defChange = this.statChangeCounts[Stat.DEF];
+ const spDefChange = this.statChangeCounts[Stat.SPDEF];
if (defChange) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.DEF], -defChange, true, false, true));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.DEF ], -defChange, true, false, true));
}
if (spDefChange) {
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [BattleStat.SPDEF], -spDefChange, true, false, true));
+ pokemon.scene.unshiftPhase(new StatStageChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ Stat.SPDEF ], -spDefChange, true, false, true));
}
}
}
@@ -1864,6 +1900,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
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:
@@ -1889,11 +1927,11 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
case BattlerTagType.SPIKY_SHIELD:
return new ContactDamageProtectedTag(sourceMove, 8);
case BattlerTagType.KINGS_SHIELD:
- return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.ATK, -1);
+ return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.ATK, -1);
case BattlerTagType.OBSTRUCT:
- return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.DEF, -2);
+ return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.DEF, -2);
case BattlerTagType.SILK_TRAP:
- return new ContactStatChangeProtectedTag(sourceMove, tagType, BattleStat.SPD, -1);
+ return new ContactStatStageChangeProtectedTag(sourceMove, tagType, Stat.SPD, -1);
case BattlerTagType.BANEFUL_BUNKER:
return new ContactPoisonProtectedTag(sourceMove);
case BattlerTagType.BURNING_BULWARK:
@@ -1923,6 +1961,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source
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);
diff --git a/src/data/berry.ts b/src/data/berry.ts
index d0c9c311e16..01325ee39dd 100644
--- a/src/data/berry.ts
+++ b/src/data/berry.ts
@@ -1,14 +1,14 @@
import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { HitResult } from "../field/pokemon";
-import { BattleStat } from "./battle-stat";
import { getStatusEffectHealText } from "./status-effect";
import * as Utils from "../utils";
import { DoubleBerryEffectAbAttr, ReduceBerryUseThresholdAbAttr, applyAbAttrs } from "./ability";
import i18next from "i18next";
import { BattlerTagType } from "#enums/battler-tag-type";
import { BerryType } from "#enums/berry-type";
-import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase.js";
-import { StatChangePhase } from "#app/phases/stat-change-phase.js";
+import { Stat, type BattleStat } from "#app/enums/stat";
+import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
export function getBerryName(berryType: BerryType): string {
return i18next.t(`berry:${BerryType[berryType]}.name`);
@@ -35,9 +35,10 @@ export function getBerryPredicate(berryType: BerryType): BerryPredicate {
case BerryType.SALAC:
return (pokemon: Pokemon) => {
const threshold = new Utils.NumberHolder(0.25);
- const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
+ // 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.summonData.battleStats[battleStat] < 6;
+ return pokemon.getHpRatio() < threshold.value && pokemon.getStatStage(stat) < 6;
};
case BerryType.LANSAT:
return (pokemon: Pokemon) => {
@@ -95,10 +96,11 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
if (pokemon.battleData) {
pokemon.battleData.berriesEaten.push(berryType);
}
- const battleStat = (berryType - BerryType.LIECHI) as BattleStat;
- const statLevels = new Utils.NumberHolder(1);
- applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ battleStat ], statLevels.value));
+ // 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) => {
@@ -112,9 +114,10 @@ export function getBerryEffectFunc(berryType: BerryType): BerryEffectFunc {
if (pokemon.battleData) {
pokemon.battleData.berriesEaten.push(berryType);
}
- const statLevels = new Utils.NumberHolder(2);
- applyAbAttrs(DoubleBerryEffectAbAttr, pokemon, null, false, statLevels);
- pokemon.scene.unshiftPhase(new StatChangePhase(pokemon.scene, pokemon.getBattlerIndex(), true, [ BattleStat.RAND ], statLevels.value));
+ 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) => {
diff --git a/src/data/biomes.ts b/src/data/biomes.ts
index ed579112249..0e37cc94ff5 100644
--- a/src/data/biomes.ts
+++ b/src/data/biomes.ts
@@ -1,6 +1,6 @@
import { Type } from "./type";
import * as Utils from "../utils";
-import {pokemonEvolutions, SpeciesFormEvolution} from "./pokemon-evolutions";
+import { pokemonEvolutions, SpeciesFormEvolution } from "./pokemon-evolutions";
import i18next from "i18next";
import { Biome } from "#enums/biome";
import { Species } from "#enums/species";
@@ -37,34 +37,34 @@ export const biomeLinks: BiomeLinks = {
[Biome.PLAINS]: [ Biome.GRASS, Biome.METROPOLIS, Biome.LAKE ],
[Biome.GRASS]: Biome.TALL_GRASS,
[Biome.TALL_GRASS]: [ Biome.FOREST, Biome.CAVE ],
- [Biome.SLUM]: Biome.CONSTRUCTION_SITE,
+ [Biome.SLUM]: [ Biome.CONSTRUCTION_SITE, [ Biome.SWAMP, 2 ] ],
[Biome.FOREST]: [ Biome.JUNGLE, Biome.MEADOW ],
[Biome.SEA]: [ Biome.SEABED, Biome.ICE_CAVE ],
[Biome.SWAMP]: [ Biome.GRAVEYARD, Biome.TALL_GRASS ],
- [Biome.BEACH]: [ Biome.SEA, [ Biome.ISLAND, 4 ] ],
+ [Biome.BEACH]: [ Biome.SEA, [ Biome.ISLAND, 2 ] ],
[Biome.LAKE]: [ Biome.BEACH, Biome.SWAMP, Biome.CONSTRUCTION_SITE ],
- [Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 4 ] ],
- [Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 3 ] ],
+ [Biome.SEABED]: [ Biome.CAVE, [ Biome.VOLCANO, 3 ] ],
+ [Biome.MOUNTAIN]: [ Biome.VOLCANO, [ Biome.WASTELAND, 2 ], [ Biome.SPACE, 3 ] ],
[Biome.BADLANDS]: [ Biome.DESERT, Biome.MOUNTAIN ],
- [Biome.CAVE]: [ Biome.BADLANDS, Biome.LAKE ],
- [Biome.DESERT]: Biome.RUINS,
+ [Biome.CAVE]: [ Biome.BADLANDS, Biome.LAKE, [ Biome.LABORATORY, 2 ] ],
+ [Biome.DESERT]: [ Biome.RUINS, [ Biome.CONSTRUCTION_SITE, 2 ] ],
[Biome.ICE_CAVE]: Biome.SNOWY_FOREST,
- [Biome.MEADOW]: [ Biome.PLAINS, [ Biome.FAIRY_CAVE, 2 ] ],
+ [Biome.MEADOW]: [ Biome.PLAINS, Biome.FAIRY_CAVE ],
[Biome.POWER_PLANT]: Biome.FACTORY,
- [Biome.VOLCANO]: [ Biome.BEACH, [ Biome.ICE_CAVE, 4 ] ],
+ [Biome.VOLCANO]: [ Biome.BEACH, [ Biome.ICE_CAVE, 3 ] ],
[Biome.GRAVEYARD]: Biome.ABYSS,
- [Biome.DOJO]: [ Biome.PLAINS, [ Biome.TEMPLE, 3 ] ],
- [Biome.FACTORY]: [ Biome.PLAINS, [ Biome.LABORATORY, 4 ] ],
- [Biome.RUINS]: [ Biome.FOREST ],
+ [Biome.DOJO]: [ Biome.PLAINS, [ Biome.JUNGLE, 2], [ Biome.TEMPLE, 2 ] ],
+ [Biome.FACTORY]: [ Biome.PLAINS, [ Biome.LABORATORY, 2 ] ],
+ [Biome.RUINS]: [ Biome.MOUNTAIN, [ Biome.FOREST, 2 ] ],
[Biome.WASTELAND]: Biome.BADLANDS,
- [Biome.ABYSS]: [ Biome.CAVE, [ Biome.SPACE, 3 ], [ Biome.WASTELAND, 3 ] ],
+ [Biome.ABYSS]: [ Biome.CAVE, [ Biome.SPACE, 2 ], [ Biome.WASTELAND, 2 ] ],
[Biome.SPACE]: Biome.RUINS,
- [Biome.CONSTRUCTION_SITE]: [ Biome.DOJO, Biome.POWER_PLANT ],
+ [Biome.CONSTRUCTION_SITE]: [ Biome.POWER_PLANT, [ Biome.DOJO, 2 ] ],
[Biome.JUNGLE]: [ Biome.TEMPLE ],
- [Biome.FAIRY_CAVE]: [ Biome.ICE_CAVE, [ Biome.SPACE, 3 ] ],
- [Biome.TEMPLE]: [ Biome.SWAMP, [ Biome.RUINS, 3 ] ],
+ [Biome.FAIRY_CAVE]: [ Biome.ICE_CAVE, [ Biome.SPACE, 2 ] ],
+ [Biome.TEMPLE]: [ Biome.DESERT, [ Biome.SWAMP, 2 ], [ Biome.RUINS, 2 ] ],
[Biome.METROPOLIS]: Biome.SLUM,
- [Biome.SNOWY_FOREST]: [ Biome.FOREST, Biome.LAKE, Biome.MOUNTAIN ],
+ [Biome.SNOWY_FOREST]: [ Biome.FOREST, [ Biome.MOUNTAIN, 2 ], [ Biome.LAKE, 2 ] ],
[Biome.ISLAND]: Biome.SEA,
[Biome.LABORATORY]: Biome.CONSTRUCTION_SITE
};
@@ -7663,6 +7663,12 @@ export function initBiomes() {
biomeDepths[Biome.TOWN] = [ 0, 1 ];
const traverseBiome = (biome: Biome, depth: integer) => {
+ if (biome === Biome.END) {
+ const biomeList = Object.keys(Biome).filter(key => !isNaN(Number(key)));
+ biomeList.pop(); // Removes Biome.END from the list
+ const randIndex = Utils.randInt(biomeList.length, 1); // Will never be Biome.TOWN
+ biome = Biome[biomeList[randIndex]];
+ }
const linkedBiomes: (Biome | [ Biome, integer ])[] = Array.isArray(biomeLinks[biome])
? biomeLinks[biome] as (Biome | [ Biome, integer ])[]
: [ biomeLinks[biome] as Biome ];
diff --git a/src/data/challenge.ts b/src/data/challenge.ts
index 40d53de3687..62751b92f9c 100644
--- a/src/data/challenge.ts
+++ b/src/data/challenge.ts
@@ -13,7 +13,6 @@ import { TrainerType } from "#enums/trainer-type";
import { Nature } from "./nature";
import { Moves } from "#app/enums/moves.js";
import { TypeColor, TypeShadow } from "#app/enums/color.js";
-import { Gender } from "./gender";
import { pokemonEvolutions } from "./pokemon-evolutions";
import { pokemonFormChanges } from "./pokemon-forms";
@@ -55,6 +54,11 @@ export enum ChallengeType {
* @see {@link Challenge.applyFixedBattle}
*/
FIXED_BATTLES,
+ /**
+ * Modifies the effectiveness of Type matchups in battle
+ * @see {@linkcode Challenge.applyTypeEffectiveness}
+ */
+ TYPE_EFFECTIVENESS,
/**
* Modifies what level the AI pokemon are. UNIMPLEMENTED.
*/
@@ -327,6 +331,15 @@ export abstract class Challenge {
return false;
}
+ /**
+ * An apply function for TYPE_EFFECTIVENESS challenges. Derived classes should alter this.
+ * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move.
+ * @returns Whether this function did anything.
+ */
+ applyTypeEffectiveness(effectiveness: Utils.NumberHolder): boolean {
+ return false;
+ }
+
/**
* An apply function for AI_LEVEL challenges. Derived classes should alter this.
* @param level {@link Utils.IntegerHolder} The generated level.
@@ -645,16 +658,12 @@ export class FreshStartChallenge extends Challenge {
pokemon.luck = 0; // No luck
pokemon.shiny = false; // Not shiny
pokemon.variant = 0; // Not shiny
- pokemon.gender = Gender.MALE; // Starters default to male
pokemon.formIndex = 0; // Froakie should be base form
pokemon.ivs = [10, 10, 10, 10, 10, 10]; // Default IVs of 10 for all stats
return true;
}
- /**
- * @overrides
- */
- getDifficulty(): number {
+ override getDifficulty(): number {
return 0;
}
@@ -666,6 +675,38 @@ export class FreshStartChallenge extends Challenge {
}
}
+/**
+ * Implements an inverse battle challenge.
+ */
+export class InverseBattleChallenge extends Challenge {
+ constructor() {
+ super(Challenges.INVERSE_BATTLE, 1);
+ }
+
+ static loadChallenge(source: InverseBattleChallenge | any): InverseBattleChallenge {
+ const newChallenge = new InverseBattleChallenge();
+ newChallenge.value = source.value;
+ newChallenge.severity = source.severity;
+ return newChallenge;
+ }
+
+ override getDifficulty(): number {
+ return 0;
+ }
+
+ applyTypeEffectiveness(effectiveness: Utils.NumberHolder): boolean {
+ if (effectiveness.value < 1) {
+ effectiveness.value = 2;
+ return true;
+ } else if (effectiveness.value > 1) {
+ effectiveness.value = 0.5;
+ return true;
+ }
+
+ return false;
+ }
+}
+
/**
* Lowers the amount of starter points available.
*/
@@ -785,6 +826,14 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType
* @returns True if any challenge was successfully applied.
*/
export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.FIXED_BATTLES, waveIndex: Number, battleConfig: FixedBattleConfig): boolean;
+/**
+ * Apply all challenges that modify type effectiveness.
+ * @param gameMode {@linkcode GameMode} The current gameMode
+ * @param challengeType {@linkcode ChallengeType} ChallengeType.TYPE_EFFECTIVENESS
+ * @param effectiveness {@linkcode Utils.NumberHolder} The current effectiveness of the move.
+ * @returns True if any challenge was successfully applied.
+ */
+export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType.TYPE_EFFECTIVENESS, effectiveness: Utils.NumberHolder): boolean;
/**
* Apply all challenges that modify what level AI are.
* @param gameMode {@link GameMode} The current gameMode
@@ -866,6 +915,9 @@ export function applyChallenges(gameMode: GameMode, challengeType: ChallengeType
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;
@@ -907,6 +959,8 @@ export function copyChallenge(source: Challenge | any): Challenge {
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");
}
@@ -918,5 +972,6 @@ export function initChallenges() {
new SingleGenerationChallenge(),
new SingleTypeChallenge(),
new FreshStartChallenge(),
+ new InverseBattleChallenge(),
);
}
diff --git a/src/data/daily-run.ts b/src/data/daily-run.ts
index 0a02defe052..370b13ea3a3 100644
--- a/src/data/daily-run.ts
+++ b/src/data/daily-run.ts
@@ -40,7 +40,7 @@ export function getDailyRunStarters(scene: BattleScene, seed: string): Starter[]
}
const starterCosts: integer[] = [];
- starterCosts.push(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))));
+ starterCosts.push(Math.min(Math.round(3.5 + Math.abs(Utils.randSeedGauss(1))), 8));
starterCosts.push(Utils.randSeedInt(9 - starterCosts[0], 1));
starterCosts.push(10 - (starterCosts[0] + starterCosts[1]));
diff --git a/src/data/dialogue.ts b/src/data/dialogue.ts
index 3ef6d30643c..a2ba06b657f 100644
--- a/src/data/dialogue.ts
+++ b/src/data/dialogue.ts
@@ -1,6 +1,6 @@
import { BattleSpec } from "#enums/battle-spec";
import { TrainerType } from "#enums/trainer-type";
-import {trainerConfigs} from "./trainer-config";
+import { trainerConfigs } from "./trainer-config";
export interface TrainerTypeMessages {
encounter?: string | string[],
@@ -707,6 +707,20 @@ export const trainerTypeDialogue: TrainerTypeDialogue = {
]
}
],
+ [TrainerType.ROOD]: [
+ {
+ encounter: [
+ "dialogue:rood.encounter.1",
+ "dialogue:rood.encounter.2",
+ "dialogue:rood.encounter.3",
+ ],
+ victory: [
+ "dialogue:rood.victory.1",
+ "dialogue:rood.victory.2",
+ "dialogue:rood.victory.3",
+ ]
+ }
+ ],
[TrainerType.FLARE_GRUNT]: [
{
encounter: [
diff --git a/src/data/egg-hatch-data.ts b/src/data/egg-hatch-data.ts
new file mode 100644
index 00000000000..e754a9205c4
--- /dev/null
+++ b/src/data/egg-hatch-data.ts
@@ -0,0 +1,98 @@
+import BattleScene from "#app/battle-scene";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { DexEntry, StarterDataEntry } from "#app/system/game-data";
+
+/**
+ * Stores data associated with a specific egg and the hatched pokemon
+ * Allows hatch info to be stored at hatch then retrieved for display during egg summary
+ */
+export class EggHatchData {
+ /** the pokemon that hatched from the file (including shiny, IVs, ability) */
+ public pokemon: PlayerPokemon;
+ /** index of the egg move from the hatched pokemon (not stored in PlayerPokemon) */
+ public eggMoveIndex: number;
+ /** boolean indicating if the egg move for the hatch is new */
+ public eggMoveUnlocked: boolean;
+ /** stored copy of the hatched pokemon's dex entry before it was updated due to hatch */
+ public dexEntryBeforeUpdate: DexEntry;
+ /** stored copy of the hatched pokemon's starter entry before it was updated due to hatch */
+ public starterDataEntryBeforeUpdate: StarterDataEntry;
+ /** reference to the battle scene to get gamedata and update dex */
+ private scene: BattleScene;
+
+ constructor(scene: BattleScene, pokemon: PlayerPokemon, eggMoveIndex: number) {
+ this.scene = scene;
+ this.pokemon = pokemon;
+ this.eggMoveIndex = eggMoveIndex;
+ }
+
+ /**
+ * Sets the boolean for if the egg move for the hatch is a new unlock
+ * @param unlocked True if the EM is new
+ */
+ setEggMoveUnlocked(unlocked: boolean) {
+ this.eggMoveUnlocked = unlocked;
+ }
+
+ /**
+ * Stores a copy of the current DexEntry of the pokemon and StarterDataEntry of its starter
+ * Used before updating the dex, so comparing the pokemon to these entries will show the new attributes
+ */
+ setDex() {
+ const currDexEntry = this.scene.gameData.dexData[this.pokemon.species.speciesId];
+ const currStarterDataEntry = this.scene.gameData.starterData[this.pokemon.species.getRootSpeciesId()];
+ this.dexEntryBeforeUpdate = {
+ seenAttr: currDexEntry.seenAttr,
+ caughtAttr: currDexEntry.caughtAttr,
+ natureAttr: currDexEntry.natureAttr,
+ seenCount: currDexEntry.seenCount,
+ caughtCount: currDexEntry.caughtCount,
+ hatchedCount: currDexEntry.hatchedCount,
+ ivs: [...currDexEntry.ivs]
+ };
+ this.starterDataEntryBeforeUpdate = {
+ moveset: currStarterDataEntry.moveset,
+ eggMoves: currStarterDataEntry.eggMoves,
+ candyCount: currStarterDataEntry.candyCount,
+ friendship: currStarterDataEntry.friendship,
+ abilityAttr: currStarterDataEntry.abilityAttr,
+ passiveAttr: currStarterDataEntry.passiveAttr,
+ valueReduction: currStarterDataEntry.valueReduction,
+ classicWinCount: currStarterDataEntry.classicWinCount
+ };
+ }
+
+ /**
+ * Gets the dex entry before update
+ * @returns Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex
+ */
+ getDex(): DexEntry {
+ return this.dexEntryBeforeUpdate;
+ }
+
+ /**
+ * Gets the starter dex entry before update
+ * @returns Starter Dex Entry corresponding to this pokemon before the pokemon was added / updated to dex
+ */
+ getStarterEntry(): StarterDataEntry {
+ return this.starterDataEntryBeforeUpdate;
+ }
+
+ /**
+ * Update the pokedex data corresponding with the new hatch's pokemon data
+ * Also sets whether the egg move is a new unlock or not
+ * @param showMessage boolean to show messages for the new catches and egg moves (false by default)
+ * @returns
+ */
+ updatePokemon(showMessage : boolean = false) {
+ return new Promise(resolve => {
+ this.scene.gameData.setPokemonCaught(this.pokemon, true, true, showMessage).then(() => {
+ this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs);
+ this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex, showMessage).then((value) => {
+ this.setEggMoveUnlocked(value);
+ resolve();
+ });
+ });
+ });
+ }
+}
diff --git a/src/data/egg-moves.ts b/src/data/egg-moves.ts
index f88ac2c71b2..b516238c46e 100644
--- a/src/data/egg-moves.ts
+++ b/src/data/egg-moves.ts
@@ -43,7 +43,7 @@ export const speciesEggMoves = {
[Species.SHELLDER]: [ Moves.ROCK_BLAST, Moves.WATER_SHURIKEN, Moves.BANEFUL_BUNKER, Moves.BONE_RUSH ],
[Species.GASTLY]: [ Moves.SLUDGE_BOMB, Moves.AURA_SPHERE, Moves.NASTY_PLOT, Moves.ASTRAL_BARRAGE ],
[Species.ONIX]: [ Moves.SHORE_UP, Moves.BODY_PRESS, Moves.HEAVY_SLAM, Moves.DIAMOND_STORM ],
- [Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.SPORE ],
+ [Species.DROWZEE]: [ Moves.BADDY_BAD, Moves.STRENGTH_SAP, Moves.LUMINA_CRASH, Moves.DARK_VOID ],
[Species.KRABBY]: [ Moves.FIRE_LASH, Moves.PLAY_ROUGH, Moves.IVY_CUDGEL, Moves.SHELL_SMASH ],
[Species.VOLTORB]: [ Moves.NASTY_PLOT, Moves.OVERHEAT, Moves.FROST_BREATH, Moves.ELECTRO_DRIFT ],
[Species.EXEGGCUTE]: [ Moves.FICKLE_BEAM, Moves.APPLE_ACID, Moves.TRICK_ROOM, Moves.LUMINA_CRASH ],
@@ -125,7 +125,7 @@ export const speciesEggMoves = {
[Species.SUICUNE]: [ Moves.RECOVER, Moves.NASTY_PLOT, Moves.FREEZE_DRY, Moves.STEAM_ERUPTION ],
[Species.LARVITAR]: [ Moves.DRAGON_DANCE, Moves.MOUNTAIN_GALE, Moves.SHORE_UP, Moves.DIAMOND_STORM ],
[Species.LUGIA]: [ Moves.NASTY_PLOT, Moves.LUMINA_CRASH, Moves.AURA_SPHERE, Moves.OBLIVION_WING ],
- [Species.HO_OH]: [ Moves.FLOATY_FALL, Moves.SOLAR_BLADE, Moves.REVIVAL_BLESSING, Moves.BOLT_BEAK ],
+ [Species.HO_OH]: [ Moves.FLOATY_FALL, Moves.PRECIPICE_BLADES, Moves.REVIVAL_BLESSING, Moves.BOLT_BEAK ],
[Species.CELEBI]: [ Moves.PHOTON_GEYSER, Moves.MATCHA_GOTCHA, Moves.REVIVAL_BLESSING, Moves.QUIVER_DANCE ],
[Species.TREECKO]: [ Moves.NASTY_PLOT, Moves.APPLE_ACID, Moves.SECRET_SWORD, Moves.DRAGON_ENERGY ],
[Species.TORCHIC]: [ Moves.HIGH_JUMP_KICK, Moves.SUPERCELL_SLAM, Moves.KNOCK_OFF, Moves.V_CREATE ],
@@ -249,7 +249,7 @@ export const speciesEggMoves = {
[Species.CRESSELIA]: [ Moves.COSMIC_POWER, Moves.SECRET_SWORD, Moves.SIZZLY_SLIDE, Moves.LUMINA_CRASH ],
[Species.PHIONE]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ],
[Species.MANAPHY]: [ Moves.BOUNCY_BUBBLE, Moves.FREEZE_DRY, Moves.SPLISHY_SPLASH, Moves.QUIVER_DANCE ],
- [Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.SEARING_SHOT, Moves.SPORE ],
+ [Species.DARKRAI]: [ Moves.FIERY_WRATH, Moves.MOONBLAST, Moves.FIERY_DANCE, Moves.MAKE_IT_RAIN ],
[Species.SHAYMIN]: [ Moves.MATCHA_GOTCHA, Moves.FIERY_DANCE, Moves.AEROBLAST, Moves.QUIVER_DANCE ],
[Species.ARCEUS]: [ Moves.NO_RETREAT, Moves.COLLISION_COURSE, Moves.ASTRAL_BARRAGE, Moves.MULTI_ATTACK ],
[Species.VICTINI]: [ Moves.BLUE_FLARE, Moves.BOLT_STRIKE, Moves.LUSTER_PURGE, Moves.VICTORY_DANCE ],
diff --git a/src/data/egg.ts b/src/data/egg.ts
index 3e872d364f3..9beb944de69 100644
--- a/src/data/egg.ts
+++ b/src/data/egg.ts
@@ -139,46 +139,57 @@ export class Egg {
////
constructor(eggOptions?: IEggOptions) {
- //if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.")
+ const generateEggProperties = (eggOptions?: IEggOptions) => {
+ //if (eggOptions.tier && eggOptions.species) throw Error("Error egg can't have species and tier as option. only choose one of them.")
- this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct?
- // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced
- this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier());
- // If egg was pulled, check if egg pity needs to override the egg tier
- if (eggOptions?.pulled) {
- // Needs this._tier and this._sourceType to work
- this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
- }
+ this._sourceType = eggOptions?.sourceType!; // TODO: is this bang correct?
+ // Ensure _sourceType is defined before invoking rollEggTier(), as it is referenced
+ this._tier = eggOptions?.tier ?? (Overrides.EGG_TIER_OVERRIDE ?? this.rollEggTier());
+ // If egg was pulled, check if egg pity needs to override the egg tier
+ if (eggOptions?.pulled) {
+ // Needs this._tier and this._sourceType to work
+ this.checkForPityTierOverrides(eggOptions.scene!); // TODO: is this bang correct?
+ }
- this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier);
+ this._id = eggOptions?.id ?? Utils.randInt(EGG_SEED, EGG_SEED * this._tier);
- this._sourceType = eggOptions?.sourceType ?? undefined;
- this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
- this._timestamp = eggOptions?.timestamp ?? new Date().getTime();
+ this._sourceType = eggOptions?.sourceType ?? undefined;
+ this._hatchWaves = eggOptions?.hatchWaves ?? this.getEggTierDefaultHatchWaves();
+ this._timestamp = eggOptions?.timestamp ?? new Date().getTime();
- // First roll shiny and variant so we can filter if species with an variant exist
- this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny());
- this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant());
- this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct?
+ // First roll shiny and variant so we can filter if species with an variant exist
+ this._isShiny = eggOptions?.isShiny ?? (Overrides.EGG_SHINY_OVERRIDE || this.rollShiny());
+ this._variantTier = eggOptions?.variantTier ?? (Overrides.EGG_VARIANT_OVERRIDE ?? this.rollVariant());
+ this._species = eggOptions?.species ?? this.rollSpecies(eggOptions!.scene!)!; // TODO: Are those bangs correct?
- this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false;
+ this._overrideHiddenAbility = eggOptions?.overrideHiddenAbility ?? false;
- // Override egg tier and hatchwaves if species was given
- if (eggOptions?.species) {
- this._tier = this.getEggTierFromSpeciesStarterValue();
- this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves();
- }
- // If species has no variant, set variantTier to common. This needs to
- // be done because species with no variants get filtered at rollSpecies but if the
- // species is set via options or the legendary gacha pokemon gets choosen the check never happens
- if (this._species && !getPokemonSpecies(this._species).hasVariants()) {
- this._variantTier = VariantTier.COMMON;
- }
- // Needs this._tier so it needs to be generated afer the tier override if bought from same species
- this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex();
- if (eggOptions?.pulled) {
- this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct?
- this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct?
+ // Override egg tier and hatchwaves if species was given
+ if (eggOptions?.species) {
+ this._tier = this.getEggTierFromSpeciesStarterValue();
+ this._hatchWaves = eggOptions.hatchWaves ?? this.getEggTierDefaultHatchWaves();
+ }
+ // If species has no variant, set variantTier to common. This needs to
+ // be done because species with no variants get filtered at rollSpecies but if the
+ // species is set via options or the legendary gacha pokemon gets choosen the check never happens
+ if (this._species && !getPokemonSpecies(this._species).hasVariants()) {
+ this._variantTier = VariantTier.COMMON;
+ }
+ // Needs this._tier so it needs to be generated afer the tier override if bought from same species
+ this._eggMoveIndex = eggOptions?.eggMoveIndex ?? this.rollEggMoveIndex();
+ if (eggOptions?.pulled) {
+ this.increasePullStatistic(eggOptions.scene!); // TODO: is this bang correct?
+ this.addEggToGameData(eggOptions.scene!); // TODO: is this bang correct?
+ }
+ };
+
+ if (eggOptions?.scene) {
+ const seedOverride = Utils.randomString(24);
+ eggOptions?.scene.executeWithSeedOffset(() => {
+ generateEggProperties(eggOptions);
+ }, 0, seedOverride);
+ } else { // For legacy eggs without scene
+ generateEggProperties(eggOptions);
}
}
@@ -200,37 +211,46 @@ export class Egg {
// Generates a PlayerPokemon from an egg
public generatePlayerPokemon(scene: BattleScene): PlayerPokemon {
- // Legacy egg wants to hatch. Generate missing properties
- if (!this._species) {
- this._isShiny = this.rollShiny();
- this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
- }
+ let ret: PlayerPokemon;
- let pokemonSpecies = getPokemonSpecies(this._species);
- // Special condition to have Phione eggs also have a chance of generating Manaphy
- if (this._species === Species.PHIONE) {
- pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
- }
+ const generatePlayerPokemonHelper = (scene: BattleScene) => {
+ // Legacy egg wants to hatch. Generate missing properties
+ if (!this._species) {
+ this._isShiny = this.rollShiny();
+ this._species = this.rollSpecies(scene!)!; // TODO: are these bangs correct?
+ }
- // Sets the hidden ability if a hidden ability exists and
- // the override is set or the egg hits the chance
- let abilityIndex: number | undefined = undefined;
- const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
- const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE));
- if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
- abilityIndex = 2;
- }
+ let pokemonSpecies = getPokemonSpecies(this._species);
+ // Special condition to have Phione eggs also have a chance of generating Manaphy
+ if (this._species === Species.PHIONE) {
+ pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY);
+ }
- // This function has way to many optional parameters
- const ret: PlayerPokemon = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false);
- ret.shiny = this._isShiny;
- ret.variant = this._variantTier;
+ // Sets the hidden ability if a hidden ability exists and
+ // the override is set or the egg hits the chance
+ let abilityIndex: number | undefined = undefined;
+ const sameSpeciesEggHACheck = (this._sourceType === EggSourceType.SAME_SPECIES_EGG && !Utils.randSeedInt(SAME_SPECIES_EGG_HA_RATE));
+ const gachaEggHACheck = (!(this._sourceType === EggSourceType.SAME_SPECIES_EGG) && !Utils.randSeedInt(GACHA_EGG_HA_RATE));
+ if (pokemonSpecies.abilityHidden && (this._overrideHiddenAbility || sameSpeciesEggHACheck || gachaEggHACheck)) {
+ abilityIndex = 2;
+ }
- const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
+ // This function has way to many optional parameters
+ ret = scene.addPlayerPokemon(pokemonSpecies, 1, abilityIndex, undefined, undefined, false);
+ ret.shiny = this._isShiny;
+ ret.variant = this._variantTier;
- for (let s = 0; s < ret.ivs.length; s++) {
- ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
- }
+ const secondaryIvs = Utils.getIvsFromId(Utils.randSeedInt(4294967295));
+
+ for (let s = 0; s < ret.ivs.length; s++) {
+ ret.ivs[s] = Math.max(ret.ivs[s], secondaryIvs[s]);
+ }
+ };
+
+ ret = ret!; // Tell TS compiler it's defined now
+ scene.executeWithSeedOffset(() => {
+ generatePlayerPokemonHelper(scene);
+ }, this._id, EGG_SEED.toString());
return ret;
}
diff --git a/src/data/move.ts b/src/data/move.ts
index 2869475501a..137bac39214 100644
--- a/src/data/move.ts
+++ b/src/data/move.ts
@@ -1,10 +1,9 @@
import { ChargeAnim, MoveChargeAnim, initMoveAnim, loadMoveAnimAssets } from "./battle-anims";
-import { BattleStat, getBattleStatName } from "./battle-stat";
import { EncoreTag, GulpMissileTag, HelpingHandTag, SemiInvulnerableTag, ShellTrapTag, StockpilingTag, TrappedTag, TypeBoostTag } from "./battler-tags";
import { getPokemonNameWithAffix } from "../messages";
import Pokemon, { AttackMoveResult, EnemyPokemon, HitResult, MoveResult, PlayerPokemon, PokemonMove, TurnMove } from "../field/pokemon";
import { StatusEffect, getStatusEffectHealText, isNonVolatileStatusEffect, getNonVolatileStatusEffects } from "./status-effect";
-import { getTypeResistances, Type } from "./type";
+import { getTypeDamageMultiplier, Type } from "./type";
import { Constructor } from "#app/utils";
import * as Utils from "../utils";
import { WeatherType } from "./weather";
@@ -13,7 +12,6 @@ import { UnswappableAbilityAbAttr, UncopiableAbilityAbAttr, UnsuppressableAbilit
import { allAbilities } from "./ability";
import { PokemonHeldItemModifier, BerryModifier, PreserveBerryModifier, PokemonMoveAccuracyBoosterModifier, AttackTypeBoosterModifier, PokemonMultiHitModifier } from "../modifier/modifier";
import { BattlerIndex, BattleType } from "../battle";
-import { Stat } from "./pokemon-stat";
import { TerrainType } from "./terrain";
import { ModifierPoolType } from "#app/modifier/modifier-type";
import { Command } from "../ui/command-ui-handler";
@@ -27,16 +25,20 @@ import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { MoveUsedEvent } from "#app/events/battle-scene";
+import { Stat, type BattleStat, type EffectiveStat, BATTLE_STATS, EFFECTIVE_STATS, getStatKey } from "#app/enums/stat";
import { PartyStatusCurePhase } from "#app/phases/party-status-cure-phase";
import { BattleEndPhase } from "#app/phases/battle-end-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { MovePhase } from "#app/phases/move-phase";
import { NewBattlePhase } from "#app/phases/new-battle-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
import { SwitchPhase } from "#app/phases/switch-phase";
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
import { SpeciesFormChangeRevertWeatherFormTrigger } from "./pokemon-forms";
+import { NumberHolder } from "#app/utils";
+import { GameMode } from "#app/game-mode";
+import { applyChallenges, ChallengeType } from "./challenge";
export enum MoveCategory {
PHYSICAL,
@@ -816,10 +818,10 @@ export class AttackMove extends Move {
attackScore = Math.pow(effectiveness - 1, 2) * effectiveness < 1 ? -2 : 2;
if (attackScore) {
if (this.category === MoveCategory.PHYSICAL) {
- const atk = new Utils.IntegerHolder(user.getBattleStat(Stat.ATK, target));
+ const atk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.ATK, target));
applyMoveAttrs(VariableAtkAttr, user, target, move, atk);
- if (atk.value > user.getBattleStat(Stat.SPATK, target)) {
- const statRatio = user.getBattleStat(Stat.SPATK, target) / atk.value;
+ if (atk.value > user.getEffectiveStat(Stat.SPATK, target)) {
+ const statRatio = user.getEffectiveStat(Stat.SPATK, target) / atk.value;
if (statRatio <= 0.75) {
attackScore *= 2;
} else if (statRatio <= 0.875) {
@@ -827,10 +829,10 @@ export class AttackMove extends Move {
}
}
} else {
- const spAtk = new Utils.IntegerHolder(user.getBattleStat(Stat.SPATK, target));
+ const spAtk = new Utils.IntegerHolder(user.getEffectiveStat(Stat.SPATK, target));
applyMoveAttrs(VariableAtkAttr, user, target, move, spAtk);
- if (spAtk.value > user.getBattleStat(Stat.ATK, target)) {
- const statRatio = user.getBattleStat(Stat.ATK, target) / spAtk.value;
+ if (spAtk.value > user.getEffectiveStat(Stat.ATK, target)) {
+ const statRatio = user.getEffectiveStat(Stat.ATK, target) / spAtk.value;
if (statRatio <= 0.75) {
attackScore *= 2;
} else if (statRatio <= 0.875) {
@@ -1097,9 +1099,9 @@ export class PreMoveMessageAttr extends MoveAttr {
*/
export class RespectAttackTypeImmunityAttr extends MoveAttr { }
-export class IgnoreOpponentStatChangesAttr extends MoveAttr {
+export class IgnoreOpponentStatStagesAttr extends MoveAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- (args[0] as Utils.IntegerHolder).value = 0;
+ (args[0] as Utils.BooleanHolder).value = true;
return true;
}
@@ -1723,10 +1725,9 @@ export class HealOnAllyAttr extends HealAttr {
*/
export class HitHealAttr extends MoveEffectAttr {
private healRatio: number;
- private message: string;
- private healStat: Stat | null;
+ private healStat: EffectiveStat | null;
- constructor(healRatio?: number | null, healStat?: Stat) {
+ constructor(healRatio?: number | null, healStat?: EffectiveStat) {
super(true, MoveEffectTrigger.HIT);
this.healRatio = healRatio ?? 0.5;
@@ -1748,7 +1749,7 @@ export class HitHealAttr extends MoveEffectAttr {
const reverseDrain = target.hasAbilityWithAttr(ReverseDrainAbAttr, false);
if (this.healStat !== null) {
// Strength Sap formula
- healAmount = target.getBattleStat(this.healStat);
+ healAmount = target.getEffectiveStat(this.healStat);
message = i18next.t("battle:drainMessage", {pokemonName: getPokemonNameWithAffix(target)});
} else {
// Default healing formula used by draining moves like Absorb, Draining Kiss, Bitter Blade, etc.
@@ -1778,7 +1779,7 @@ export class HitHealAttr extends MoveEffectAttr {
*/
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
if (this.healStat) {
- const healAmount = target.getBattleStat(this.healStat);
+ const healAmount = target.getEffectiveStat(this.healStat);
return Math.floor(Math.max(0, (Math.min(1, (healAmount+user.hp)/user.getMaxHp() - 0.33))) / user.getHpRatio());
}
return Math.floor(Math.max((1 - user.getHpRatio()) - 0.33, 0) * (move.power / 4));
@@ -1946,6 +1947,13 @@ export class StatusEffectAttr extends MoveEffectAttr {
return false;
}
}
+
+ if (user !== target && target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)) {
+ 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)) {
applyPostAttackAbAttrs(ConfusionOnStatusEffectAbAttr, user, target, move, null, false, this.effect);
@@ -2502,14 +2510,14 @@ export class ElectroShotChargeAttr extends ChargeAttr {
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 StatChangeAttr(BattleStat.SPATK, 1, true);
+ 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 StatChangeAttr(BattleStat.SPATK, 1, true);
+ 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;
@@ -2557,18 +2565,16 @@ export class DelayedAttackAttr extends OverrideMoveEffectAttr {
}
}
-export class StatChangeAttr extends MoveEffectAttr {
+export class StatStageChangeAttr extends MoveEffectAttr {
public stats: BattleStat[];
- public levels: integer;
+ public stages: integer;
private condition: MoveConditionFunc | null;
private showMessage: boolean;
- constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc | null, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false) {
+ constructor(stats: BattleStat[], stages: integer, selfTarget?: boolean, condition?: MoveConditionFunc | null, showMessage: boolean = true, firstHitOnly: boolean = false, moveEffectTrigger: MoveEffectTrigger = MoveEffectTrigger.HIT, firstTargetOnly: boolean = false) {
super(selfTarget, moveEffectTrigger, firstHitOnly, false, firstTargetOnly);
- this.stats = typeof(stats) === "number"
- ? [ stats as BattleStat ]
- : stats as BattleStat[];
- this.levels = levels;
+ this.stats = stats;
+ this.stages = stages;
this.condition = condition!; // TODO: is this bang correct?
this.showMessage = showMessage;
}
@@ -2580,8 +2586,8 @@ export class StatChangeAttr extends MoveEffectAttr {
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
if (moveChance < 0 || moveChance === 100 || user.randSeedInt(100) < moveChance) {
- const levels = this.getLevels(user);
- user.scene.unshiftPhase(new StatChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, levels, this.showMessage));
+ const stages = this.getLevels(user);
+ user.scene.unshiftPhase(new StatStageChangePhase(user.scene, (this.selfTarget ? user : target).getBattlerIndex(), this.selfTarget, this.stats, stages, this.showMessage));
return true;
}
@@ -2589,7 +2595,7 @@ export class StatChangeAttr extends MoveEffectAttr {
}
getLevels(_user: Pokemon): integer {
- return this.levels;
+ return this.stages;
}
getTargetBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
@@ -2597,29 +2603,30 @@ export class StatChangeAttr extends MoveEffectAttr {
const moveLevels = this.getLevels(user);
for (const stat of this.stats) {
let levels = moveLevels;
+ const statStage = target.getStatStage(stat);
if (levels > 0) {
- levels = Math.min(target.summonData.battleStats[stat] + levels, 6) - target.summonData.battleStats[stat];
+ levels = Math.min(statStage + levels, 6) - statStage;
} else {
- levels = Math.max(target.summonData.battleStats[stat] + levels, -6) - target.summonData.battleStats[stat];
+ levels = Math.max(statStage + levels, -6) - statStage;
}
let noEffect = false;
switch (stat) {
- case BattleStat.ATK:
+ case Stat.ATK:
if (this.selfTarget) {
noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL);
}
break;
- case BattleStat.DEF:
+ case Stat.DEF:
if (!this.selfTarget) {
noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.PHYSICAL);
}
break;
- case BattleStat.SPATK:
+ case Stat.SPATK:
if (this.selfTarget) {
noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL);
}
break;
- case BattleStat.SPDEF:
+ case Stat.SPDEF:
if (!this.selfTarget) {
noEffect = !user.getMoveset().find(m => m instanceof AttackMove && m.category === MoveCategory.SPECIAL);
}
@@ -2634,18 +2641,16 @@ export class StatChangeAttr extends MoveEffectAttr {
}
}
-export class PostVictoryStatChangeAttr extends MoveAttr {
+export class PostVictoryStatStageChangeAttr extends MoveAttr {
private stats: BattleStat[];
- private levels: integer;
+ private stages: number;
private condition: MoveConditionFunc | null;
private showMessage: boolean;
- constructor(stats: BattleStat | BattleStat[], levels: integer, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false) {
+ constructor(stats: BattleStat[], stages: number, selfTarget?: boolean, condition?: MoveConditionFunc, showMessage: boolean = true, firstHitOnly: boolean = false) {
super();
- this.stats = typeof(stats) === "number"
- ? [ stats as BattleStat ]
- : stats as BattleStat[];
- this.levels = levels;
+ this.stats = stats;
+ this.stages = stages;
this.condition = condition!; // TODO: is this bang correct?
this.showMessage = showMessage;
}
@@ -2653,49 +2658,48 @@ export class PostVictoryStatChangeAttr extends MoveAttr {
if (this.condition && !this.condition(user, target, move)) {
return;
}
- const statChangeAttr = new StatChangeAttr(this.stats, this.levels, this.showMessage);
+ const statChangeAttr = new StatStageChangeAttr(this.stats, this.stages, this.showMessage);
statChangeAttr.apply(user, target, move);
}
}
-export class AcupressureStatChangeAttr extends MoveEffectAttr {
+export class AcupressureStatStageChangeAttr extends MoveEffectAttr {
constructor() {
super();
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean | Promise {
- let randStats = [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD, BattleStat.ACC, BattleStat.EVA ];
- randStats = randStats.filter(s => target.summonData.battleStats[s] < 6);
+ const randStats = BATTLE_STATS.filter(s => target.getStatStage(s) < 6);
if (randStats.length > 0) {
- const boostStat = [randStats[Utils.randInt(randStats.length)]];
- user.scene.unshiftPhase(new StatChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2));
+ const boostStat = [randStats[user.randSeedInt(randStats.length)]];
+ user.scene.unshiftPhase(new StatStageChangePhase(user.scene, target.getBattlerIndex(), this.selfTarget, boostStat, 2));
return true;
}
return false;
}
}
-export class GrowthStatChangeAttr extends StatChangeAttr {
+export class GrowthStatStageChangeAttr extends StatStageChangeAttr {
constructor() {
- super([ BattleStat.ATK, BattleStat.SPATK ], 1, true);
+ super([ Stat.ATK, Stat.SPATK ], 1, true);
}
getLevels(user: Pokemon): number {
if (!user.scene.arena.weather?.isEffectSuppressed(user.scene)) {
const weatherType = user.scene.arena.weather?.weatherType;
if (weatherType === WeatherType.SUNNY || weatherType === WeatherType.HARSH_SUN) {
- return this.levels + 1;
+ return this.stages + 1;
}
}
- return this.levels;
+ return this.stages;
}
}
-export class CutHpStatBoostAttr extends StatChangeAttr {
+export class CutHpStatStageBoostAttr extends StatStageChangeAttr {
private cutRatio: integer;
private messageCallback: ((user: Pokemon) => void) | undefined;
- constructor(stat: BattleStat | BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) {
+ constructor(stat: BattleStat[], levels: integer, cutRatio: integer, messageCallback?: ((user: Pokemon) => void) | undefined) {
super(stat, levels, true, null, true);
this.cutRatio = cutRatio;
@@ -2716,7 +2720,7 @@ export class CutHpStatBoostAttr extends StatChangeAttr {
}
getCondition(): MoveConditionFunc {
- return (user, target, move) => user.getHpRatio() > 1 / this.cutRatio && this.stats.some(s => user.summonData.battleStats[s] < 6);
+ return (user, _target, _move) => user.getHpRatio() > 1 / this.cutRatio && this.stats.some(s => user.getStatStage(s) < 6);
}
}
@@ -2726,9 +2730,11 @@ export class CopyStatsAttr extends MoveEffectAttr {
return false;
}
- for (let s = 0; s < target.summonData.battleStats.length; s++) {
- user.summonData.battleStats[s] = target.summonData.battleStats[s];
+ // Copy all stat stages
+ for (const s of BATTLE_STATS) {
+ user.setStatStage(s, target.getStatStage(s));
}
+
if (target.getTag(BattlerTagType.CRIT_BOOST)) {
user.addTag(BattlerTagType.CRIT_BOOST, 0, move.id);
} else {
@@ -2748,9 +2754,10 @@ export class InvertStatsAttr extends MoveEffectAttr {
return false;
}
- for (let s = 0; s < target.summonData.battleStats.length; s++) {
- target.summonData.battleStats[s] *= -1;
+ for (const s of BATTLE_STATS) {
+ target.setStatStage(s, -target.getStatStage(s));
}
+
target.updateInfo();
user.updateInfo();
@@ -2784,39 +2791,61 @@ export class ResetStatsAttr extends MoveEffectAttr {
}
resetStats(pokemon: Pokemon) {
- for (let s = 0; s < pokemon.summonData.battleStats.length; s++) {
- pokemon.summonData.battleStats[s] = 0;
+ for (const s of BATTLE_STATS) {
+ pokemon.setStatStage(s, 0);
}
pokemon.updateInfo();
}
}
/**
- * Attribute used for moves which swap the user and the target's stat changes.
+ * Attribute used for status moves, specifically Heart, Guard, and Power Swap,
+ * that swaps the user's and target's corresponding stat stages.
+ * @extends MoveEffectAttr
+ * @see {@linkcode apply}
*/
-export class SwapStatsAttr extends MoveEffectAttr {
+export class SwapStatStagesAttr extends MoveEffectAttr {
+ /** The stat stages to be swapped between the user and the target */
+ private stats: readonly BattleStat[];
+
+ constructor(stats: readonly BattleStat[]) {
+ super();
+
+ this.stats = stats;
+ }
+
/**
- * Swaps the user and the target's stat changes.
- * @param user Pokemon that used the move
- * @param target The target of the move
- * @param move Move with this attribute
+ * For all {@linkcode stats}, swaps the user's and target's corresponding stat
+ * stage.
+ * @param user the {@linkcode Pokemon} that used the move
+ * @param target the {@linkcode Pokemon} that the move was used on
+ * @param move N/A
* @param args N/A
- * @returns true if the function succeeds
+ * @returns true if attribute application succeeds
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any []): boolean {
- if (!super.apply(user, target, move, args)) {
- return false;
- } //Exits if the move can't apply
- let priorBoost : integer; //For storing a stat boost
- for (let s = 0; s < target.summonData.battleStats.length; s++) {
- priorBoost = user.summonData.battleStats[s]; //Store user stat boost
- user.summonData.battleStats[s] = target.summonData.battleStats[s]; //Applies target boost to self
- target.summonData.battleStats[s] = priorBoost; //Applies stored boost to target
+ if (super.apply(user, target, move, args)) {
+ for (const s of BATTLE_STATS) {
+ const temp = user.getStatStage(s);
+ user.setStatStage(s, target.getStatStage(s));
+ target.setStatStage(s, temp);
+ }
+
+ target.updateInfo();
+ user.updateInfo();
+
+ if (this.stats.length === 7) {
+ user.scene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", { pokemonName: getPokemonNameWithAffix(user) }));
+ } else if (this.stats.length === 2) {
+ user.scene.queueMessage(i18next.t("moveTriggers:switchedTwoStatChanges", {
+ pokemonName: getPokemonNameWithAffix(user),
+ firstStat: i18next.t(getStatKey(this.stats[0])),
+ secondStat: i18next.t(getStatKey(this.stats[1]))
+ }));
+ }
+ return true;
}
- target.updateInfo();
- user.updateInfo();
- target.scene.queueMessage(i18next.t("moveTriggers:switchedStatChanges", {pokemonName: getPokemonNameWithAffix(user)}));
- return true;
+ return false;
}
}
@@ -3061,7 +3090,7 @@ export class WeightPowerAttr extends VariablePowerAttr {
**/
export class ElectroBallPowerAttr extends VariablePowerAttr {
/**
- * Move that deals more damage the faster {@linkcode BattleStat.SPD}
+ * Move that deals more damage the faster {@linkcode Stat.SPD}
* the user is compared to the target.
* @param user Pokemon that used the move
* @param target The target of the move
@@ -3072,7 +3101,7 @@ export class ElectroBallPowerAttr extends VariablePowerAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const power = args[0] as Utils.NumberHolder;
- const statRatio = target.getBattleStat(Stat.SPD) / user.getBattleStat(Stat.SPD);
+ const statRatio = target.getEffectiveStat(Stat.SPD) / user.getEffectiveStat(Stat.SPD);
const statThresholds = [ 0.25, 1 / 3, 0.5, 1, -1 ];
const statThresholdPowers = [ 150, 120, 80, 60, 40 ];
@@ -3096,7 +3125,7 @@ export class ElectroBallPowerAttr extends VariablePowerAttr {
**/
export class GyroBallPowerAttr extends VariablePowerAttr {
/**
- * Move that deals more damage the slower {@linkcode BattleStat.SPD}
+ * Move that deals more damage the slower {@linkcode Stat.SPD}
* the user is compared to the target.
* @param user Pokemon that used the move
* @param target The target of the move
@@ -3106,14 +3135,14 @@ export class GyroBallPowerAttr extends VariablePowerAttr {
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const power = args[0] as Utils.NumberHolder;
- const userSpeed = user.getBattleStat(Stat.SPD);
+ const userSpeed = user.getEffectiveStat(Stat.SPD);
if (userSpeed < 1) {
// Gen 6+ always have 1 base power
power.value = 1;
return true;
}
- power.value = Math.floor(Math.min(150, 25 * target.getBattleStat(Stat.SPD) / userSpeed + 1));
+ power.value = Math.floor(Math.min(150, 25 * target.getEffectiveStat(Stat.SPD) / userSpeed + 1));
return true;
}
}
@@ -3333,18 +3362,18 @@ export class HitCountPowerAttr extends VariablePowerAttr {
}
/**
- * Turning a once was (StatChangeCountPowerAttr) statement and making it available to call for any attribute.
- * @param {Pokemon} pokemon The pokemon that is being used to calculate the count of positive stats
- * @returns {number} Returns the amount of positive stats
+ * Tallies the number of positive stages for a given {@linkcode Pokemon}.
+ * @param pokemon The {@linkcode Pokemon} that is being used to calculate the count of positive stats
+ * @returns the amount of positive stats
*/
-const countPositiveStats = (pokemon: Pokemon): number => {
- return pokemon.summonData.battleStats.reduce((total, stat) => (stat && stat > 0) ? total + stat : total, 0);
+const countPositiveStatStages = (pokemon: Pokemon): number => {
+ return pokemon.getStatStages().reduce((total, stat) => (stat && stat > 0) ? total + stat : total, 0);
};
/**
- * Attribute that increases power based on the amount of positive stat increases.
+ * Attribute that increases power based on the amount of positive stat stage increases.
*/
-export class StatChangeCountPowerAttr extends VariablePowerAttr {
+export class PositiveStatStagePowerAttr extends VariablePowerAttr {
/**
* @param {Pokemon} user The pokemon that is being used to calculate the amount of positive stats
@@ -3354,9 +3383,9 @@ export class StatChangeCountPowerAttr extends VariablePowerAttr {
* @returns {boolean} Returns true if attribute is applied
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- const positiveStats: number = countPositiveStats(user);
+ const positiveStatStages: number = countPositiveStatStages(user);
- (args[0] as Utils.NumberHolder).value += positiveStats * 20;
+ (args[0] as Utils.NumberHolder).value += positiveStatStages * 20;
return true;
}
}
@@ -3378,10 +3407,10 @@ export class PunishmentPowerAttr extends VariablePowerAttr {
* @returns Returns true if attribute is applied
*/
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- const positiveStats: number = countPositiveStats(target);
+ const positiveStatStages: number = countPositiveStatStages(target);
(args[0] as Utils.NumberHolder).value = Math.min(
this.PUNISHMENT_MAX_BASE_POWER,
- this.PUNISHMENT_MIN_BASE_POWER + positiveStats * 20
+ this.PUNISHMENT_MIN_BASE_POWER + positiveStatStages * 20
);
return true;
}
@@ -3601,7 +3630,7 @@ export class TargetAtkUserAtkAttr extends VariableAtkAttr {
super();
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- (args[0] as Utils.IntegerHolder).value = target.getBattleStat(Stat.ATK, target);
+ (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.ATK, target);
return true;
}
}
@@ -3612,7 +3641,7 @@ export class DefAtkAttr extends VariableAtkAttr {
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- (args[0] as Utils.IntegerHolder).value = user.getBattleStat(Stat.DEF, target);
+ (args[0] as Utils.IntegerHolder).value = user.getEffectiveStat(Stat.DEF, target);
return true;
}
}
@@ -3634,7 +3663,7 @@ export class DefDefAttr extends VariableDefAttr {
}
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
- (args[0] as Utils.IntegerHolder).value = target.getBattleStat(Stat.DEF, user);
+ (args[0] as Utils.IntegerHolder).value = target.getEffectiveStat(Stat.DEF, user);
return true;
}
}
@@ -3756,7 +3785,7 @@ export class PhotonGeyserCategoryAttr extends VariableMoveCategoryAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const category = (args[0] as Utils.NumberHolder);
- if (user.getBattleStat(Stat.ATK, target, move) > user.getBattleStat(Stat.SPATK, target, move)) {
+ if (user.getEffectiveStat(Stat.ATK, target, move) > user.getEffectiveStat(Stat.SPATK, target, move)) {
category.value = MoveCategory.PHYSICAL;
return true;
}
@@ -3769,7 +3798,7 @@ export class TeraBlastCategoryAttr extends VariableMoveCategoryAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const category = (args[0] as Utils.NumberHolder);
- if (user.isTerastallized() && user.getBattleStat(Stat.ATK, target, move) > user.getBattleStat(Stat.SPATK, target, move)) {
+ if (user.isTerastallized() && user.getEffectiveStat(Stat.ATK, target, move) > user.getEffectiveStat(Stat.SPATK, target, move)) {
category.value = MoveCategory.PHYSICAL;
return true;
}
@@ -3833,8 +3862,8 @@ export class StatusCategoryOnAllyAttr extends VariableMoveCategoryAttr {
export class ShellSideArmCategoryAttr extends VariableMoveCategoryAttr {
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const category = (args[0] as Utils.IntegerHolder);
- const atkRatio = user.getBattleStat(Stat.ATK, target, move) / target.getBattleStat(Stat.DEF, user, move);
- const specialRatio = user.getBattleStat(Stat.SPATK, target, move) / target.getBattleStat(Stat.SPDEF, user, move);
+ const atkRatio = user.getEffectiveStat(Stat.ATK, target, move) / target.getEffectiveStat(Stat.DEF, user, move);
+ const specialRatio = user.getEffectiveStat(Stat.SPATK, target, move) / target.getEffectiveStat(Stat.SPDEF, user, move);
// Shell Side Arm is much more complicated than it looks, this is a partial implementation to try to achieve something similar to the games
if (atkRatio > specialRatio) {
@@ -4176,8 +4205,12 @@ export class WaterSuperEffectTypeMultiplierAttr extends VariableMoveTypeMultipli
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
const multiplier = args[0] as Utils.NumberHolder;
if (target.isOfType(Type.WATER)) {
- multiplier.value *= 4; // Increased twice because initial reduction against water
- return true;
+ const effectivenessAgainstWater = new Utils.NumberHolder(getTypeDamageMultiplier(move.type, Type.WATER));
+ applyChallenges(user.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, effectivenessAgainstWater);
+ if (effectivenessAgainstWater.value !== 0) {
+ multiplier.value *= 2 / effectivenessAgainstWater.value;
+ return true;
+ }
}
return false;
@@ -4587,8 +4620,8 @@ export class CurseAttr extends MoveEffectAttr {
target.addTag(BattlerTagType.CURSED, 0, move.id, user.id);
return true;
} else {
- user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), true, [BattleStat.ATK, BattleStat.DEF], 1));
- user.scene.unshiftPhase(new StatChangePhase(user.scene, user.getBattlerIndex(), true, [BattleStat.SPD], -1));
+ user.scene.unshiftPhase(new StatStageChangePhase(user.scene, user.getBattlerIndex(), true, [ Stat.ATK, Stat.DEF], 1));
+ user.scene.unshiftPhase(new StatStageChangePhase(user.scene, user.getBattlerIndex(), true, [ Stat.SPD ], -1));
return true;
}
}
@@ -4648,6 +4681,17 @@ export class ConfuseAttr extends AddBattlerTagAttr {
constructor(selfTarget?: boolean) {
super(BattlerTagType.CONFUSED, selfTarget, false, 2, 5);
}
+
+ 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 (move.category === MoveCategory.STATUS) {
+ user.scene.queueMessage(i18next.t("moveTriggers:safeguard", { targetName: getPokemonNameWithAffix(target)}));
+ }
+ return false;
+ }
+
+ return super.apply(user, target, move, args);
+ }
}
export class RechargeAttr extends AddBattlerTagAttr {
@@ -5134,8 +5178,8 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
}
let ret = this.user ? Math.floor((1 - user.getHpRatio()) * 20) : super.getUserBenefitScore(user, target, move);
if (this.user && this.batonPass) {
- const battleStatTotal = user.summonData.battleStats.reduce((bs: integer, total: integer) => total += bs, 0);
- ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut")(Math.min(Math.abs(battleStatTotal), 10) / 10) * (battleStatTotal >= 0 ? 10 : -10));
+ const statStageTotal = user.getStatStages().reduce((s: integer, total: integer) => total += s, 0);
+ ret = ret / 2 + (Phaser.Tweens.Builders.GetEaseFunction("Sine.easeOut")(Math.min(Math.abs(statStageTotal), 10) / 10) * (statStageTotal >= 0 ? 10 : -10));
}
return ret;
}
@@ -5877,9 +5921,9 @@ export class SwitchAbilitiesAttr extends MoveEffectAttr {
target.summonData.ability = tempAbilityId;
user.scene.queueMessage(i18next.t("moveTriggers:swappedAbilitiesWithTarget", {pokemonName: getPokemonNameWithAffix(user)}));
- // Swaps Forecast from Castform
+ // Swaps Forecast/Flower Gift from Castform/Cherrim
user.scene.arena.triggerWeatherBasedFormChangesToNormal();
- // Swaps Forecast to Castform (edge case)
+ // Swaps Forecast/Flower Gift to Castform/Cherrim (edge case)
user.scene.arena.triggerWeatherBasedFormChanges();
return true;
@@ -5960,8 +6004,17 @@ export class TransformAttr extends MoveEffectAttr {
user.summonData.ability = target.getAbility().id;
user.summonData.gender = target.getGender();
user.summonData.fusionGender = target.getFusionGender();
- user.summonData.stats = [ user.stats[Stat.HP] ].concat(target.stats.slice(1));
- user.summonData.battleStats = target.summonData.battleStats.slice(0);
+
+ // 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();
@@ -5969,12 +6022,102 @@ export class TransformAttr extends MoveEffectAttr {
user.loadAssets(false).then(() => {
user.playAnim();
+ user.updateInfo();
resolve(true);
});
});
}
}
+/**
+ * Attribute used for status moves, namely Speed Swap,
+ * that swaps the user's and target's corresponding stats.
+ * @extends MoveEffectAttr
+ * @see {@linkcode apply}
+ */
+export class SwapStatAttr extends MoveEffectAttr {
+ /** The stat to be swapped between the user and the target */
+ private stat: EffectiveStat;
+
+ constructor(stat: EffectiveStat) {
+ super();
+
+ this.stat = stat;
+ }
+
+ /**
+ * Takes the average of the user's and target's corresponding current
+ * {@linkcode stat} values and sets that stat to the average for both
+ * temporarily.
+ * @param user the {@linkcode Pokemon} that used the move
+ * @param target the {@linkcode Pokemon} that the move was used on
+ * @param move N/A
+ * @param args N/A
+ * @returns true if attribute application succeeds
+ */
+ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
+ if (super.apply(user, target, move, args)) {
+ const temp = user.getStat(this.stat, false);
+ user.setStat(this.stat, target.getStat(this.stat, false), false);
+ target.setStat(this.stat, temp, false);
+
+ user.scene.queueMessage(i18next.t("moveTriggers:switchedStat", {
+ pokemonName: getPokemonNameWithAffix(user),
+ stat: i18next.t(getStatKey(this.stat)),
+ }));
+
+ return true;
+ }
+ return false;
+ }
+}
+
+/**
+ * Attribute used for status moves, namely Power Split and Guard Split,
+ * that take the average of a user's and target's corresponding
+ * stats and assign that average back to each corresponding stat.
+ * @extends MoveEffectAttr
+ * @see {@linkcode apply}
+ */
+export class AverageStatsAttr extends MoveEffectAttr {
+ /** The stats to be averaged individually between the user and the target */
+ private stats: readonly EffectiveStat[];
+ private msgKey: string;
+
+ constructor(stats: readonly EffectiveStat[], msgKey: string) {
+ super();
+
+ this.stats = stats;
+ this.msgKey = msgKey;
+ }
+
+ /**
+ * Takes the average of the user's and target's corresponding {@linkcode stat}
+ * values and sets those stats to the corresponding average for both
+ * temporarily.
+ * @param user the {@linkcode Pokemon} that used the move
+ * @param target the {@linkcode Pokemon} that the move was used on
+ * @param move N/A
+ * @param args N/A
+ * @returns true if attribute application succeeds
+ */
+ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
+ if (super.apply(user, target, move, args)) {
+ for (const s of this.stats) {
+ const avg = Math.floor((user.getStat(s, false) + target.getStat(s, false)) / 2);
+
+ user.setStat(s, avg, false);
+ target.setStat(s, avg, false);
+ }
+
+ user.scene.queueMessage(i18next.t(this.msgKey, { pokemonName: getPokemonNameWithAffix(user) }));
+
+ return true;
+ }
+ return false;
+ }
+}
+
export class DiscourageFrequentUseAttr extends MoveAttr {
getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer {
const lastMoves = user.getLastXMoves(4);
@@ -6026,6 +6169,57 @@ export class DestinyBondAttr extends MoveEffectAttr {
}
}
+/**
+ * Attribute to apply a battler tag to the target if they have had their stats boosted this turn.
+ * @extends AddBattlerTagAttr
+ */
+export class AddBattlerTagIfBoostedAttr extends AddBattlerTagAttr {
+ constructor(tag: BattlerTagType) {
+ super(tag, false, false, 2, 5);
+ }
+
+ /**
+ * @param user {@linkcode Pokemon} using this move
+ * @param target {@linkcode Pokemon} target of this move
+ * @param move {@linkcode Move} being used
+ * @param {any[]} args N/A
+ * @returns true
+ */
+ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
+ if (target.turnData.statStagesIncreased) {
+ super.apply(user, target, move, args);
+ }
+ return true;
+ }
+}
+
+/**
+ * Attribute to apply a status effect to the target if they have had their stats boosted this turn.
+ * @extends MoveEffectAttr
+ */
+export class StatusIfBoostedAttr extends MoveEffectAttr {
+ public effect: StatusEffect;
+
+ constructor(effect: StatusEffect) {
+ super(true, MoveEffectTrigger.HIT);
+ this.effect = effect;
+ }
+
+ /**
+ * @param user {@linkcode Pokemon} using this move
+ * @param target {@linkcode Pokemon} target of this move
+ * @param move {@linkcode Move} N/A
+ * @param {any[]} args N/A
+ * @returns true
+ */
+ apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
+ if (target.turnData.statStagesIncreased) {
+ target.trySetStatus(this.effect, true, user);
+ }
+ return true;
+ }
+}
+
export class LastResortAttr extends MoveAttr {
getCondition(): MoveConditionFunc {
return (user: Pokemon, target: Pokemon, move: Move) => {
@@ -6199,7 +6393,7 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr {
return false;
}
const userTypes = user.getTypes();
- const validTypes = getTypeResistances(moveData.type).filter(t => !userTypes.includes(t)); // valid types are ones that are not already the user's types
+ const validTypes = this.getTypeResistances(user.scene.gameMode, moveData.type).filter(t => !userTypes.includes(t)); // valid types are ones that are not already the user's types
if (!validTypes.length) {
return false;
}
@@ -6211,6 +6405,25 @@ export class ResistLastMoveTypeAttr extends MoveEffectAttr {
return true;
}
+ /**
+ * Retrieve the types resisting a given type. Used by Conversion 2
+ * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type)
+ */
+ getTypeResistances(gameMode: GameMode, type: number): Type[] {
+ const typeResistances: Type[] = [];
+
+ for (let i = 0; i < Object.keys(Type).length; i++) {
+ const multiplier = new NumberHolder(1);
+ multiplier.value = getTypeDamageMultiplier(type, i);
+ applyChallenges(gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
+ if (multiplier.value < 1) {
+ typeResistances.push(i);
+ }
+ }
+
+ return typeResistances;
+ }
+
getCondition(): MoveConditionFunc {
return (user, target, move) => {
const moveHistory = target.getLastXMoves();
@@ -6358,7 +6571,7 @@ export function initMoves() {
.ignoresVirtual()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new SelfStatusMove(Moves.SWORDS_DANCE, Type.NORMAL, -1, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ATK, 2, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 2, true)
.danceMove(),
new AttackMove(Moves.CUT, Type.NORMAL, MoveCategory.PHYSICAL, 50, 95, 30, -1, 0, 1)
.slicingMove(),
@@ -6394,7 +6607,7 @@ export function initMoves() {
new AttackMove(Moves.ROLLING_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 85, 15, 30, 0, 1)
.attr(FlinchAttr),
new StatusMove(Moves.SAND_ATTACK, Type.GROUND, 100, 15, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.HEADBUTT, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 15, 30, 0, 1)
.attr(FlinchAttr),
new AttackMove(Moves.HORN_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 65, 100, 25, -1, 0, 1),
@@ -6422,7 +6635,7 @@ export function initMoves() {
.attr(RecoilAttr, false, 0.33)
.recklessMove(),
new StatusMove(Moves.TAIL_WHIP, Type.NORMAL, 100, 30, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.POISON_STING, Type.POISON, MoveCategory.PHYSICAL, 15, 100, 35, 30, 0, 1)
.attr(StatusEffectAttr, StatusEffect.POISON)
@@ -6435,13 +6648,13 @@ export function initMoves() {
.attr(MultiHitAttr)
.makesContact(false),
new StatusMove(Moves.LEER, Type.NORMAL, 100, 30, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.BITE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 25, 30, 0, 1)
.attr(FlinchAttr)
.bitingMove(),
new StatusMove(Moves.GROWL, Type.NORMAL, 100, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.ROAR, Type.NORMAL, -1, 20, -1, -6, 1)
@@ -6460,7 +6673,7 @@ export function initMoves() {
.attr(DisableMoveAttr)
.condition(failOnMaxCondition),
new AttackMove(Moves.ACID, Type.POISON, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.EMBER, Type.FIRE, MoveCategory.SPECIAL, 40, 100, 25, 10, 0, 1)
.attr(StatusEffectAttr, StatusEffect.BURN),
@@ -6485,9 +6698,9 @@ export function initMoves() {
new AttackMove(Moves.PSYBEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1)
.attr(ConfuseAttr),
new AttackMove(Moves.BUBBLE_BEAM, Type.WATER, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
new AttackMove(Moves.AURORA_BEAM, Type.ICE, MoveCategory.SPECIAL, 65, 100, 20, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.HYPER_BEAM, Type.NORMAL, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 1)
.attr(RechargeAttr),
new AttackMove(Moves.PECK, Type.FLYING, MoveCategory.PHYSICAL, 35, 100, 35, -1, 0, 1),
@@ -6514,7 +6727,7 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.SEEDED)
.condition((user, target, move) => !target.getTag(BattlerTagType.SEEDED) && !target.isOfType(Type.GRASS)),
new SelfStatusMove(Moves.GROWTH, Type.NORMAL, -1, 20, -1, 0, 1)
- .attr(GrowthStatChangeAttr),
+ .attr(GrowthStatStageChangeAttr),
new AttackMove(Moves.RAZOR_LEAF, Type.GRASS, MoveCategory.PHYSICAL, 55, 95, 25, -1, 0, 1)
.attr(HighCritAttr)
.makesContact(false)
@@ -6541,7 +6754,7 @@ export function initMoves() {
.danceMove()
.target(MoveTarget.RANDOM_NEAR_ENEMY),
new StatusMove(Moves.STRING_SHOT, Type.BUG, 95, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPD, -2)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -2)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.DRAGON_RAGE, Type.DRAGON, MoveCategory.SPECIAL, -1, 100, 10, -1, 0, 1)
.attr(FixedDamageAttr, 40),
@@ -6578,13 +6791,13 @@ export function initMoves() {
new AttackMove(Moves.CONFUSION, Type.PSYCHIC, MoveCategory.SPECIAL, 50, 100, 25, 10, 0, 1)
.attr(ConfuseAttr),
new AttackMove(Moves.PSYCHIC, Type.PSYCHIC, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new StatusMove(Moves.HYPNOSIS, Type.PSYCHIC, 60, 20, -1, 0, 1)
.attr(StatusEffectAttr, StatusEffect.SLEEP),
new SelfStatusMove(Moves.MEDITATE, Type.PSYCHIC, -1, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true),
new SelfStatusMove(Moves.AGILITY, Type.PSYCHIC, -1, 30, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPD, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true),
new AttackMove(Moves.QUICK_ATTACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 1),
new AttackMove(Moves.RAGE, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 20, -1, 0, 1)
.partial(),
@@ -6597,28 +6810,28 @@ export function initMoves() {
.attr(MovesetCopyMoveAttr)
.ignoresVirtual(),
new StatusMove(Moves.SCREECH, Type.NORMAL, 85, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, -2)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -2)
.soundBased(),
new SelfStatusMove(Moves.DOUBLE_TEAM, Type.NORMAL, -1, 15, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.EVA, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.EVA ], 1, true),
new SelfStatusMove(Moves.RECOVER, Type.NORMAL, -1, 5, -1, 0, 1)
.attr(HealAttr, 0.5)
.triageMove(),
new SelfStatusMove(Moves.HARDEN, Type.NORMAL, -1, 30, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.MINIMIZE, Type.NORMAL, -1, 10, -1, 0, 1)
.attr(AddBattlerTagAttr, BattlerTagType.MINIMIZED, true, false)
- .attr(StatChangeAttr, BattleStat.EVA, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.EVA ], 2, true),
new StatusMove(Moves.SMOKESCREEN, Type.NORMAL, 100, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new StatusMove(Moves.CONFUSE_RAY, Type.GHOST, 100, 10, -1, 0, 1)
.attr(ConfuseAttr),
new SelfStatusMove(Moves.WITHDRAW, Type.WATER, -1, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.DEFENSE_CURL, Type.NORMAL, -1, 40, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.BARRIER, Type.PSYCHIC, -1, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
new StatusMove(Moves.LIGHT_SCREEN, Type.PSYCHIC, -1, 30, -1, 0, 1)
.attr(AddArenaTagAttr, ArenaTagType.LIGHT_SCREEN, 5, true)
.target(MoveTarget.USER_SIDE),
@@ -6666,17 +6879,17 @@ export function initMoves() {
.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(StatChangeAttr, BattleStat.DEF, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true)
.ignoresVirtual(),
new AttackMove(Moves.SPIKE_CANNON, Type.NORMAL, MoveCategory.PHYSICAL, 20, 100, 15, -1, 0, 1)
.attr(MultiHitAttr)
.makesContact(false),
new AttackMove(Moves.CONSTRICT, Type.NORMAL, MoveCategory.PHYSICAL, 10, 100, 35, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
new SelfStatusMove(Moves.AMNESIA, Type.PSYCHIC, -1, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPDEF, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], 2, true),
new StatusMove(Moves.KINESIS, Type.PSYCHIC, 80, 15, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new SelfStatusMove(Moves.SOFT_BOILED, Type.NORMAL, -1, 5, -1, 0, 1)
.attr(HealAttr, 0.5)
.triageMove(),
@@ -6713,7 +6926,7 @@ export function initMoves() {
.attr(TransformAttr)
.ignoresProtect(),
new AttackMove(Moves.BUBBLE, Type.WATER, MoveCategory.SPECIAL, 40, 100, 30, 10, 0, 1)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.DIZZY_PUNCH, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 10, 20, 0, 1)
.attr(ConfuseAttr)
@@ -6722,13 +6935,13 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.powderMove(),
new StatusMove(Moves.FLASH, Type.NORMAL, 100, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.PSYWAVE, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 15, -1, 0, 1)
.attr(RandomLevelDamageAttr),
new SelfStatusMove(Moves.SPLASH, Type.NORMAL, -1, 40, -1, 0, 1)
.condition(failOnGravityCondition),
new SelfStatusMove(Moves.ACID_ARMOR, Type.POISON, -1, 20, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
new AttackMove(Moves.CRABHAMMER, Type.WATER, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 1)
.attr(HighCritAttr),
new AttackMove(Moves.EXPLOSION, Type.NORMAL, MoveCategory.PHYSICAL, 250, 100, 5, -1, 0, 1)
@@ -6754,7 +6967,7 @@ export function initMoves() {
.attr(FlinchAttr)
.bitingMove(),
new SelfStatusMove(Moves.SHARPEN, Type.NORMAL, -1, 30, -1, 0, 1)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true),
new SelfStatusMove(Moves.CONVERSION, Type.NORMAL, -1, 30, -1, 0, 1)
.attr(FirstMoveTypeAttr),
new AttackMove(Moves.TRI_ATTACK, Type.NORMAL, MoveCategory.SPECIAL, 80, 100, 10, 20, 0, 1)
@@ -6809,7 +7022,7 @@ export function initMoves() {
.windMove()
.attr(HighCritAttr),
new StatusMove(Moves.COTTON_SPORE, Type.GRASS, 100, 40, -1, 0, 2)
- .attr(StatChangeAttr, BattleStat.SPD, -2)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -2)
.powderMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.REVERSAL, Type.FIGHTING, MoveCategory.PHYSICAL, -1, 100, 15, -1, 0, 2)
@@ -6824,21 +7037,21 @@ export function initMoves() {
new AttackMove(Moves.MACH_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 2)
.punchingMove(),
new StatusMove(Moves.SCARY_FACE, Type.NORMAL, 100, 10, -1, 0, 2)
- .attr(StatChangeAttr, BattleStat.SPD, -2),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -2),
new AttackMove(Moves.FEINT_ATTACK, Type.DARK, MoveCategory.PHYSICAL, 60, -1, 20, -1, 0, 2),
new StatusMove(Moves.SWEET_KISS, Type.FAIRY, 75, 10, -1, 0, 2)
.attr(ConfuseAttr),
new SelfStatusMove(Moves.BELLY_DRUM, Type.NORMAL, -1, 10, -1, 0, 2)
- .attr(CutHpStatBoostAttr, [BattleStat.ATK], 12, 2, (user) => {
- user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", {pokemonName: getPokemonNameWithAffix(user), statName: getBattleStatName(BattleStat.ATK)}));
+ .attr(CutHpStatStageBoostAttr, [ Stat.ATK ], 12, 2, (user) => {
+ user.scene.queueMessage(i18next.t("moveTriggers:cutOwnHpAndMaximizedStat", { pokemonName: getPokemonNameWithAffix(user), statName: i18next.t(getStatKey(Stat.ATK)) }));
}),
new AttackMove(Moves.SLUDGE_BOMB, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 30, 0, 2)
.attr(StatusEffectAttr, StatusEffect.POISON)
.ballBombMove(),
new AttackMove(Moves.MUD_SLAP, Type.GROUND, MoveCategory.SPECIAL, 20, 100, 10, 100, 0, 2)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.OCTAZOOKA, Type.WATER, MoveCategory.SPECIAL, 65, 85, 10, 50, 0, 2)
- .attr(StatChangeAttr, BattleStat.ACC, -1)
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.ballBombMove(),
new StatusMove(Moves.SPIKES, Type.GROUND, -1, 20, -1, 0, 2)
.attr(AddArenaTrapTagAttr, ArenaTagType.SPIKES)
@@ -6867,7 +7080,7 @@ export function initMoves() {
.condition(failOnBossCondition)
.target(MoveTarget.ALL),
new AttackMove(Moves.ICY_WIND, Type.ICE, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 2)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.windMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new SelfStatusMove(Moves.DETECT, Type.FIGHTING, -1, 5, -1, 4, 2)
@@ -6891,13 +7104,13 @@ export function initMoves() {
new SelfStatusMove(Moves.ENDURE, Type.NORMAL, -1, 10, -1, 4, 2)
.attr(ProtectAttr, BattlerTagType.ENDURING),
new StatusMove(Moves.CHARM, Type.FAIRY, 100, 20, -1, 0, 2)
- .attr(StatChangeAttr, BattleStat.ATK, -2),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -2),
new AttackMove(Moves.ROLLOUT, Type.ROCK, MoveCategory.PHYSICAL, 30, 90, 20, -1, 0, 2)
.attr(ConsecutiveUseDoublePowerAttr, 5, true, true, Moves.DEFENSE_CURL),
new AttackMove(Moves.FALSE_SWIPE, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 2)
.attr(SurviveDamageAttr),
new StatusMove(Moves.SWAGGER, Type.NORMAL, 85, 15, -1, 0, 2)
- .attr(StatChangeAttr, BattleStat.ATK, 2)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 2)
.attr(ConfuseAttr),
new SelfStatusMove(Moves.MILK_DRINK, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(HealAttr, 0.5)
@@ -6908,7 +7121,7 @@ export function initMoves() {
.attr(ConsecutiveUseDoublePowerAttr, 3, true)
.slicingMove(),
new AttackMove(Moves.STEEL_WING, Type.STEEL, MoveCategory.PHYSICAL, 70, 90, 25, 10, 0, 2)
- .attr(StatChangeAttr, BattleStat.DEF, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new StatusMove(Moves.MEAN_LOOK, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1),
new StatusMove(Moves.ATTRACT, Type.NORMAL, 100, 15, -1, 0, 2)
@@ -6933,7 +7146,7 @@ export function initMoves() {
.attr(FriendshipPowerAttr, true),
new StatusMove(Moves.SAFEGUARD, Type.NORMAL, -1, 25, -1, 0, 2)
.target(MoveTarget.USER_SIDE)
- .unimplemented(),
+ .attr(AddArenaTagAttr, ArenaTagType.SAFEGUARD, 5, true, true),
new StatusMove(Moves.PAIN_SPLIT, Type.NORMAL, -1, 20, -1, 0, 2)
.attr(HpSplitAttr)
.condition(failOnBossCondition),
@@ -6962,7 +7175,7 @@ export function initMoves() {
new AttackMove(Moves.PURSUIT, Type.DARK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 0, 2)
.partial(),
new AttackMove(Moves.RAPID_SPIN, Type.NORMAL, MoveCategory.PHYSICAL, 50, 100, 40, 100, 0, 2)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true)
.attr(RemoveBattlerTagAttr, [
BattlerTagType.BIND,
BattlerTagType.WRAP,
@@ -6978,12 +7191,12 @@ export function initMoves() {
], true)
.attr(RemoveArenaTrapAttr),
new StatusMove(Moves.SWEET_SCENT, Type.NORMAL, 100, 20, -1, 0, 2)
- .attr(StatChangeAttr, BattleStat.EVA, -2)
+ .attr(StatStageChangeAttr, [ Stat.EVA ], -2)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.IRON_TAIL, Type.STEEL, MoveCategory.PHYSICAL, 100, 75, 15, 30, 0, 2)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.METAL_CLAW, Type.STEEL, MoveCategory.PHYSICAL, 50, 95, 35, 10, 0, 2)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true),
new AttackMove(Moves.VITAL_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 70, -1, 10, -1, -1, 2),
new SelfStatusMove(Moves.MORNING_SUN, Type.NORMAL, -1, 5, -1, 0, 2)
.attr(PlantHealAttr)
@@ -7010,7 +7223,7 @@ export function initMoves() {
.attr(WeatherChangeAttr, WeatherType.SUNNY)
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.CRUNCH, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 20, 0, 2)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.bitingMove(),
new AttackMove(Moves.MIRROR_COAT, Type.PSYCHIC, MoveCategory.SPECIAL, -1, 100, 20, -1, -5, 2)
.attr(CounterDamageAttr, (move: Move) => move.category === MoveCategory.SPECIAL, 2)
@@ -7019,15 +7232,15 @@ export function initMoves() {
.attr(CopyStatsAttr),
new AttackMove(Moves.EXTREME_SPEED, Type.NORMAL, MoveCategory.PHYSICAL, 80, 100, 5, -1, 2, 2),
new AttackMove(Moves.ANCIENT_POWER, Type.ROCK, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 2)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true),
new AttackMove(Moves.SHADOW_BALL, Type.GHOST, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 2)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.ballBombMove(),
new AttackMove(Moves.FUTURE_SIGHT, Type.PSYCHIC, MoveCategory.SPECIAL, 120, 100, 10, -1, 0, 2)
.partial()
.attr(DelayedAttackAttr, ArenaTagType.FUTURE_SIGHT, ChargeAnim.FUTURE_SIGHT_CHARGING, i18next.t("moveTriggers:foresawAnAttack", {pokemonName: "{USER}"})),
new AttackMove(Moves.ROCK_SMASH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 15, 50, 0, 2)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.WHIRLPOOL, Type.WATER, MoveCategory.SPECIAL, 35, 85, 15, -1, 0, 2)
.attr(TrapAttr, BattlerTagType.WHIRLPOOL)
.attr(HitsTagAttr, BattlerTagType.UNDERWATER, true),
@@ -7066,13 +7279,13 @@ export function initMoves() {
new StatusMove(Moves.TORMENT, Type.DARK, 100, 15, -1, 0, 3)
.unimplemented(),
new StatusMove(Moves.FLATTER, Type.DARK, 100, 15, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPATK, 1)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 1)
.attr(ConfuseAttr),
new StatusMove(Moves.WILL_O_WISP, Type.FIRE, 85, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.BURN),
new StatusMove(Moves.MEMENTO, Type.DARK, 100, 10, -1, 0, 3)
.attr(SacrificialAttrOnHit)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -2),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -2),
new AttackMove(Moves.FACADE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 3)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.status
&& (user.status.effect === StatusEffect.BURN || user.status.effect === StatusEffect.POISON || user.status.effect === StatusEffect.TOXIC || user.status.effect === StatusEffect.PARALYSIS) ? 2 : 1)
@@ -7091,7 +7304,7 @@ export function initMoves() {
.attr(NaturePowerAttr)
.ignoresVirtual(),
new SelfStatusMove(Moves.CHARGE, Type.ELECTRIC, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPDEF, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1, true)
.attr(AddBattlerTagAttr, BattlerTagType.CHARGED, true, false),
new StatusMove(Moves.TAUNT, Type.DARK, 100, 20, -1, 0, 3)
.unimplemented(),
@@ -7111,7 +7324,7 @@ export function initMoves() {
new SelfStatusMove(Moves.INGRAIN, Type.GRASS, -1, 20, -1, 0, 3)
.attr(AddBattlerTagAttr, BattlerTagType.INGRAIN, true, true),
new AttackMove(Moves.SUPERPOWER, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1, true),
new SelfStatusMove(Moves.MAGIC_COAT, Type.PSYCHIC, -1, 15, -1, 4, 3)
.unimplemented(),
new SelfStatusMove(Moves.RECYCLE, Type.NORMAL, -1, 10, -1, 0, 3)
@@ -7122,7 +7335,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),
+ .condition((user, target, move) => !target.status && !target.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)),
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.isTransferrable).length > 0 ? 1.5 : 1)
.attr(RemoveHeldItemAttr, false),
@@ -7155,14 +7368,14 @@ export function initMoves() {
new SelfStatusMove(Moves.CAMOUFLAGE, Type.NORMAL, -1, 20, -1, 0, 3)
.attr(CopyBiomeTypeAttr),
new SelfStatusMove(Moves.TAIL_GLOW, Type.BUG, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPATK, 3, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 3, true),
new AttackMove(Moves.LUSTER_PURGE, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new AttackMove(Moves.MIST_BALL, Type.PSYCHIC, MoveCategory.SPECIAL, 95, 100, 5, 50, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1)
.ballBombMove(),
new StatusMove(Moves.FEATHER_DANCE, Type.FLYING, 100, 15, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.ATK, -2)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -2)
.danceMove(),
new StatusMove(Moves.TEETER_DANCE, Type.NORMAL, 100, 20, -1, 0, 3)
.attr(ConfuseAttr)
@@ -7189,13 +7402,13 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.TOXIC)
.bitingMove(),
new AttackMove(Moves.CRUSH_CLAW, Type.NORMAL, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 3)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.BLAST_BURN, Type.FIRE, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3)
.attr(RechargeAttr),
new AttackMove(Moves.HYDRO_CANNON, Type.WATER, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3)
.attr(RechargeAttr),
new AttackMove(Moves.METEOR_MASH, Type.STEEL, MoveCategory.PHYSICAL, 90, 90, 10, 20, 0, 3)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true)
.punchingMove(),
new AttackMove(Moves.ASTONISH, Type.GHOST, MoveCategory.PHYSICAL, 30, 100, 15, 30, 0, 3)
.attr(FlinchAttr),
@@ -7207,33 +7420,33 @@ export function initMoves() {
.attr(PartyStatusCureAttr, i18next.t("moveTriggers:soothingAromaWaftedThroughArea"), Abilities.SAP_SIPPER)
.target(MoveTarget.PARTY),
new StatusMove(Moves.FAKE_TEARS, Type.DARK, 100, 20, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPDEF, -2),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),
new AttackMove(Moves.AIR_CUTTER, Type.FLYING, MoveCategory.SPECIAL, 60, 95, 25, -1, 0, 3)
.attr(HighCritAttr)
.slicingMove()
.windMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.OVERHEAT, Type.FIRE, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPATK, -2, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true)
.attr(HealStatusEffectAttr, true, StatusEffect.FREEZE),
new StatusMove(Moves.ODOR_SLEUTH, Type.NORMAL, -1, 40, -1, 0, 3)
.attr(ExposedMoveAttr, BattlerTagType.IGNORE_GHOST),
new AttackMove(Moves.ROCK_TOMB, Type.ROCK, MoveCategory.PHYSICAL, 60, 95, 15, 100, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.makesContact(false),
new AttackMove(Moves.SILVER_WIND, Type.BUG, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true)
.windMove(),
new StatusMove(Moves.METAL_SOUND, Type.STEEL, 85, 40, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPDEF, -2)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2)
.soundBased(),
new StatusMove(Moves.GRASS_WHISTLE, Type.GRASS, 55, 15, -1, 0, 3)
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.soundBased(),
new StatusMove(Moves.TICKLE, Type.NORMAL, 100, 20, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], -1),
new SelfStatusMove(Moves.COSMIC_POWER, Type.PSYCHIC, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true),
new AttackMove(Moves.WATER_SPOUT, Type.WATER, MoveCategory.SPECIAL, 150, 100, 5, -1, 0, 3)
.attr(HpPowerAttr)
.target(MoveTarget.ALL_NEAR_ENEMIES),
@@ -7254,7 +7467,7 @@ export function initMoves() {
.attr(OneHitKOAttr)
.attr(SheerColdAccuracyAttr),
new AttackMove(Moves.MUDDY_WATER, Type.WATER, MoveCategory.SPECIAL, 90, 85, 10, 30, 0, 3)
- .attr(StatChangeAttr, BattleStat.ACC, -1)
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.BULLET_SEED, Type.GRASS, MoveCategory.PHYSICAL, 25, 100, 30, -1, 0, 3)
.attr(MultiHitAttr)
@@ -7266,25 +7479,25 @@ export function initMoves() {
.attr(MultiHitAttr)
.makesContact(false),
new SelfStatusMove(Moves.IRON_DEFENSE, Type.STEEL, -1, 15, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
new StatusMove(Moves.BLOCK, Type.NORMAL, -1, 5, -1, 0, 3)
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, true, 1),
new StatusMove(Moves.HOWL, Type.NORMAL, -1, 40, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.ATK, 1)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1)
.soundBased()
.target(MoveTarget.USER_AND_ALLIES),
new AttackMove(Moves.DRAGON_CLAW, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 3),
new AttackMove(Moves.FRENZY_PLANT, Type.GRASS, MoveCategory.SPECIAL, 150, 90, 5, -1, 0, 3)
.attr(RechargeAttr),
new SelfStatusMove(Moves.BULK_UP, Type.FIGHTING, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1, true),
+ .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)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.condition(failOnGravityCondition)
.ignoresVirtual(),
new AttackMove(Moves.MUD_SHOT, Type.GROUND, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
new AttackMove(Moves.POISON_TAIL, Type.POISON, MoveCategory.PHYSICAL, 50, 100, 25, 10, 0, 3)
.attr(HighCritAttr)
.attr(StatusEffectAttr, StatusEffect.POISON),
@@ -7299,12 +7512,12 @@ export function initMoves() {
.attr(AddArenaTagAttr, ArenaTagType.WATER_SPORT, 5)
.target(MoveTarget.BOTH_SIDES),
new SelfStatusMove(Moves.CALM_MIND, Type.PSYCHIC, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true),
new AttackMove(Moves.LEAF_BLADE, Type.GRASS, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 3)
.attr(HighCritAttr)
.slicingMove(),
new SelfStatusMove(Moves.DRAGON_DANCE, Type.DRAGON, -1, 20, -1, 0, 3)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPD ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true)
.danceMove(),
new AttackMove(Moves.ROCK_BLAST, Type.ROCK, MoveCategory.PHYSICAL, 25, 90, 10, -1, 0, 3)
.attr(MultiHitAttr)
@@ -7318,7 +7531,7 @@ export function initMoves() {
.partial()
.attr(DelayedAttackAttr, ArenaTagType.DOOM_DESIRE, ChargeAnim.DOOM_DESIRE_CHARGING, i18next.t("moveTriggers:choseDoomDesireAsDestiny", {pokemonName: "{USER}"})),
new AttackMove(Moves.PSYCHO_BOOST, Type.PSYCHIC, MoveCategory.SPECIAL, 140, 90, 5, -1, 0, 3)
- .attr(StatChangeAttr, BattleStat.SPATK, -2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true),
new SelfStatusMove(Moves.ROOST, Type.FLYING, -1, 5, -1, 0, 4)
.attr(HealAttr, 0.5)
.attr(AddBattlerTagAttr, BattlerTagType.ROOSTED, true, false)
@@ -7332,7 +7545,7 @@ export function initMoves() {
.attr(MovePowerMultiplierAttr, (user, target, move) => targetSleptOrComatoseCondition(user, target, move) ? 2 : 1)
.attr(HealStatusEffectAttr, false, StatusEffect.SLEEP),
new AttackMove(Moves.HAMMER_ARM, Type.FIGHTING, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPD, -1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true)
.punchingMove(),
new AttackMove(Moves.GYRO_BALL, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.attr(GyroBallPowerAttr)
@@ -7357,7 +7570,7 @@ export function initMoves() {
.attr(AddArenaTagAttr, ArenaTagType.TAILWIND, 4, true)
.target(MoveTarget.USER_SIDE),
new StatusMove(Moves.ACUPRESSURE, Type.NORMAL, -1, 30, -1, 0, 4)
- .attr(AcupressureStatChangeAttr)
+ .attr(AcupressureStatStageChangeAttr)
.target(MoveTarget.USER_OR_NEAR_ALLY),
new AttackMove(Moves.METAL_BURST, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 4)
.attr(CounterDamageAttr, (move: Move) => (move.category === MoveCategory.PHYSICAL || move.category === MoveCategory.SPECIAL), 1.5)
@@ -7367,7 +7580,7 @@ export function initMoves() {
new AttackMove(Moves.U_TURN, Type.BUG, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4)
.attr(ForceSwitchOutAttr, true, false),
new AttackMove(Moves.CLOSE_COMBAT, Type.FIGHTING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 4)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true),
new AttackMove(Moves.PAYBACK, Type.DARK, MoveCategory.PHYSICAL, 50, 100, 10, -1, 0, 4)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.getLastXMoves(1).find(m => m.turn === target.scene.currentBattle.turn) || user.scene.currentBattle.turnCommands[target.getBattlerIndex()]?.command === Command.BALL ? 2 : 1),
new AttackMove(Moves.ASSURANCE, Type.DARK, MoveCategory.PHYSICAL, 60, 100, 10, -1, 0, 4)
@@ -7411,9 +7624,9 @@ export function initMoves() {
.attr(CopyMoveAttr)
.ignoresVirtual(),
new StatusMove(Moves.POWER_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4)
- .unimplemented(),
+ .attr(SwapStatStagesAttr, [ Stat.ATK, Stat.SPATK ]),
new StatusMove(Moves.GUARD_SWAP, Type.PSYCHIC, -1, 10, 100, 0, 4)
- .unimplemented(),
+ .attr(SwapStatStagesAttr, [ Stat.DEF, Stat.SPDEF ]),
new AttackMove(Moves.PUNISHMENT, Type.DARK, MoveCategory.PHYSICAL, -1, 100, 5, -1, 0, 4)
.makesContact(true)
.attr(PunishmentPowerAttr),
@@ -7427,7 +7640,7 @@ export function initMoves() {
.attr(AddArenaTrapTagAttr, ArenaTagType.TOXIC_SPIKES)
.target(MoveTarget.ENEMY_SIDE),
new StatusMove(Moves.HEART_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 4)
- .attr(SwapStatsAttr),
+ .attr(SwapStatStagesAttr, BATTLE_STATS),
new SelfStatusMove(Moves.AQUA_RING, Type.WATER, -1, 20, -1, 0, 4)
.attr(AddBattlerTagAttr, BattlerTagType.AQUA_RING, true, true),
new SelfStatusMove(Moves.MAGNET_RISE, Type.ELECTRIC, -1, 10, -1, 0, 4)
@@ -7444,7 +7657,7 @@ export function initMoves() {
.pulseMove()
.ballBombMove(),
new SelfStatusMove(Moves.ROCK_POLISH, Type.ROCK, -1, 20, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPD, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true),
new AttackMove(Moves.POISON_JAB, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 20, 30, 0, 4)
.attr(StatusEffectAttr, StatusEffect.POISON),
new AttackMove(Moves.DARK_PULSE, Type.DARK, MoveCategory.SPECIAL, 80, 100, 15, 20, 0, 4)
@@ -7463,7 +7676,7 @@ export function initMoves() {
new AttackMove(Moves.X_SCISSOR, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 4)
.slicingMove(),
new AttackMove(Moves.BUG_BUZZ, Type.BUG, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.soundBased(),
new AttackMove(Moves.DRAGON_PULSE, Type.DRAGON, MoveCategory.SPECIAL, 85, 100, 10, -1, 0, 4)
.pulseMove(),
@@ -7478,22 +7691,22 @@ export function initMoves() {
.triageMove(),
new AttackMove(Moves.VACUUM_WAVE, Type.FIGHTING, MoveCategory.SPECIAL, 40, 100, 30, -1, 1, 4),
new AttackMove(Moves.FOCUS_BLAST, Type.FIGHTING, MoveCategory.SPECIAL, 120, 70, 5, 10, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.ballBombMove(),
new AttackMove(Moves.ENERGY_BALL, Type.GRASS, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1)
.ballBombMove(),
new AttackMove(Moves.BRAVE_BIRD, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4)
.attr(RecoilAttr, false, 0.33)
.recklessMove(),
new AttackMove(Moves.EARTH_POWER, Type.GROUND, MoveCategory.SPECIAL, 90, 100, 10, 10, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new StatusMove(Moves.SWITCHEROO, Type.DARK, 100, 10, -1, 0, 4)
.unimplemented(),
new AttackMove(Moves.GIGA_IMPACT, Type.NORMAL, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4)
.attr(RechargeAttr),
new SelfStatusMove(Moves.NASTY_PLOT, Type.DARK, -1, 20, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPATK, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 2, true),
new AttackMove(Moves.BULLET_PUNCH, Type.STEEL, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4)
.punchingMove(),
new AttackMove(Moves.AVALANCHE, Type.ICE, MoveCategory.PHYSICAL, 60, 100, 10, -1, -4, 4)
@@ -7516,7 +7729,7 @@ export function initMoves() {
.bitingMove(),
new AttackMove(Moves.SHADOW_SNEAK, Type.GHOST, MoveCategory.PHYSICAL, 40, 100, 30, -1, 1, 4),
new AttackMove(Moves.MUD_BOMB, Type.GROUND, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4)
- .attr(StatChangeAttr, BattleStat.ACC, -1)
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1)
.ballBombMove(),
new AttackMove(Moves.PSYCHO_CUT, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 4)
.attr(HighCritAttr)
@@ -7525,13 +7738,13 @@ export function initMoves() {
new AttackMove(Moves.ZEN_HEADBUTT, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 90, 15, 20, 0, 4)
.attr(FlinchAttr),
new AttackMove(Moves.MIRROR_SHOT, Type.STEEL, MoveCategory.SPECIAL, 65, 85, 10, 30, 0, 4)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.FLASH_CANNON, Type.STEEL, MoveCategory.SPECIAL, 80, 100, 10, 10, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new AttackMove(Moves.ROCK_CLIMB, Type.NORMAL, MoveCategory.PHYSICAL, 90, 85, 20, 20, 0, 4)
.attr(ConfuseAttr),
new StatusMove(Moves.DEFOG, Type.FLYING, -1, 15, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.EVA, -1)
+ .attr(StatStageChangeAttr, [ Stat.EVA ], -1)
.attr(ClearWeatherAttr, WeatherType.FOG)
.attr(ClearTerrainAttr)
.attr(RemoveScreensAttr, false)
@@ -7541,7 +7754,7 @@ export function initMoves() {
.ignoresProtect()
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.DRACO_METEOR, Type.DRAGON, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPATK, -2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true),
new AttackMove(Moves.DISCHARGE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 15, 30, 0, 4)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS)
.target(MoveTarget.ALL_NEAR_OTHERS),
@@ -7549,7 +7762,7 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.BURN)
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.LEAF_STORM, Type.GRASS, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPATK, -2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true),
new AttackMove(Moves.POWER_WHIP, Type.GRASS, MoveCategory.PHYSICAL, 120, 85, 10, -1, 0, 4),
new AttackMove(Moves.ROCK_WRECKER, Type.ROCK, MoveCategory.PHYSICAL, 150, 90, 5, -1, 0, 4)
.attr(RechargeAttr)
@@ -7571,7 +7784,7 @@ export function initMoves() {
.attr(HighCritAttr)
.makesContact(false),
new StatusMove(Moves.CAPTIVATE, Type.NORMAL, 100, 20, -1, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPATK, -2)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2)
.condition((user, target, move) => target.isOppositeGender(user))
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.STEALTH_ROCK, Type.ROCK, -1, 20, -1, 0, 4)
@@ -7589,7 +7802,7 @@ export function initMoves() {
new AttackMove(Moves.BUG_BITE, Type.BUG, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 4)
.attr(StealEatBerryAttr),
new AttackMove(Moves.CHARGE_BEAM, Type.ELECTRIC, MoveCategory.SPECIAL, 50, 90, 10, 70, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPATK, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true),
new AttackMove(Moves.WOOD_HAMMER, Type.GRASS, MoveCategory.PHYSICAL, 120, 100, 15, -1, 0, 4)
.attr(RecoilAttr, false, 0.33)
.recklessMove(),
@@ -7598,7 +7811,7 @@ export function initMoves() {
.attr(HighCritAttr)
.makesContact(false),
new SelfStatusMove(Moves.DEFEND_ORDER, Type.BUG, -1, 10, -1, 0, 4)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, true),
new SelfStatusMove(Moves.HEAL_ORDER, Type.BUG, -1, 10, -1, 0, 4)
.attr(HealAttr, 0.5)
.triageMove(),
@@ -7624,23 +7837,23 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.SLEEP)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.SEED_FLARE, Type.GRASS, MoveCategory.SPECIAL, 120, 85, 5, 40, 0, 4)
- .attr(StatChangeAttr, BattleStat.SPDEF, -2),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),
new AttackMove(Moves.OMINOUS_WIND, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 5, 10, 0, 4)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
+ .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)
.ignoresProtect()
.ignoresVirtual(),
new SelfStatusMove(Moves.HONE_CLAWS, Type.DARK, -1, 15, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.ACC ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.ACC ], 1, true),
new StatusMove(Moves.WIDE_GUARD, Type.ROCK, -1, 10, -1, 3, 5)
.target(MoveTarget.USER_SIDE)
.attr(AddArenaTagAttr, ArenaTagType.WIDE_GUARD, 1, true, true),
new StatusMove(Moves.GUARD_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
- .unimplemented(),
+ .attr(AverageStatsAttr, [ Stat.DEF, Stat.SPDEF ], "moveTriggers:sharedGuard"),
new StatusMove(Moves.POWER_SPLIT, Type.PSYCHIC, -1, 10, -1, 0, 5)
- .unimplemented(),
+ .attr(AverageStatsAttr, [ Stat.ATK, Stat.SPATK ], "moveTriggers:sharedPower"),
new StatusMove(Moves.WONDER_ROOM, Type.PSYCHIC, -1, 10, -1, 0, 5)
.ignoresProtect()
.target(MoveTarget.BOTH_SIDES)
@@ -7650,7 +7863,7 @@ export function initMoves() {
new AttackMove(Moves.VENOSHOCK, Type.POISON, MoveCategory.SPECIAL, 65, 100, 10, -1, 0, 5)
.attr(MovePowerMultiplierAttr, (user, target, move) => target.status && (target.status.effect === StatusEffect.POISON || target.status.effect === StatusEffect.TOXIC) ? 2 : 1),
new SelfStatusMove(Moves.AUTOTOMIZE, Type.STEEL, -1, 15, -1, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, 2, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true)
.partial(),
new SelfStatusMove(Moves.RAGE_POWDER, Type.BUG, -1, 20, -1, 2, 5)
.powderMove()
@@ -7676,7 +7889,7 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.POISON)
.target(MoveTarget.ALL_NEAR_OTHERS),
new SelfStatusMove(Moves.QUIVER_DANCE, Type.BUG, -1, 20, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true)
.danceMove(),
new AttackMove(Moves.HEAVY_SLAM, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
@@ -7693,13 +7906,13 @@ export function initMoves() {
new StatusMove(Moves.SOAK, Type.WATER, 100, 20, -1, 0, 5)
.attr(ChangeTypeAttr, Type.WATER),
new AttackMove(Moves.FLAME_CHARGE, Type.FIRE, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true),
new SelfStatusMove(Moves.COIL, Type.POISON, -1, 20, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.ACC ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.ACC ], 1, true),
new AttackMove(Moves.LOW_SWEEP, Type.FIGHTING, MoveCategory.PHYSICAL, 65, 100, 20, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
new AttackMove(Moves.ACID_SPRAY, Type.POISON, MoveCategory.SPECIAL, 40, 100, 20, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPDEF, -2)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2)
.ballBombMove(),
new AttackMove(Moves.FOUL_PLAY, Type.DARK, MoveCategory.PHYSICAL, 95, 100, 15, -1, 0, 5)
.attr(TargetAtkUserAtkAttr),
@@ -7717,11 +7930,11 @@ export function initMoves() {
.attr(ConsecutiveUseMultiBasePowerAttr, 5, false)
.soundBased(),
new AttackMove(Moves.CHIP_AWAY, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 20, -1, 0, 5)
- .attr(IgnoreOpponentStatChangesAttr),
+ .attr(IgnoreOpponentStatStagesAttr),
new AttackMove(Moves.CLEAR_SMOG, Type.POISON, MoveCategory.SPECIAL, 50, -1, 15, -1, 0, 5)
.attr(ResetStatsAttr, false),
new AttackMove(Moves.STORED_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 20, 100, 10, -1, 0, 5)
- .attr(StatChangeCountPowerAttr),
+ .attr(PositiveStatStagePowerAttr),
new StatusMove(Moves.QUICK_GUARD, Type.FIGHTING, -1, 15, -1, 3, 5)
.target(MoveTarget.USER_SIDE)
.attr(AddArenaTagAttr, ArenaTagType.QUICK_GUARD, 1, true, true),
@@ -7733,8 +7946,8 @@ export function initMoves() {
.attr(HealStatusEffectAttr, true, StatusEffect.FREEZE)
.attr(StatusEffectAttr, StatusEffect.BURN),
new SelfStatusMove(Moves.SHELL_SMASH, Type.NORMAL, -1, 15, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], 2, true)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true),
new StatusMove(Moves.HEAL_PULSE, Type.PSYCHIC, -1, 10, -1, 0, 5)
.attr(HealAttr, 0.5, false, false)
.pulseMove()
@@ -7748,8 +7961,8 @@ export function initMoves() {
.condition(failOnGravityCondition)
.ignoresVirtual(),
new SelfStatusMove(Moves.SHIFT_GEAR, Type.STEEL, -1, 10, -1, 0, 5)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true)
- .attr(StatChangeAttr, BattleStat.SPD, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 2, true),
new AttackMove(Moves.CIRCLE_THROW, Type.FIGHTING, MoveCategory.PHYSICAL, 60, 90, 10, -1, -6, 5)
.attr(ForceSwitchOutAttr),
new AttackMove(Moves.INCINERATE, Type.FIRE, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5)
@@ -7780,10 +7993,10 @@ export function initMoves() {
new AttackMove(Moves.VOLT_SWITCH, Type.ELECTRIC, MoveCategory.SPECIAL, 70, 100, 20, -1, 0, 5)
.attr(ForceSwitchOutAttr, true, false),
new AttackMove(Moves.STRUGGLE_BUG, Type.BUG, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.BULLDOZE, Type.GROUND, MoveCategory.PHYSICAL, 60, 100, 20, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.makesContact(false)
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.FROST_BREATH, Type.ICE, MoveCategory.SPECIAL, 60, 90, 10, 100, 0, 5)
@@ -7792,9 +8005,9 @@ export function initMoves() {
.attr(ForceSwitchOutAttr)
.hidesTarget(),
new SelfStatusMove(Moves.WORK_UP, Type.NORMAL, -1, 30, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 1, true),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, true),
new AttackMove(Moves.ELECTROWEB, Type.ELECTRIC, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.WILD_CHARGE, Type.ELECTRIC, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5)
.attr(RecoilAttr)
@@ -7809,10 +8022,10 @@ export function initMoves() {
.attr(HitHealAttr)
.triageMove(),
new AttackMove(Moves.SACRED_SWORD, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 5)
- .attr(IgnoreOpponentStatChangesAttr)
+ .attr(IgnoreOpponentStatStagesAttr)
.slicingMove(),
new AttackMove(Moves.RAZOR_SHELL, Type.WATER, MoveCategory.PHYSICAL, 75, 95, 10, 50, 0, 5)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.slicingMove(),
new AttackMove(Moves.HEAT_CRASH, Type.FIRE, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 5)
.attr(MinimizeAccuracyAttr)
@@ -7820,13 +8033,13 @@ export function initMoves() {
.attr(HitsTagAttr, BattlerTagType.MINIMIZED, true)
.condition(failOnMaxCondition),
new AttackMove(Moves.LEAF_TORNADO, Type.GRASS, MoveCategory.SPECIAL, 65, 90, 10, 50, 0, 5)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.STEAMROLLER, Type.BUG, MoveCategory.PHYSICAL, 65, 100, 20, 30, 0, 5)
.attr(FlinchAttr),
new SelfStatusMove(Moves.COTTON_GUARD, Type.GRASS, -1, 10, -1, 0, 5)
- .attr(StatChangeAttr, BattleStat.DEF, 3, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 3, true),
new AttackMove(Moves.NIGHT_DAZE, Type.DARK, MoveCategory.SPECIAL, 85, 95, 10, 40, 0, 5)
- .attr(StatChangeAttr, BattleStat.ACC, -1),
+ .attr(StatStageChangeAttr, [ Stat.ACC ], -1),
new AttackMove(Moves.PSYSTRIKE, Type.PSYCHIC, MoveCategory.SPECIAL, 100, 100, 10, -1, 0, 5)
.attr(DefDefAttr),
new AttackMove(Moves.TAIL_SLAP, Type.NORMAL, MoveCategory.PHYSICAL, 25, 85, 10, -1, 0, 5)
@@ -7855,14 +8068,14 @@ export function initMoves() {
.attr(DefDefAttr)
.slicingMove(),
new AttackMove(Moves.GLACIATE, Type.ICE, MoveCategory.SPECIAL, 65, 95, 10, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.BOLT_STRIKE, Type.ELECTRIC, MoveCategory.PHYSICAL, 130, 85, 5, 20, 0, 5)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.BLUE_FLARE, Type.FIRE, MoveCategory.SPECIAL, 130, 85, 5, 20, 0, 5)
.attr(StatusEffectAttr, StatusEffect.BURN),
new AttackMove(Moves.FIERY_DANCE, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 50, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPATK, 1, true)
+ .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}"}))
@@ -7873,14 +8086,14 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.BURN)
.ignoresVirtual(),
new AttackMove(Moves.SNARL, Type.DARK, MoveCategory.SPECIAL, 55, 95, 15, 100, 0, 5)
- .attr(StatChangeAttr, BattleStat.SPATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.ICICLE_CRASH, Type.ICE, MoveCategory.PHYSICAL, 85, 90, 10, 30, 0, 5)
.attr(FlinchAttr)
.makesContact(false),
new AttackMove(Moves.V_CREATE, Type.FIRE, MoveCategory.PHYSICAL, 180, 95, 5, -1, 0, 5)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF, BattleStat.SPD ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF, Stat.SPD ], -1, true),
new AttackMove(Moves.FUSION_FLARE, Type.FIRE, MoveCategory.SPECIAL, 100, 100, 5, -1, 0, 5)
.attr(HealStatusEffectAttr, true, StatusEffect.FREEZE)
.attr(LastMoveDoublePowerAttr, Moves.FUSION_BOLT),
@@ -7904,12 +8117,12 @@ 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(StatChangeAttr, [BattleStat.ATK, BattleStat.SPATK], 1, false, (user, target, move) => target.isOfType(Type.GRASS) && target.isGrounded()),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (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(PostVictoryStatChangeAttr, BattleStat.ATK, 3, true ),
+ .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)
.ignoresProtect()
@@ -7918,7 +8131,7 @@ export function initMoves() {
.attr(AddTypeAttr, Type.GHOST)
.partial(),
new StatusMove(Moves.NOBLE_ROAR, Type.NORMAL, 100, 30, -1, 0, 6)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1)
.soundBased(),
new StatusMove(Moves.ION_DELUGE, Type.ELECTRIC, -1, 25, -1, 1, 6)
.target(MoveTarget.BOTH_SIDES)
@@ -7936,12 +8149,13 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.FREEZE_DRY, Type.ICE, MoveCategory.SPECIAL, 70, 100, 20, 10, 0, 6)
.attr(StatusEffectAttr, StatusEffect.FREEZE)
- .attr(WaterSuperEffectTypeMultiplierAttr),
+ .attr(WaterSuperEffectTypeMultiplierAttr)
+ .partial(), // This currently just multiplies the move's power instead of changing its effectiveness. It also doesn't account for abilities that modify type effectiveness such as tera shell.
new AttackMove(Moves.DISARMING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 40, -1, 15, -1, 0, 6)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.PARTING_SHOT, Type.DARK, 100, 20, -1, 0, 6)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, false, null, true, true, MoveEffectTrigger.PRE_APPLY)
.attr(ForceSwitchOutAttr, true, false)
.soundBased(),
new StatusMove(Moves.TOPSY_TURVY, Type.DARK, -1, 20, -1, 0, 6)
@@ -7955,7 +8169,7 @@ export function initMoves() {
.attr(AddArenaTagAttr, ArenaTagType.CRAFTY_SHIELD, 1, true, true),
new StatusMove(Moves.FLOWER_SHIELD, Type.FAIRY, -1, 10, -1, 0, 6)
.target(MoveTarget.ALL)
- .attr(StatChangeAttr, BattleStat.DEF, 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, false, (user, target, move) => target.getTypes().includes(Type.GRASS) && !target.getTag(SemiInvulnerableTag)),
new StatusMove(Moves.GRASSY_TERRAIN, Type.GRASS, -1, 10, -1, 0, 6)
.attr(TerrainChangeAttr, TerrainType.GRASSY)
.target(MoveTarget.BOTH_SIDES),
@@ -7965,11 +8179,11 @@ export function initMoves() {
new StatusMove(Moves.ELECTRIFY, Type.ELECTRIC, -1, 20, -1, 0, 6)
.unimplemented(),
new AttackMove(Moves.PLAY_ROUGH, Type.FAIRY, MoveCategory.PHYSICAL, 90, 90, 10, 10, 0, 6)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.FAIRY_WIND, Type.FAIRY, MoveCategory.SPECIAL, 40, 100, 30, -1, 0, 6)
.windMove(),
new AttackMove(Moves.MOONBLAST, Type.FAIRY, MoveCategory.SPECIAL, 95, 100, 15, 30, 0, 6)
- .attr(StatChangeAttr, BattleStat.SPATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
new AttackMove(Moves.BOOMBURST, Type.NORMAL, MoveCategory.SPECIAL, 140, 100, 10, -1, 0, 6)
.soundBased()
.target(MoveTarget.ALL_NEAR_OTHERS),
@@ -7979,12 +8193,12 @@ export function initMoves() {
new SelfStatusMove(Moves.KINGS_SHIELD, Type.STEEL, -1, 10, -1, 4, 6)
.attr(ProtectAttr, BattlerTagType.KINGS_SHIELD),
new StatusMove(Moves.PLAY_NICE, Type.NORMAL, -1, 20, -1, 0, 6)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new StatusMove(Moves.CONFIDE, Type.NORMAL, -1, 20, -1, 0, 6)
- .attr(StatChangeAttr, BattleStat.SPATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1)
.soundBased(),
new AttackMove(Moves.DIAMOND_STORM, Type.ROCK, MoveCategory.PHYSICAL, 100, 95, 5, 50, 0, 6)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true)
.makesContact(false)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.STEAM_ERUPTION, Type.WATER, MoveCategory.SPECIAL, 110, 95, 5, 30, 0, 6)
@@ -7998,26 +8212,26 @@ export function initMoves() {
.attr(WaterShurikenPowerAttr)
.attr(WaterShurikenMultiHitTypeAttr),
new AttackMove(Moves.MYSTICAL_FIRE, Type.FIRE, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 6)
- .attr(StatChangeAttr, BattleStat.SPATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
new SelfStatusMove(Moves.SPIKY_SHIELD, Type.GRASS, -1, 10, -1, 4, 6)
.attr(ProtectAttr, BattlerTagType.SPIKY_SHIELD),
new StatusMove(Moves.AROMATIC_MIST, Type.FAIRY, -1, 20, -1, 0, 6)
- .attr(StatChangeAttr, BattleStat.SPDEF, 1)
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], 1)
.target(MoveTarget.NEAR_ALLY),
new StatusMove(Moves.EERIE_IMPULSE, Type.ELECTRIC, 100, 15, -1, 0, 6)
- .attr(StatChangeAttr, BattleStat.SPATK, -2),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2),
new StatusMove(Moves.VENOM_DRENCH, Type.POISON, 100, 20, -1, 0, 6)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], -1, false, (user, target, move) => target.status?.effect === StatusEffect.POISON || target.status?.effect === StatusEffect.TOXIC)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new StatusMove(Moves.POWDER, Type.BUG, 100, 20, -1, 1, 6)
.powderMove()
.unimplemented(),
new SelfStatusMove(Moves.GEOMANCY, Type.FAIRY, -1, 10, -1, 0, 6)
.attr(ChargeAttr, ChargeAnim.GEOMANCY_CHARGING, i18next.t("moveTriggers:isChargingPower", {pokemonName: "{USER}"}))
- .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true)
.ignoresVirtual(),
new StatusMove(Moves.MAGNETIC_FLUX, Type.ELECTRIC, -1, 20, -1, 0, 6)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS].find(a => target.hasAbility(a, false)))
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS].find(a => target.hasAbility(a, false)))
.target(MoveTarget.USER_AND_ALLIES)
.condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))),
new StatusMove(Moves.HAPPY_HOUR, Type.NORMAL, -1, 30, -1, 0, 6) // No animation
@@ -8032,7 +8246,7 @@ export function initMoves() {
new StatusMove(Moves.HOLD_HANDS, Type.NORMAL, -1, 40, -1, 0, 6)
.target(MoveTarget.NEAR_ALLY),
new StatusMove(Moves.BABY_DOLL_EYES, Type.FAIRY, 100, 30, -1, 1, 6)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.NUZZLE, Type.ELECTRIC, MoveCategory.PHYSICAL, 20, 100, 20, 100, 0, 6)
.attr(StatusEffectAttr, StatusEffect.PARALYSIS),
new AttackMove(Moves.HOLD_BACK, Type.NORMAL, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 6)
@@ -8041,7 +8255,7 @@ export function initMoves() {
.makesContact()
.attr(TrapAttr, BattlerTagType.INFESTATION),
new AttackMove(Moves.POWER_UP_PUNCH, Type.FIGHTING, MoveCategory.PHYSICAL, 40, 100, 20, 100, 0, 6)
- .attr(StatChangeAttr, BattleStat.ATK, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 1, true)
.punchingMove(),
new AttackMove(Moves.OBLIVION_WING, Type.FLYING, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 6)
.attr(HitHealAttr, 0.75)
@@ -8072,9 +8286,9 @@ export function initMoves() {
.makesContact(false)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.DRAGON_ASCENT, Type.FLYING, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 6)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true),
new AttackMove(Moves.HYPERSPACE_FURY, Type.DARK, MoveCategory.PHYSICAL, 100, -1, 5, -1, 0, 6)
- .attr(StatChangeAttr, BattleStat.DEF, -1, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true)
.makesContact(false)
.ignoresProtect(),
/* Unused */
@@ -8201,13 +8415,13 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, false, false, 1, 1, true)
.makesContact(false),
new AttackMove(Moves.DARKEST_LARIAT, Type.DARK, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7)
- .attr(IgnoreOpponentStatChangesAttr),
+ .attr(IgnoreOpponentStatStagesAttr),
new AttackMove(Moves.SPARKLING_ARIA, Type.WATER, MoveCategory.SPECIAL, 90, 100, 10, 100, 0, 7)
.attr(HealStatusEffectAttr, false, StatusEffect.BURN)
.soundBased()
.target(MoveTarget.ALL_NEAR_OTHERS),
new AttackMove(Moves.ICE_HAMMER, Type.ICE, MoveCategory.PHYSICAL, 100, 90, 10, -1, 0, 7)
- .attr(StatChangeAttr, BattleStat.SPD, -1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1, true)
.punchingMove(),
new StatusMove(Moves.FLORAL_HEALING, Type.FAIRY, -1, 10, -1, 0, 7)
.attr(BoostHealAttr, 0.5, 2/3, true, false, (user, target, move) => user.scene.arena.terrain?.terrainType === TerrainType.GRASSY)
@@ -8215,8 +8429,8 @@ export function initMoves() {
new AttackMove(Moves.HIGH_HORSEPOWER, Type.GROUND, MoveCategory.PHYSICAL, 95, 95, 10, -1, 0, 7),
new StatusMove(Moves.STRENGTH_SAP, Type.GRASS, 100, 10, -1, 0, 7)
.attr(HitHealAttr, null, Stat.ATK)
- .attr(StatChangeAttr, BattleStat.ATK, -1)
- .condition((user, target, move) => target.summonData.battleStats[BattleStat.ATK] > -6)
+ .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}"}))
@@ -8228,11 +8442,11 @@ export function initMoves() {
.attr(AddBattlerTagAttr, BattlerTagType.CENTER_OF_ATTENTION, false),
new StatusMove(Moves.TOXIC_THREAD, Type.POISON, 100, 20, -1, 0, 7)
.attr(StatusEffectAttr, StatusEffect.POISON)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
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(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS].find(a => target.hasAbility(a, false)))
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 1, false, (user, target, move) => !![ Abilities.PLUS, Abilities.MINUS].find(a => target.hasAbility(a, false)))
.target(MoveTarget.USER_AND_ALLIES)
.condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))),
new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7)
@@ -8247,11 +8461,11 @@ export function initMoves() {
.attr(TerrainChangeAttr, TerrainType.PSYCHIC)
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.LUNGE, Type.BUG, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.FIRE_LASH, Type.FIRE, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.POWER_TRIP, Type.DARK, MoveCategory.PHYSICAL, 20, 100, 10, -1, 0, 7)
- .attr(StatChangeCountPowerAttr),
+ .attr(PositiveStatStagePowerAttr),
new AttackMove(Moves.BURN_UP, Type.FIRE, MoveCategory.SPECIAL, 130, 100, 5, -1, 0, 7)
.condition((user) => {
const userTypes = user.getTypes(true);
@@ -8262,7 +8476,7 @@ export function initMoves() {
user.scene.queueMessage(i18next.t("moveTriggers:burnedItselfOut", {pokemonName: getPokemonNameWithAffix(user)}));
}),
new StatusMove(Moves.SPEED_SWAP, Type.PSYCHIC, -1, 10, -1, 0, 7)
- .unimplemented(),
+ .attr(SwapStatAttr, Stat.SPD),
new AttackMove(Moves.SMART_STRIKE, Type.STEEL, MoveCategory.PHYSICAL, 70, -1, 10, -1, 0, 7),
new StatusMove(Moves.PURIFY, Type.POISON, -1, 20, -1, 0, 7)
.condition(
@@ -8277,7 +8491,7 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_ENEMIES)
.attr(SuppressAbilitiesIfActedAttr),
new AttackMove(Moves.TROP_KICK, Type.GRASS, MoveCategory.PHYSICAL, 70, 100, 15, 100, 0, 7)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new StatusMove(Moves.INSTRUCT, Type.PSYCHIC, -1, 15, -1, 0, 7)
.unimplemented(),
new AttackMove(Moves.BEAK_BLAST, Type.FLYING, MoveCategory.PHYSICAL, 100, 100, 15, -1, -3, 7)
@@ -8285,7 +8499,7 @@ export function initMoves() {
.ballBombMove()
.makesContact(false),
new AttackMove(Moves.CLANGING_SCALES, Type.DRAGON, MoveCategory.SPECIAL, 110, 100, 5, -1, 0, 7)
- .attr(StatChangeAttr, BattleStat.DEF, -1, true, null, true, false, MoveEffectTrigger.HIT, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1, true, null, true, false, MoveEffectTrigger.HIT, true)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.DRAGON_HAMMER, Type.DRAGON, MoveCategory.PHYSICAL, 90, 100, 15, -1, 0, 7),
@@ -8319,7 +8533,7 @@ export function initMoves() {
.partial()
.ignoresVirtual(),
new SelfStatusMove(Moves.EXTREME_EVOBOOST, Type.NORMAL, -1, 1, -1, 0, 7)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 2, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 2, true)
.ignoresVirtual(),
new AttackMove(Moves.GENESIS_SUPERNOVA, Type.PSYCHIC, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7)
.attr(TerrainChangeAttr, TerrainType.PSYCHIC)
@@ -8331,18 +8545,18 @@ export function initMoves() {
// Fails if the user was not hit by a physical attack during the turn
.condition((user, target, move) => user.getTag(ShellTrapTag)?.activated === true),
new AttackMove(Moves.FLEUR_CANNON, Type.FAIRY, MoveCategory.SPECIAL, 130, 90, 5, -1, 0, 7)
- .attr(StatChangeAttr, BattleStat.SPATK, -2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -2, true),
new AttackMove(Moves.PSYCHIC_FANGS, Type.PSYCHIC, MoveCategory.PHYSICAL, 85, 100, 10, -1, 0, 7)
.bitingMove()
.attr(RemoveScreensAttr),
new AttackMove(Moves.STOMPING_TANTRUM, Type.GROUND, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 7)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1),
new AttackMove(Moves.SHADOW_BONE, Type.GHOST, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.makesContact(false),
new AttackMove(Moves.ACCELEROCK, Type.ROCK, MoveCategory.PHYSICAL, 40, 100, 20, -1, 1, 7),
new AttackMove(Moves.LIQUIDATION, Type.WATER, MoveCategory.PHYSICAL, 85, 100, 10, 20, 0, 7)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.PRISMATIC_LASER, Type.PSYCHIC, MoveCategory.SPECIAL, 160, 100, 10, -1, 0, 7)
.attr(RechargeAttr),
new AttackMove(Moves.SPECTRAL_THIEF, Type.GHOST, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 7)
@@ -8354,7 +8568,7 @@ export function initMoves() {
.ignoresAbilities()
.partial(),
new StatusMove(Moves.TEARFUL_LOOK, Type.NORMAL, -1, 20, -1, 0, 7)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1),
new AttackMove(Moves.ZING_ZAP, Type.ELECTRIC, MoveCategory.PHYSICAL, 80, 100, 10, 30, 0, 7)
.attr(FlinchAttr),
new AttackMove(Moves.NATURES_MADNESS, Type.FAIRY, MoveCategory.SPECIAL, -1, 90, 10, -1, 0, 7)
@@ -8396,7 +8610,7 @@ export function initMoves() {
.makesContact(false)
.ignoresVirtual(),
new AttackMove(Moves.CLANGOROUS_SOULBLAZE, Type.DRAGON, MoveCategory.SPECIAL, 185, -1, 1, 100, 0, 7)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES)
.partial()
@@ -8463,18 +8677,18 @@ export function initMoves() {
.bitingMove(),
new SelfStatusMove(Moves.STUFF_CHEEKS, Type.NORMAL, -1, 10, -1, 0, 8) // TODO: Stuff Cheeks should not be selectable when the user does not have a berry, see wiki
.attr(EatBerryAttr)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true)
.condition((user) => {
const userBerries = user.scene.findModifiers(m => m instanceof BerryModifier, user.isPlayer());
return userBerries.length > 0;
})
.partial(),
new SelfStatusMove(Moves.NO_RETREAT, Type.FIGHTING, -1, 5, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, true)
- .attr(AddBattlerTagAttr, BattlerTagType.TRAPPED, true, false, 1)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, true)
+ .attr(AddBattlerTagAttr, BattlerTagType.NO_RETREAT, true, false)
.condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat
new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.partial(),
new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8)
.attr(ChangeTypeAttr, Type.PSYCHIC)
@@ -8569,16 +8783,16 @@ export function initMoves() {
.ignoresVirtual(),
/* End Unused */
new SelfStatusMove(Moves.CLANGOROUS_SOUL, Type.DRAGON, 100, 5, -1, 0, 8)
- .attr(CutHpStatBoostAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD ], 1, 3)
+ .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ], 1, 3)
.soundBased()
.danceMove(),
new AttackMove(Moves.BODY_PRESS, Type.FIGHTING, MoveCategory.PHYSICAL, 80, 100, 10, -1, 0, 8)
.attr(DefAtkAttr),
new StatusMove(Moves.DECORATE, Type.FAIRY, -1, 15, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], 2)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], 2)
.ignoresProtect(),
new AttackMove(Moves.DRUM_BEATING, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.makesContact(false),
new AttackMove(Moves.SNAP_TRAP, Type.GRASS, MoveCategory.PHYSICAL, 35, 100, 15, -1, 0, 8)
.attr(TrapAttr, BattlerTagType.SNAP_TRAP),
@@ -8591,25 +8805,25 @@ export function initMoves() {
.slicingMove(),
new AttackMove(Moves.BEHEMOTH_BASH, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 8),
new AttackMove(Moves.AURA_WHEEL, Type.ELECTRIC, MoveCategory.PHYSICAL, 110, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true)
.makesContact(false)
.attr(AuraWheelTypeAttr)
.condition((user, target, move) => [user.species.speciesId, user.fusionSpecies?.speciesId].includes(Species.MORPEKO)), // Missing custom fail message
new AttackMove(Moves.BREAKING_SWIPE, Type.DRAGON, MoveCategory.PHYSICAL, 60, 100, 15, 100, 0, 8)
.target(MoveTarget.ALL_NEAR_ENEMIES)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.BRANCH_POKE, Type.GRASS, MoveCategory.PHYSICAL, 40, 100, 40, -1, 0, 8),
new AttackMove(Moves.OVERDRIVE, Type.ELECTRIC, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 8)
.soundBased()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.APPLE_ACID, Type.GRASS, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPDEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -1),
new AttackMove(Moves.GRAV_APPLE, Type.GRASS, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTag(ArenaTagType.GRAVITY) ? 1.5 : 1)
.makesContact(false),
new AttackMove(Moves.SPIRIT_BREAK, Type.FAIRY, MoveCategory.PHYSICAL, 75, 100, 15, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
new AttackMove(Moves.STRANGE_STEAM, Type.FAIRY, MoveCategory.SPECIAL, 90, 95, 10, 20, 0, 8)
.attr(ConfuseAttr),
new StatusMove(Moves.LIFE_DEW, Type.WATER, -1, 10, -1, 0, 8)
@@ -8633,14 +8847,14 @@ 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(StatChangeAttr, BattleStat.SPD, 1, true) // TODO: Have boosts only apply at end of move, not after every hit
- //.attr(StatChangeAttr, BattleStat.DEF, -1, true)
+ //.attr(StatStageChangeAttr, Stat.SPD, 1, true) // TODO: Have boosts only apply at end of move, not after every hit
+ //.attr(StatStageChangeAttr, Stat.DEF, -1, true)
.attr(MultiHitAttr)
.makesContact(false)
.partial(),
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(StatChangeAttr, BattleStat.SPATK, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true)
.ignoresVirtual(),
new AttackMove(Moves.SHELL_SIDE_ARM, Type.POISON, MoveCategory.SPECIAL, 90, 100, 10, 20, 0, 8)
.attr(ShellSideArmCategoryAttr)
@@ -8661,12 +8875,12 @@ export function initMoves() {
.attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() !== TerrainType.NONE && user.isGrounded() ? 2 : 1)
.pulseMove(),
new AttackMove(Moves.SKITTER_SMACK, Type.BUG, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1),
new AttackMove(Moves.BURNING_JEALOUSY, Type.FIRE, MoveCategory.SPECIAL, 70, 100, 5, 100, 0, 8)
- .target(MoveTarget.ALL_NEAR_ENEMIES)
- .partial(),
+ .attr(StatusIfBoostedAttr, StatusEffect.BURN)
+ .target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.LASH_OUT, Type.DARK, MoveCategory.PHYSICAL, 75, 100, 5, -1, 0, 8)
- .partial(),
+ .attr(MovePowerMultiplierAttr, (user, _target, _move) => user.turnData.statStagesDecreased ? 2 : 1),
new AttackMove(Moves.POLTERGEIST, Type.GHOST, MoveCategory.PHYSICAL, 110, 90, 5, -1, 0, 8)
.attr(AttackedByItemAttr)
.makesContact(false),
@@ -8674,7 +8888,7 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_OTHERS)
.unimplemented(),
new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF ], 1)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1)
.target(MoveTarget.NEAR_ALLY),
new AttackMove(Moves.FLIP_TURN, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 20, -1, 0, 8)
.attr(ForceSwitchOutAttr, true, false),
@@ -8710,7 +8924,7 @@ export function initMoves() {
.attr(FlinchAttr)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.THUNDEROUS_KICK, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.DEF, -1),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1),
new AttackMove(Moves.GLACIAL_LANCE, Type.ICE, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8)
.target(MoveTarget.ALL_NEAR_ENEMIES)
.makesContact(false),
@@ -8722,18 +8936,18 @@ export function initMoves() {
new AttackMove(Moves.DIRE_CLAW, Type.POISON, MoveCategory.PHYSICAL, 80, 100, 15, 50, 0, 8)
.attr(MultiStatusEffectAttr, [StatusEffect.POISON, StatusEffect.PARALYSIS, StatusEffect.SLEEP]),
new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.DEF, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true),
new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8)
.unimplemented(),
new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8)
.attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK)
.slicingMove(),
new AttackMove(Moves.SPRINGTIDE_STORM, Type.FAIRY, MoveCategory.SPECIAL, 100, 80, 5, 30, 0, 8)
- .attr(StatChangeAttr, BattleStat.ATK, -1)
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1)
.windMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.MYSTICAL_POWER, Type.PSYCHIC, MoveCategory.SPECIAL, 70, 90, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.SPATK, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true),
new AttackMove(Moves.RAGING_FURY, Type.FIRE, MoveCategory.PHYSICAL, 120, 100, 10, -1, 0, 8)
.makesContact(false)
.attr(FrenzyAttr)
@@ -8749,10 +8963,10 @@ export function initMoves() {
.makesContact(false)
.attr(FlinchAttr),
new SelfStatusMove(Moves.VICTORY_DANCE, Type.FIGHTING, -1, 10, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.DEF, BattleStat.SPD ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF, Stat.SPD ], 1, true)
.danceMove(),
new AttackMove(Moves.HEADLONG_RUSH, Type.GROUND, MoveCategory.PHYSICAL, 120, 100, 5, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true)
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true)
.punchingMove(),
new AttackMove(Moves.BARB_BARRAGE, Type.POISON, MoveCategory.PHYSICAL, 60, 100, 10, 50, 0, 8)
.makesContact(false)
@@ -8760,15 +8974,15 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.POISON),
new AttackMove(Moves.ESPER_WING, Type.PSYCHIC, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 8)
.attr(HighCritAttr)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true),
new AttackMove(Moves.BITTER_MALICE, Type.GHOST, MoveCategory.SPECIAL, 75, 100, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new SelfStatusMove(Moves.SHELTER, Type.STEEL, -1, 10, 100, 0, 8)
- .attr(StatChangeAttr, BattleStat.DEF, 2, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF ], 2, true),
new AttackMove(Moves.TRIPLE_ARROWS, Type.FIGHTING, MoveCategory.PHYSICAL, 90, 100, 10, 30, 0, 8)
.makesContact(false)
.attr(HighCritAttr)
- .attr(StatChangeAttr, BattleStat.DEF, -1)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -1)
.attr(FlinchAttr)
.partial(),
new AttackMove(Moves.INFERNAL_PARADE, Type.GHOST, MoveCategory.SPECIAL, 60, 100, 15, 30, 0, 8)
@@ -8779,7 +8993,7 @@ export function initMoves() {
.slicingMove(),
new AttackMove(Moves.BLEAKWIND_STORM, Type.FLYING, MoveCategory.SPECIAL, 100, 80, 10, 30, 0, 8)
.attr(StormAccuracyAttr)
- .attr(StatChangeAttr, BattleStat.SPD, -1)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1)
.windMove()
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.WILDBOLT_STORM, Type.ELECTRIC, MoveCategory.SPECIAL, 100, 80, 10, 20, 0, 8)
@@ -8798,7 +9012,7 @@ export function initMoves() {
.target(MoveTarget.USER_AND_ALLIES)
.triageMove(),
new SelfStatusMove(Moves.TAKE_HEART, Type.PSYCHIC, -1, 10, -1, 0, 8)
- .attr(StatChangeAttr, [ BattleStat.SPATK, BattleStat.SPDEF ], 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK, Stat.SPDEF ], 1, true)
.attr(HealStatusEffectAttr, true, StatusEffect.PARALYSIS, StatusEffect.POISON, StatusEffect.TOXIC, StatusEffect.BURN, StatusEffect.SLEEP),
/* Unused
new AttackMove(Moves.G_MAX_WILDFIRE, Type.FIRE, MoveCategory.PHYSICAL, 10, -1, 10, -1, 0, 8)
@@ -8905,7 +9119,7 @@ export function initMoves() {
.attr(TeraBlastCategoryAttr)
.attr(TeraBlastTypeAttr)
.attr(TeraBlastPowerAttr)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR))
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPATK ], -1, true, (user, target, move) => user.isTerastallized() && user.isOfType(Type.STELLAR))
.partial(),
new SelfStatusMove(Moves.SILK_TRAP, Type.BUG, -1, 10, -1, 4, 9)
.attr(ProtectAttr, BattlerTagType.SILK_TRAP),
@@ -8918,17 +9132,17 @@ export function initMoves() {
.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)
- .attr(StatChangeAttr, BattleStat.SPDEF, -2),
+ .attr(StatStageChangeAttr, [ Stat.SPDEF ], -2),
new AttackMove(Moves.ORDER_UP, Type.DRAGON, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9)
.makesContact(false)
.partial(),
new AttackMove(Moves.JET_PUNCH, Type.WATER, MoveCategory.PHYSICAL, 60, 100, 15, -1, 1, 9)
.punchingMove(),
new StatusMove(Moves.SPICY_EXTRACT, Type.GRASS, -1, 15, -1, 0, 9)
- .attr(StatChangeAttr, BattleStat.ATK, 2)
- .attr(StatChangeAttr, BattleStat.DEF, -2),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], 2)
+ .attr(StatStageChangeAttr, [ Stat.DEF ], -2),
new AttackMove(Moves.SPIN_OUT, Type.STEEL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPD, -2, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -2, true),
new AttackMove(Moves.POPULATION_BOMB, Type.NORMAL, MoveCategory.PHYSICAL, 20, 90, 10, -1, 0, 9)
.attr(MultiHitAttr, MultiHitType._10)
.slicingMove()
@@ -8970,24 +9184,24 @@ export function initMoves() {
new StatusMove(Moves.DOODLE, Type.NORMAL, 100, 10, -1, 0, 9)
.attr(AbilityCopyAttr, true),
new SelfStatusMove(Moves.FILLET_AWAY, Type.NORMAL, -1, 10, -1, 0, 9)
- .attr(CutHpStatBoostAttr, [ BattleStat.ATK, BattleStat.SPATK, BattleStat.SPD ], 2, 2),
+ .attr(CutHpStatStageBoostAttr, [ Stat.ATK, Stat.SPATK, Stat.SPD ], 2, 2),
new AttackMove(Moves.KOWTOW_CLEAVE, Type.DARK, MoveCategory.PHYSICAL, 85, -1, 10, -1, 0, 9)
.slicingMove(),
new AttackMove(Moves.FLOWER_TRICK, Type.GRASS, MoveCategory.PHYSICAL, 70, -1, 10, 100, 0, 9)
.attr(CritOnlyAttr)
.makesContact(false),
new AttackMove(Moves.TORCH_SONG, Type.FIRE, MoveCategory.SPECIAL, 80, 100, 10, 100, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPATK, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], 1, true)
.soundBased(),
new AttackMove(Moves.AQUA_STEP, Type.WATER, MoveCategory.PHYSICAL, 80, 100, 10, 100, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true)
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true)
.danceMove(),
new AttackMove(Moves.RAGING_BULL, Type.NORMAL, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9)
.attr(RagingBullTypeAttr)
.attr(RemoveScreensAttr),
new AttackMove(Moves.MAKE_IT_RAIN, Type.STEEL, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9)
.attr(MoneyAttr)
- .attr(StatChangeAttr, BattleStat.SPATK, -1, true, null, true, false, MoveEffectTrigger.HIT, true)
+ .attr(StatStageChangeAttr, [ Stat.SPATK ], -1, true, null, true, false, MoveEffectTrigger.HIT, true)
.target(MoveTarget.ALL_NEAR_ENEMIES),
new AttackMove(Moves.PSYBLADE, Type.PSYCHIC, MoveCategory.PHYSICAL, 80, 100, 15, -1, 0, 9)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.scene.arena.getTerrainType() === TerrainType.ELECTRIC && user.isGrounded() ? 1.5 : 1)
@@ -9009,17 +9223,17 @@ export function initMoves() {
.attr(ForceSwitchOutAttr, true, false)
.target(MoveTarget.BOTH_SIDES),
new SelfStatusMove(Moves.TIDY_UP, Type.NORMAL, -1, 10, -1, 0, 9)
- .attr(StatChangeAttr, [ BattleStat.ATK, BattleStat.SPD ], 1, true, null, true, true)
+ .attr(StatStageChangeAttr, [ Stat.ATK, Stat.SPD ], 1, true, null, true, true)
.attr(RemoveArenaTrapAttr, true),
new StatusMove(Moves.SNOWSCAPE, Type.ICE, -1, 10, -1, 0, 9)
.attr(WeatherChangeAttr, WeatherType.SNOW)
.target(MoveTarget.BOTH_SIDES),
new AttackMove(Moves.POUNCE, Type.BUG, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPD, -1),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1),
new AttackMove(Moves.TRAILBLAZE, Type.GRASS, MoveCategory.PHYSICAL, 50, 100, 20, 100, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPD, 1, true),
+ .attr(StatStageChangeAttr, [ Stat.SPD ], 1, true),
new AttackMove(Moves.CHILLING_WATER, Type.WATER, MoveCategory.SPECIAL, 50, 100, 20, 100, 0, 9)
- .attr(StatChangeAttr, BattleStat.ATK, -1),
+ .attr(StatStageChangeAttr, [ Stat.ATK ], -1),
new AttackMove(Moves.HYPER_DRILL, Type.NORMAL, MoveCategory.PHYSICAL, 100, 100, 5, -1, 0, 9)
.ignoresProtect(),
new AttackMove(Moves.TWIN_BEAM, Type.PSYCHIC, MoveCategory.SPECIAL, 40, 100, 10, -1, 0, 9)
@@ -9028,7 +9242,7 @@ export function initMoves() {
.attr(HitCountPowerAttr)
.punchingMove(),
new AttackMove(Moves.ARMOR_CANNON, Type.FIRE, MoveCategory.SPECIAL, 120, 100, 5, -1, 0, 9)
- .attr(StatChangeAttr, [ BattleStat.DEF, BattleStat.SPDEF ], -1, true),
+ .attr(StatStageChangeAttr, [ Stat.DEF, Stat.SPDEF ], -1, true),
new AttackMove(Moves.BITTER_BLADE, Type.FIRE, MoveCategory.PHYSICAL, 90, 100, 10, -1, 0, 9)
.attr(HitHealAttr)
.slicingMove()
@@ -9083,7 +9297,7 @@ export function initMoves() {
.target(MoveTarget.ALL_NEAR_ENEMIES)
.triageMove(),
new AttackMove(Moves.SYRUP_BOMB, Type.GRASS, MoveCategory.SPECIAL, 60, 85, 10, -1, 0, 9)
- .attr(StatChangeAttr, BattleStat.SPD, -1) //Temporary
+ .attr(StatStageChangeAttr, [ Stat.SPD ], -1) //Temporary
.ballBombMove()
.partial(),
new AttackMove(Moves.IVY_CUDGEL, Type.GRASS, MoveCategory.PHYSICAL, 100, 100, 10, -1, 0, 9)
@@ -9112,12 +9326,11 @@ export function initMoves() {
new AttackMove(Moves.HARD_PRESS, Type.STEEL, MoveCategory.PHYSICAL, -1, 100, 10, -1, 0, 9)
.attr(OpponentHighHpPowerAttr, 100),
new StatusMove(Moves.DRAGON_CHEER, Type.DRAGON, -1, 15, -1, 0, 9)
- .attr(AddBattlerTagAttr, BattlerTagType.CRIT_BOOST, false, true)
- .target(MoveTarget.NEAR_ALLY)
- .partial(),
+ .attr(AddBattlerTagAttr, BattlerTagType.DRAGON_CHEER, false, true)
+ .target(MoveTarget.NEAR_ALLY),
new AttackMove(Moves.ALLURING_VOICE, Type.FAIRY, MoveCategory.SPECIAL, 80, 100, 10, -1, 0, 9)
- .soundBased()
- .partial(),
+ .attr(AddBattlerTagIfBoostedAttr, BattlerTagType.CONFUSED)
+ .soundBased(),
new AttackMove(Moves.TEMPER_FLARE, Type.FIRE, MoveCategory.PHYSICAL, 75, 100, 10, -1, 0, 9)
.attr(MovePowerMultiplierAttr, (user, target, move) => user.getLastXMoves(2)[1]?.result === MoveResult.MISS || user.getLastXMoves(2)[1]?.result === MoveResult.FAIL ? 2 : 1),
new AttackMove(Moves.SUPERCELL_SLAM, Type.ELECTRIC, MoveCategory.PHYSICAL, 100, 95, 15, -1, 0, 9)
@@ -9136,7 +9349,7 @@ export function initMoves() {
.attr(StatusEffectAttr, StatusEffect.TOXIC)
);
allMoves.map(m => {
- if (m.getAttrs(StatChangeAttr).some(a => a.selfTarget && a.levels < 0)) {
+ if (m.getAttrs(StatStageChangeAttr).some(a => a.selfTarget && a.stages < 0)) {
selfStatLowerMoves.push(m.id);
}
});
diff --git a/src/data/nature.ts b/src/data/nature.ts
index 72e5bb7863c..c614be465c3 100644
--- a/src/data/nature.ts
+++ b/src/data/nature.ts
@@ -1,9 +1,9 @@
-import { Stat, getStatName } from "./pokemon-stat";
import * as Utils from "../utils";
import { TextStyle, getBBCodeFrag } from "../ui/text";
import { Nature } from "#enums/nature";
import { UiTheme } from "#enums/ui-theme";
import i18next from "i18next";
+import { Stat, EFFECTIVE_STATS, getShortenedStatKey } from "#app/enums/stat";
export { Nature };
@@ -14,10 +14,9 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
ret = i18next.t("nature:" + ret as any);
}
if (includeStatEffects) {
- const stats = Utils.getEnumValues(Stat).slice(1);
let increasedStat: Stat | null = null;
let decreasedStat: Stat | null = null;
- for (const stat of stats) {
+ for (const stat of EFFECTIVE_STATS) {
const multiplier = getNatureStatMultiplier(nature, stat);
if (multiplier > 1) {
increasedStat = stat;
@@ -28,7 +27,7 @@ export function getNatureName(nature: Nature, includeStatEffects: boolean = fals
const textStyle = forStarterSelect ? TextStyle.SUMMARY_ALT : TextStyle.WINDOW;
const getTextFrag = !ignoreBBCode ? (text: string, style: TextStyle) => getBBCodeFrag(text, style, uiTheme) : (text: string, style: TextStyle) => text;
if (increasedStat && decreasedStat) {
- ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${getStatName(increasedStat, true)}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${getStatName(decreasedStat, true)}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`;
+ ret = `${getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(`, textStyle)}${getTextFrag(`+${i18next.t(getShortenedStatKey(increasedStat))}`, TextStyle.SUMMARY_PINK)}${getTextFrag("/", textStyle)}${getTextFrag(`-${i18next.t(getShortenedStatKey(decreasedStat))}`, TextStyle.SUMMARY_BLUE)}${getTextFrag(")", textStyle)}`;
} else {
ret = getTextFrag(`${ret}${!forStarterSelect ? "\n" : " "}(-)`, textStyle);
}
diff --git a/src/data/pokemon-evolutions.ts b/src/data/pokemon-evolutions.ts
index 315e75e53e1..6479d620182 100644
--- a/src/data/pokemon-evolutions.ts
+++ b/src/data/pokemon-evolutions.ts
@@ -1,7 +1,7 @@
import { Gender } from "./gender";
import { PokeballType } from "./pokeball";
import Pokemon from "../field/pokemon";
-import { Stat } from "./pokemon-stat";
+import { Stat } from "#enums/stat";
import { Type } from "./type";
import * as Utils from "../utils";
import { SpeciesFormKey } from "./pokemon-species";
diff --git a/src/data/pokemon-forms.ts b/src/data/pokemon-forms.ts
index e4417f8e8bb..bc815b91f3a 100644
--- a/src/data/pokemon-forms.ts
+++ b/src/data/pokemon-forms.ts
@@ -66,34 +66,34 @@ export enum FormChangeItem {
BLUE_ORB = 50,
RED_ORB,
- SHARP_METEORITE,
- HARD_METEORITE,
- SMOOTH_METEORITE,
ADAMANT_CRYSTAL,
LUSTROUS_GLOBE,
GRISEOUS_CORE,
REVEAL_GLASS,
- GRACIDEA,
MAX_MUSHROOMS,
DARK_STONE,
LIGHT_STONE,
PRISON_BOTTLE,
- N_LUNARIZER,
- N_SOLARIZER,
RUSTED_SWORD,
RUSTED_SHIELD,
ICY_REINS_OF_UNITY,
SHADOW_REINS_OF_UNITY,
- WELLSPRING_MASK,
- HEARTHFLAME_MASK,
- CORNERSTONE_MASK,
+ ULTRANECROZIUM_Z,
+
+ SHARP_METEORITE = 100,
+ HARD_METEORITE,
+ SMOOTH_METEORITE,
+ GRACIDEA,
SHOCK_DRIVE,
BURN_DRIVE,
CHILL_DRIVE,
DOUSE_DRIVE,
- ULTRANECROZIUM_Z,
-
- FIST_PLATE = 100,
+ N_SOLARIZER,
+ N_LUNARIZER,
+ WELLSPRING_MASK,
+ HEARTHFLAME_MASK,
+ CORNERSTONE_MASK,
+ FIST_PLATE,
SKY_PLATE,
TOXIC_PLATE,
EARTH_PLATE,
@@ -129,7 +129,7 @@ export enum FormChangeItem {
DRAGON_MEMORY,
DARK_MEMORY,
FAIRY_MEMORY,
- BLANK_MEMORY // TODO: Find a potential use for this
+ NORMAL_MEMORY // TODO: Find a potential use for this
}
export type SpeciesFormChangeConditionPredicate = (p: Pokemon) => boolean;
@@ -359,7 +359,7 @@ export class SpeciesDefaultFormMatchTrigger extends SpeciesFormChangeTrigger {
/**
* Class used for triggering form changes based on weather.
- * Used by Castform.
+ * Used by Castform and Cherrim.
* @extends SpeciesFormChangeTrigger
*/
export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
@@ -392,7 +392,7 @@ export class SpeciesFormChangeWeatherTrigger extends SpeciesFormChangeTrigger {
/**
* Class used for reverting to the original form when the weather runs out
* or when the user loses the ability/is suppressed.
- * Used by Castform.
+ * Used by Castform and Cherrim.
* @extends SpeciesFormChangeTrigger
*/
export class SpeciesFormChangeRevertWeatherFormTrigger extends SpeciesFormChangeTrigger {
@@ -930,6 +930,11 @@ export const pokemonFormChanges: PokemonFormChanges = {
new SpeciesFormChange(Species.CASTFORM, "rainy", "", new SpeciesFormChangeActiveTrigger(), true),
new SpeciesFormChange(Species.CASTFORM, "snowy", "", new SpeciesFormChangeActiveTrigger(), true),
],
+ [Species.CHERRIM]: [
+ new SpeciesFormChange(Species.CHERRIM, "overcast", "sunshine", new SpeciesFormChangeWeatherTrigger(Abilities.FLOWER_GIFT, [ WeatherType.SUNNY, WeatherType.HARSH_SUN ]), true),
+ new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeRevertWeatherFormTrigger(Abilities.FLOWER_GIFT, [ WeatherType.NONE, WeatherType.SANDSTORM, WeatherType.STRONG_WINDS, WeatherType.FOG, WeatherType.HAIL, WeatherType.HEAVY_RAIN, WeatherType.SNOW, WeatherType.RAIN ]), true),
+ new SpeciesFormChange(Species.CHERRIM, "sunshine", "overcast", new SpeciesFormChangeActiveTrigger(), true),
+ ],
};
export function initPokemonForms() {
diff --git a/src/data/pokemon-species.ts b/src/data/pokemon-species.ts
index 832f7112748..09448b332e4 100644
--- a/src/data/pokemon-species.ts
+++ b/src/data/pokemon-species.ts
@@ -14,7 +14,7 @@ import { GrowthRate } from "./exp";
import { EvolutionLevel, SpeciesWildEvolutionDelay, pokemonEvolutions, pokemonPrevolutions } from "./pokemon-evolutions";
import { Type } from "./type";
import { LevelMoves, pokemonFormLevelMoves, pokemonFormLevelMoves as pokemonSpeciesFormLevelMoves, pokemonSpeciesLevelMoves } from "./pokemon-level-moves";
-import { Stat } from "./pokemon-stat";
+import { Stat } from "#enums/stat";
import { Variant, VariantSet, variantColorCache, variantData } from "./variant";
export enum Region {
@@ -944,7 +944,7 @@ export function initSpecies() {
new PokemonSpecies(Species.METAPOD, 1, false, false, false, "Cocoon Pokémon", Type.BUG, null, 0.7, 9.9, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 50, 20, 55, 25, 25, 30, 120, 50, 72, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.BUTTERFREE, 1, false, false, false, "Butterfly Pokémon", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, GrowthRate.MEDIUM_FAST, 50, true, true,
new PokemonForm("Normal", "", Type.BUG, Type.FLYING, 1.1, 32, Abilities.COMPOUND_EYES, Abilities.NONE, Abilities.TINTED_LENS, 395, 60, 45, 50, 90, 80, 70, 45, 50, 198, true, null, true),
- new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 32, Abilities.TINTED_LENS, Abilities.TINTED_LENS, Abilities.TINTED_LENS, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true),
+ new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.BUG, Type.FLYING, 17, 32, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, Abilities.COMPOUND_EYES, 495, 85, 35, 80, 120, 90, 85, 45, 50, 198, true),
),
new PokemonSpecies(Species.WEEDLE, 1, false, false, false, "Hairy Bug Pokémon", Type.BUG, Type.POISON, 0.3, 3.2, Abilities.SHIELD_DUST, Abilities.NONE, Abilities.RUN_AWAY, 195, 40, 35, 30, 20, 20, 50, 255, 70, 39, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.KAKUNA, 1, false, false, false, "Cocoon Pokémon", Type.BUG, Type.POISON, 0.6, 10, Abilities.SHED_SKIN, Abilities.NONE, Abilities.SHED_SKIN, 205, 45, 25, 50, 25, 25, 35, 120, 70, 72, GrowthRate.MEDIUM_FAST, 50, false),
@@ -1132,7 +1132,7 @@ export function initSpecies() {
),
new PokemonSpecies(Species.SNORLAX, 1, false, false, false, "Sleeping Pokémon", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, GrowthRate.SLOW, 87.5, false, true,
new PokemonForm("Normal", "", Type.NORMAL, null, 2.1, 460, Abilities.IMMUNITY, Abilities.THICK_FAT, Abilities.GLUTTONY, 540, 160, 110, 65, 65, 110, 30, 25, 50, 189, false, null, true),
- new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, Type.GRASS, 35, 460, Abilities.THICK_FAT, Abilities.THICK_FAT, Abilities.THICK_FAT, 640, 200, 135, 85, 80, 125, 15, 25, 50, 189),
+ new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.NORMAL, null, 35, 460, Abilities.HARVEST, Abilities.HARVEST, Abilities.HARVEST, 640, 200, 135, 80, 80, 125, 20, 25, 50, 189),
),
new PokemonSpecies(Species.ARTICUNO, 1, true, false, false, "Freeze Pokémon", Type.ICE, Type.FLYING, 1.7, 55.4, Abilities.PRESSURE, Abilities.NONE, Abilities.SNOW_CLOAK, 580, 90, 85, 100, 95, 125, 85, 3, 35, 290, GrowthRate.SLOW, null, false),
new PokemonSpecies(Species.ZAPDOS, 1, true, false, false, "Electric Pokémon", Type.ELECTRIC, Type.FLYING, 1.6, 52.6, Abilities.PRESSURE, Abilities.NONE, Abilities.STATIC, 580, 90, 90, 85, 125, 90, 100, 3, 35, 290, GrowthRate.SLOW, null, false),
@@ -2252,19 +2252,19 @@ export function initSpecies() {
new PokemonSpecies(Species.THWACKEY, 8, false, false, false, "Beat Pokémon", Type.GRASS, null, 0.7, 14, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 420, 70, 85, 70, 55, 60, 80, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.RILLABOOM, 8, false, false, false, "Drummer Pokémon", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true,
new PokemonForm("Normal", "", Type.GRASS, null, 2.1, 90, Abilities.OVERGROW, Abilities.NONE, Abilities.GRASSY_SURGE, 530, 100, 125, 90, 60, 70, 85, 45, 50, 265, false, null, true),
- new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 90, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, 630, 125, 150, 115, 65, 95, 80, 45, 50, 265),
+ new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.GRASS, null, 28, 90, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, Abilities.GRASSY_SURGE, 630, 125, 150, 105, 85, 85, 80, 45, 50, 265),
),
new PokemonSpecies(Species.SCORBUNNY, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.3, 4.5, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 310, 50, 71, 40, 40, 40, 69, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.RABOOT, 8, false, false, false, "Rabbit Pokémon", Type.FIRE, null, 0.6, 9, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 420, 65, 86, 60, 55, 60, 94, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.CINDERACE, 8, false, false, false, "Striker Pokémon", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true,
new PokemonForm("Normal", "", Type.FIRE, null, 1.4, 33, Abilities.BLAZE, Abilities.NONE, Abilities.LIBERO, 530, 80, 116, 75, 65, 75, 119, 45, 50, 265, false, null, true),
- new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 33, Abilities.LIBERO, Abilities.LIBERO, Abilities.LIBERO, 630, 90, 151, 85, 85, 85, 134, 45, 50, 265),
+ new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.FIRE, null, 27, 33, Abilities.LIBERO, Abilities.LIBERO, Abilities.LIBERO, 630, 100, 146, 80, 90, 80, 134, 45, 50, 265),
),
new PokemonSpecies(Species.SOBBLE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.3, 4, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 310, 50, 40, 40, 70, 40, 70, 45, 50, 62, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.DRIZZILE, 8, false, false, false, "Water Lizard Pokémon", Type.WATER, null, 0.7, 11.5, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 420, 65, 60, 55, 95, 55, 90, 45, 50, 147, GrowthRate.MEDIUM_SLOW, 87.5, false),
new PokemonSpecies(Species.INTELEON, 8, false, false, false, "Secret Agent Pokémon", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, GrowthRate.MEDIUM_SLOW, 87.5, false, true,
new PokemonForm("Normal", "", Type.WATER, null, 1.9, 45.2, Abilities.TORRENT, Abilities.NONE, Abilities.SNIPER, 530, 70, 85, 65, 125, 65, 120, 45, 50, 265, false, null, true),
- new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 45.2, Abilities.SNIPER, Abilities.SNIPER, Abilities.SNIPER, 630, 90, 90, 85, 150, 85, 130, 45, 50, 265),
+ new PokemonForm("G-Max", SpeciesFormKey.GIGANTAMAX, Type.WATER, null, 40, 45.2, Abilities.SNIPER, Abilities.SNIPER, Abilities.SNIPER, 630, 95, 97, 77, 147, 77, 137, 45, 50, 265),
),
new PokemonSpecies(Species.SKWOVET, 8, false, false, false, "Cheeky Pokémon", Type.NORMAL, null, 0.3, 2.5, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 275, 70, 55, 55, 35, 35, 25, 255, 50, 55, GrowthRate.MEDIUM_FAST, 50, false),
new PokemonSpecies(Species.GREEDENT, 8, false, false, false, "Greedy Pokémon", Type.NORMAL, null, 0.6, 6, Abilities.CHEEK_POUCH, Abilities.NONE, Abilities.GLUTTONY, 460, 120, 95, 95, 55, 75, 20, 90, 50, 161, GrowthRate.MEDIUM_FAST, 50, false),
@@ -3470,7 +3470,7 @@ export const starterPassiveAbilities = {
[Species.SUICUNE]: Abilities.UNAWARE,
[Species.LARVITAR]: Abilities.SAND_RUSH,
[Species.LUGIA]: Abilities.DELTA_STREAM,
- [Species.HO_OH]: Abilities.DROUGHT,
+ [Species.HO_OH]: Abilities.MAGIC_GUARD,
[Species.CELEBI]: Abilities.GRASSY_SURGE,
[Species.TREECKO]: Abilities.TINTED_LENS,
[Species.TORCHIC]: Abilities.RECKLESS,
@@ -3573,7 +3573,7 @@ export const starterPassiveAbilities = {
[Species.CHATOT]: Abilities.PUNK_ROCK,
[Species.SPIRITOMB]: Abilities.VESSEL_OF_RUIN,
[Species.GIBLE]: Abilities.SAND_STREAM,
- [Species.MUNCHLAX]: Abilities.HARVEST,
+ [Species.MUNCHLAX]: Abilities.RIPEN,
[Species.RIOLU]: Abilities.MINDS_EYE,
[Species.HIPPOPOTAS]: Abilities.UNAWARE,
[Species.SKORUPI]: Abilities.SUPER_LUCK,
@@ -3591,7 +3591,7 @@ export const starterPassiveAbilities = {
[Species.HEATRAN]: Abilities.EARTH_EATER,
[Species.REGIGIGAS]: Abilities.MINDS_EYE,
[Species.GIRATINA]: Abilities.SHADOW_SHIELD,
- [Species.CRESSELIA]: Abilities.UNAWARE,
+ [Species.CRESSELIA]: Abilities.SHADOW_SHIELD,
[Species.PHIONE]: Abilities.SIMPLE,
[Species.MANAPHY]: Abilities.PRIMORDIAL_SEA,
[Species.DARKRAI]: Abilities.UNNERVE,
diff --git a/src/data/pokemon-stat.ts b/src/data/pokemon-stat.ts
deleted file mode 100644
index 16570785a62..00000000000
--- a/src/data/pokemon-stat.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import { Stat } from "#enums/stat";
-import i18next from "i18next";
-
-export { Stat };
-
-export function getStatName(stat: Stat, shorten: boolean = false) {
- let ret: string = "";
- switch (stat) {
- case Stat.HP:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.HP") : i18next.t("pokemonInfo:Stat.HPshortened");
- break;
- case Stat.ATK:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.ATK") : i18next.t("pokemonInfo:Stat.ATKshortened");
- break;
- case Stat.DEF:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.DEF") : i18next.t("pokemonInfo:Stat.DEFshortened");
- break;
- case Stat.SPATK:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.SPATK") : i18next.t("pokemonInfo:Stat.SPATKshortened");
- break;
- case Stat.SPDEF:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.SPDEF") : i18next.t("pokemonInfo:Stat.SPDEFshortened");
- break;
- case Stat.SPD:
- ret = !shorten ? i18next.t("pokemonInfo:Stat.SPD") : i18next.t("pokemonInfo:Stat.SPDshortened");
- break;
- }
- return ret;
-}
diff --git a/src/data/temp-battle-stat.ts b/src/data/temp-battle-stat.ts
deleted file mode 100644
index 2d461a1d647..00000000000
--- a/src/data/temp-battle-stat.ts
+++ /dev/null
@@ -1,38 +0,0 @@
-import { BattleStat, getBattleStatName } from "./battle-stat";
-import i18next from "i18next";
-
-export enum TempBattleStat {
- ATK,
- DEF,
- SPATK,
- SPDEF,
- SPD,
- ACC,
- CRIT
-}
-
-export function getTempBattleStatName(tempBattleStat: TempBattleStat) {
- if (tempBattleStat === TempBattleStat.CRIT) {
- return i18next.t("modifierType:TempBattleStatBoosterStatName.CRIT");
- }
- return getBattleStatName(tempBattleStat as integer as BattleStat);
-}
-
-export function getTempBattleStatBoosterItemName(tempBattleStat: TempBattleStat) {
- switch (tempBattleStat) {
- case TempBattleStat.ATK:
- return "X Attack";
- case TempBattleStat.DEF:
- return "X Defense";
- case TempBattleStat.SPATK:
- return "X Sp. Atk";
- case TempBattleStat.SPDEF:
- return "X Sp. Def";
- case TempBattleStat.SPD:
- return "X Speed";
- case TempBattleStat.ACC:
- return "X Accuracy";
- case TempBattleStat.CRIT:
- return "Dire Hit";
- }
-}
diff --git a/src/data/tms.ts b/src/data/tms.ts
index 55f0602c84a..9dea6d74a86 100644
--- a/src/data/tms.ts
+++ b/src/data/tms.ts
@@ -42431,7 +42431,6 @@ export const tmSpecies: TmSpecies = {
Species.TORTERRA,
Species.BUDEW,
Species.ROSERADE,
- Species.WORMADAM,
Species.CHERUBI,
Species.CHERRIM,
Species.CARNIVINE,
@@ -42449,6 +42448,7 @@ export const tmSpecies: TmSpecies = {
Species.PETILIL,
Species.LILLIGANT,
Species.MARACTUS,
+ Species.MINCCINO,
Species.CINCCINO,
Species.DEERLING,
Species.SAWSBUCK,
@@ -42511,6 +42511,10 @@ export const tmSpecies: TmSpecies = {
Species.DIPPLIN,
Species.OGERPON,
Species.HYDRAPPLE,
+ [
+ Species.WORMADAM,
+ "plant",
+ ],
Species.ALOLA_EXEGGUTOR,
Species.HISUI_VOLTORB,
Species.HISUI_ELECTRODE,
@@ -45984,6 +45988,7 @@ export const tmSpecies: TmSpecies = {
Species.TEDDIURSA,
Species.URSARING,
Species.HITMONTOP,
+ Species.COMBUSKEN,
Species.BLAZIKEN,
Species.BRELOOM,
Species.MAKUHITA,
@@ -48612,6 +48617,7 @@ export const tmSpecies: TmSpecies = {
Species.WOOBAT,
Species.SWOOBAT,
Species.SEWADDLE,
+ Species.SWADLOON,
Species.LEAVANNY,
Species.SIGILYPH,
Species.ARCHEOPS,
@@ -48641,6 +48647,9 @@ export const tmSpecies: TmSpecies = {
Species.ROWLET,
Species.DARTRIX,
Species.DECIDUEYE,
+ Species.PIKIPEK,
+ Species.TRUMBEAK,
+ Species.TOUCANNON,
Species.VIKAVOLT,
Species.ORICORIO,
Species.TYPE_NULL,
@@ -49162,6 +49171,8 @@ export const tmSpecies: TmSpecies = {
Species.AZELF,
Species.REGIGIGAS,
Species.DARKRAI,
+ Species.PIGNITE,
+ Species.EMBOAR,
Species.AUDINO,
Species.TIMBURR,
Species.GURDURR,
@@ -49792,10 +49803,13 @@ export const tmSpecies: TmSpecies = {
],
[Moves.BRAVE_BIRD]: [
Species.PIDGEY,
+ Species.PIDGEOTTO,
+ Species.PIDGEOT,
Species.ZUBAT,
Species.GOLBAT,
Species.FARFETCHD,
Species.DODUO,
+ Species.DODRIO,
Species.ARTICUNO,
Species.ZAPDOS,
Species.MOLTRES,
@@ -49806,6 +49820,7 @@ export const tmSpecies: TmSpecies = {
Species.MURKROW,
Species.DELIBIRD,
Species.SKARMORY,
+ Species.LUGIA,
Species.HO_OH,
Species.BLAZIKEN,
Species.TAILLOW,
@@ -49833,6 +49848,8 @@ export const tmSpecies: TmSpecies = {
Species.DARTRIX,
Species.DECIDUEYE,
Species.PIKIPEK,
+ Species.TRUMBEAK,
+ Species.TOUCANNON,
Species.TAPU_KOKO,
Species.ROOKIDEE,
Species.CORVISQUIRE,
@@ -50008,6 +50025,7 @@ export const tmSpecies: TmSpecies = {
Species.MUDSDALE,
Species.SANDYGAST,
Species.PALOSSAND,
+ Species.MINIOR,
Species.NECROZMA,
Species.RILLABOOM,
Species.DREDNAW,
@@ -51968,6 +51986,7 @@ export const tmSpecies: TmSpecies = {
Species.BEHEEYEM,
Species.CRYOGONAL,
Species.DRUDDIGON,
+ Species.GOLETT,
Species.GOLURK,
Species.PAWNIARD,
Species.BISHARP,
@@ -52010,6 +52029,7 @@ export const tmSpecies: TmSpecies = {
Species.MELTAN,
Species.MELMETAL,
Species.CORVIKNIGHT,
+ Species.PERRSERKER,
Species.CUFANT,
Species.COPPERAJAH,
Species.DURALUDON,
@@ -53199,6 +53219,8 @@ export const tmSpecies: TmSpecies = {
Species.NUMEL,
Species.CAMERUPT,
Species.TORKOAL,
+ Species.TRAPINCH,
+ Species.VIBRAVA,
Species.FLYGON,
Species.LUNATONE,
Species.SOLROCK,
@@ -53442,6 +53464,9 @@ export const tmSpecies: TmSpecies = {
Species.NUMEL,
Species.CAMERUPT,
Species.TORKOAL,
+ Species.TRAPINCH,
+ Species.VIBRAVA,
+ Species.FLYGON,
Species.LUNATONE,
Species.SOLROCK,
Species.BARBOACH,
@@ -53524,6 +53549,7 @@ export const tmSpecies: TmSpecies = {
Species.HYDREIGON,
Species.COBALION,
Species.TERRAKION,
+ Species.ZEKROM,
Species.LANDORUS,
Species.BINACLE,
Species.BARBARACLE,
@@ -54570,6 +54596,7 @@ export const tmSpecies: TmSpecies = {
Species.SLOWBRO,
Species.DROWZEE,
Species.HYPNO,
+ Species.EXEGGCUTE,
Species.EXEGGUTOR,
Species.STARMIE,
Species.MR_MIME,
@@ -54621,6 +54648,7 @@ export const tmSpecies: TmSpecies = {
Species.MESPRIT,
Species.AZELF,
Species.CRESSELIA,
+ Species.DARKRAI,
Species.ARCEUS,
Species.VICTINI,
Species.MUNNA,
@@ -54644,6 +54672,7 @@ export const tmSpecies: TmSpecies = {
Species.ESPURR,
Species.MEOWSTIC,
Species.AROMATISSE,
+ Species.INKAY,
Species.MALAMAR,
Species.SYLVEON,
Species.KLEFKI,
@@ -55061,6 +55090,7 @@ export const tmSpecies: TmSpecies = {
Species.NIDOQUEEN,
Species.NIDOKING,
Species.VILEPLUME,
+ Species.VENOMOTH,
Species.DUGTRIO,
Species.BELLSPROUT,
Species.WEEPINBELL,
@@ -55165,6 +55195,7 @@ export const tmSpecies: TmSpecies = {
Species.MAGNEMITE,
Species.MAGNETON,
Species.ONIX,
+ Species.RHYHORN,
Species.RHYDON,
Species.SNORLAX,
Species.MEW,
@@ -55197,6 +55228,7 @@ export const tmSpecies: TmSpecies = {
Species.TURTWIG,
Species.GROTLE,
Species.TORTERRA,
+ Species.RAMPARDOS,
Species.SHIELDON,
Species.BASTIODON,
Species.BRONZOR,
@@ -55212,6 +55244,8 @@ export const tmSpecies: TmSpecies = {
Species.REGIGIGAS,
Species.ARCEUS,
Species.TEPIG,
+ Species.PIGNITE,
+ Species.EMBOAR,
Species.ROGGENROLA,
Species.BOLDORE,
Species.GIGALITH,
@@ -55222,6 +55256,7 @@ export const tmSpecies: TmSpecies = {
Species.BEARTIC,
Species.GOLETT,
Species.GOLURK,
+ Species.COBALION,
Species.CARBINK,
Species.AVALUGG,
Species.VOLCANION,
@@ -55303,6 +55338,7 @@ export const tmSpecies: TmSpecies = {
Species.FLAAFFY,
Species.AMPHAROS,
Species.ELEKID,
+ Species.RAIKOU,
Species.ELECTRIKE,
Species.MANECTRIC,
Species.PLUSLE,
@@ -55314,6 +55350,8 @@ export const tmSpecies: TmSpecies = {
Species.MAGNEZONE,
Species.ELECTIVIRE,
Species.ROTOM,
+ Species.BLITZLE,
+ Species.ZEBSTRIKA,
Species.EMOLGA,
Species.JOLTIK,
Species.GALVANTULA,
@@ -59685,6 +59723,7 @@ export const tmSpecies: TmSpecies = {
Species.NIDORINO,
Species.NIDOKING,
Species.RAPIDASH,
+ Species.DODRIO,
Species.SEEL,
Species.DEWGONG,
Species.CLOYSTER,
@@ -59699,6 +59738,7 @@ export const tmSpecies: TmSpecies = {
Species.FORRETRESS,
Species.DUNSPARCE,
Species.STEELIX,
+ Species.SKARMORY,
Species.DELIBIRD,
Species.HITMONTOP,
Species.BALTOY,
@@ -60552,6 +60592,7 @@ export const tmSpecies: TmSpecies = {
Species.ARCANINE,
Species.PONYTA,
Species.RAPIDASH,
+ Species.DEWGONG,
Species.MEW,
Species.CYNDAQUIL,
Species.QUILAVA,
@@ -60582,6 +60623,8 @@ export const tmSpecies: TmSpecies = {
Species.SKITTY,
Species.DELCATTY,
Species.MAWILE,
+ Species.PLUSLE,
+ Species.MINUN,
Species.VOLBEAT,
Species.ILLUMISE,
Species.SWABLU,
@@ -60603,6 +60646,7 @@ export const tmSpecies: TmSpecies = {
Species.UXIE,
Species.MESPRIT,
Species.AZELF,
+ Species.SHAYMIN,
Species.LILLIPUP,
Species.HERDIER,
Species.STOUTLAND,
@@ -66276,8 +66320,13 @@ export const tmSpecies: TmSpecies = {
Species.BLOODMOON_URSALUNA,
],
[Moves.ICE_SPINNER]: [
+ Species.SQUIRTLE,
+ Species.WARTORTLE,
+ Species.BLASTOISE,
Species.JIGGLYPUFF,
Species.WIGGLYTUFF,
+ Species.SEEL,
+ Species.DEWGONG,
Species.SHELLDER,
Species.CLOYSTER,
Species.ARTICUNO,
@@ -66290,9 +66339,12 @@ export const tmSpecies: TmSpecies = {
Species.DUNSPARCE,
Species.DELIBIRD,
Species.DONPHAN,
+ Species.HITMONTOP,
Species.LUDICOLO,
Species.SNORUNT,
Species.GLALIE,
+ Species.REGICE,
+ Species.REGISTEEL,
Species.PIPLUP,
Species.PRINPLUP,
Species.EMPOLEON,
@@ -66304,10 +66356,14 @@ export const tmSpecies: TmSpecies = {
Species.ABOMASNOW,
Species.WEAVILE,
Species.FROSLASS,
+ Species.CINCCINO,
Species.CRYOGONAL,
Species.MIENSHAO,
Species.BERGMITE,
Species.AVALUGG,
+ Species.POPPLIO,
+ Species.BRIONNE,
+ Species.PRIMARINA,
Species.CRABOMINABLE,
Species.MAREANIE,
Species.TOXAPEX,
@@ -66845,6 +66901,9 @@ export const tmSpecies: TmSpecies = {
Species.BLOODMOON_URSALUNA,
],
[Moves.CHILLING_WATER]: [
+ Species.SQUIRTLE,
+ Species.WARTORTLE,
+ Species.BLASTOISE,
Species.CLEFAIRY,
Species.CLEFABLE,
Species.JIGGLYPUFF,
@@ -66856,12 +66915,19 @@ export const tmSpecies: TmSpecies = {
Species.POLIWAG,
Species.POLIWHIRL,
Species.POLIWRATH,
+ Species.TENTACOOL,
+ Species.TENTACRUEL,
Species.SLOWPOKE,
Species.SLOWBRO,
+ Species.SEEL,
+ Species.DEWGONG,
Species.SHELLDER,
Species.CLOYSTER,
Species.CHANSEY,
+ Species.HORSEA,
+ Species.SEADRA,
Species.GYARADOS,
+ Species.LAPRAS,
Species.VAPOREON,
Species.SNORLAX,
Species.DRATINI,
@@ -66869,8 +66935,13 @@ export const tmSpecies: TmSpecies = {
Species.DRAGONITE,
Species.MEWTWO,
Species.MEW,
+ Species.TOTODILE,
+ Species.CROCONAW,
+ Species.FERALIGATR,
Species.SENTRET,
Species.FURRET,
+ Species.CHINCHOU,
+ Species.LANTURN,
Species.CLEFFA,
Species.MARILL,
Species.AZUMARILL,
@@ -66882,7 +66953,13 @@ export const tmSpecies: TmSpecies = {
Species.DUNSPARCE,
Species.QWILFISH,
Species.DELIBIRD,
+ Species.KINGDRA,
Species.BLISSEY,
+ Species.SUICUNE,
+ Species.LUGIA,
+ Species.MUDKIP,
+ Species.MARSHTOMP,
+ Species.SWAMPERT,
Species.LOTAD,
Species.LOMBRE,
Species.LUDICOLO,
@@ -66908,6 +66985,8 @@ export const tmSpecies: TmSpecies = {
Species.MILOTIC,
Species.SNORUNT,
Species.GLALIE,
+ Species.LATIAS,
+ Species.LATIOS,
Species.KYOGRE,
Species.PIPLUP,
Species.PRINPLUP,
@@ -66933,6 +67012,8 @@ export const tmSpecies: TmSpecies = {
"",
"origin",
],
+ Species.PHIONE,
+ Species.MANAPHY,
Species.ARCEUS,
Species.OSHAWOTT,
Species.DEWOTT,
@@ -66943,6 +67024,8 @@ export const tmSpecies: TmSpecies = {
"blue-striped",
"white-striped",
],
+ Species.MINCCINO,
+ Species.CINCCINO,
Species.DUCKLETT,
Species.SWANNA,
Species.ALOMOMOLA,
@@ -66950,6 +67033,7 @@ export const tmSpecies: TmSpecies = {
Species.BEARTIC,
Species.CRYOGONAL,
Species.TORNADUS,
+ Species.KELDEO,
Species.FROAKIE,
Species.FROGADIER,
[
@@ -66970,12 +67054,17 @@ export const tmSpecies: TmSpecies = {
Species.GOODRA,
Species.BERGMITE,
Species.AVALUGG,
+ Species.POPPLIO,
+ Species.BRIONNE,
+ Species.PRIMARINA,
Species.YUNGOOS,
Species.GUMSHOOS,
Species.CRABRAWLER,
Species.CRABOMINABLE,
Species.MAREANIE,
Species.TOXAPEX,
+ Species.DEWPIDER,
+ Species.ARAQUANID,
Species.ORANGURU,
Species.PASSIMIAN,
Species.SANDYGAST,
diff --git a/src/data/trainer-config.ts b/src/data/trainer-config.ts
index d48e384d30e..a6cf4247f27 100644
--- a/src/data/trainer-config.ts
+++ b/src/data/trainer-config.ts
@@ -1,2037 +1,2037 @@
-import BattleScene, {startingWave} from "../battle-scene";
-import {ModifierTypeFunc, modifierTypes} from "../modifier/modifier-type";
-import {EnemyPokemon} from "../field/pokemon";
-import * as Utils from "../utils";
-import {PokeballType} from "./pokeball";
-import {pokemonEvolutions, pokemonPrevolutions} from "./pokemon-evolutions";
-import PokemonSpecies, {getPokemonSpecies, PokemonSpeciesFilter} from "./pokemon-species";
-import {tmSpecies} from "./tms";
-import {Type} from "./type";
-import {doubleBattleDialogue} from "./dialogue";
-import {PersistentModifier} from "../modifier/modifier";
-import {TrainerVariant} from "../field/trainer";
-import {getIsInitialized, initI18n} from "#app/plugins/i18n";
-import i18next from "i18next";
-import {Moves} from "#enums/moves";
-import {PartyMemberStrength} from "#enums/party-member-strength";
-import {Species} from "#enums/species";
-import {TrainerType} from "#enums/trainer-type";
-import {Gender} from "./gender";
-
-export enum TrainerPoolTier {
- COMMON,
- UNCOMMON,
- RARE,
- SUPER_RARE,
- ULTRA_RARE
-}
-
-export interface TrainerTierPools {
- [key: integer]: Species[]
-}
-
-export enum TrainerSlot {
- NONE,
- TRAINER,
- TRAINER_PARTNER
-}
-
-export class TrainerPartyTemplate {
- public size: integer;
- public strength: PartyMemberStrength;
- public sameSpecies: boolean;
- public balanced: boolean;
-
- constructor(size: integer, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) {
- this.size = size;
- this.strength = strength;
- this.sameSpecies = !!sameSpecies;
- this.balanced = !!balanced;
- }
-
- getStrength(index: integer): PartyMemberStrength {
- return this.strength;
- }
-
- isSameSpecies(index: integer): boolean {
- return this.sameSpecies;
- }
-
- isBalanced(index: integer): boolean {
- return this.balanced;
- }
-}
-
-export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate {
- public templates: TrainerPartyTemplate[];
-
- constructor(...templates: TrainerPartyTemplate[]) {
- super(templates.reduce((total: integer, template: TrainerPartyTemplate) => {
- total += template.size;
- return total;
- }, 0), PartyMemberStrength.AVERAGE);
- this.templates = templates;
- }
-
- getStrength(index: integer): PartyMemberStrength {
- let t = 0;
- for (const template of this.templates) {
- if (t + template.size > index) {
- return template.getStrength(index - t);
- }
- t += template.size;
- }
-
- return super.getStrength(index);
- }
-
- isSameSpecies(index: integer): boolean {
- let t = 0;
- for (const template of this.templates) {
- if (t + template.size > index) {
- return template.isSameSpecies(index - t);
- }
- t += template.size;
- }
-
- return super.isSameSpecies(index);
- }
-
- isBalanced(index: integer): boolean {
- let t = 0;
- for (const template of this.templates) {
- if (t + template.size > index) {
- return template.isBalanced(index - t);
- }
- t += template.size;
- }
-
- return super.isBalanced(index);
- }
-}
-
-export const trainerPartyTemplates = {
- ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE),
- ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG),
- ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER),
- TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER),
- TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK),
- TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
- TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
- TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)),
- TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE),
- TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
- TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)),
- TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG),
- THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK),
- THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true),
- THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE),
- THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true),
- THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true),
- FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER),
- FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true),
- FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK),
- FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true),
- FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true),
- FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER),
- FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK),
- FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true),
- SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER),
- SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true),
- SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true),
- SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true),
-
- GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
- GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
- GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
- GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
-
- ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
-
- CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), new TrainerPartyTemplate(5, PartyMemberStrength.STRONG, false, true)),
-
- RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
- RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
- RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
- RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
- RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
- RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER))
-};
-
-type PartyTemplateFunc = (scene: BattleScene) => TrainerPartyTemplate;
-type PartyMemberFunc = (scene: BattleScene, level: integer, strength: PartyMemberStrength) => EnemyPokemon;
-type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[];
-
-export interface PartyMemberFuncs {
- [key: integer]: PartyMemberFunc
-}
-
-export class TrainerConfig {
- public trainerType: TrainerType;
- public trainerTypeDouble: TrainerType;
- public name: string;
- public nameFemale: string;
- public nameDouble: string;
- public title: string;
- public titleDouble: string;
- public hasGenders: boolean = false;
- public hasDouble: boolean = false;
- public hasCharSprite: boolean = false;
- public doubleOnly: boolean = false;
- public moneyMultiplier: number = 1;
- public isBoss: boolean = false;
- public hasStaticParty: boolean = false;
- public useSameSeedForAllMembers: boolean = false;
- public mixedBattleBgm: string;
- public battleBgm: string;
- public encounterBgm: string;
- public femaleEncounterBgm: string;
- public doubleEncounterBgm: string;
- public victoryBgm: string;
- public genModifiersFunc: GenModifiersFunc;
- public modifierRewardFuncs: ModifierTypeFunc[] = [];
- public partyTemplates: TrainerPartyTemplate[];
- public partyTemplateFunc: PartyTemplateFunc;
- public partyMemberFuncs: PartyMemberFuncs = {};
- public speciesPools: TrainerTierPools;
- public speciesFilter: PokemonSpeciesFilter;
- public specialtyTypes: Type[] = [];
- public hasVoucher: boolean = false;
-
- public encounterMessages: string[] = [];
- public victoryMessages: string[] = [];
- public defeatMessages: string[] = [];
-
- public femaleEncounterMessages: string[];
- public femaleVictoryMessages: string[];
- public femaleDefeatMessages: string[];
-
- public doubleEncounterMessages: string[];
- public doubleVictoryMessages: string[];
- public doubleDefeatMessages: string[];
-
- constructor(trainerType: TrainerType, allowLegendaries?: boolean) {
- this.trainerType = trainerType;
- this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]);
- this.battleBgm = "battle_trainer";
- this.mixedBattleBgm = "battle_trainer";
- this.victoryBgm = "victory_trainer";
- this.partyTemplates = [trainerPartyTemplates.TWO_AVG];
- this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden();
- }
-
- getKey(): string {
- return TrainerType[this.getDerivedType()].toString().toLowerCase();
- }
-
- getSpriteKey(female?: boolean, isDouble: boolean = false): string {
- let ret = this.getKey();
- if (this.hasGenders) {
- ret += `_${female ? "f" : "m"}`;
- }
- // If a special double trainer class was set, set it as the sprite key
- if (this.trainerTypeDouble && female && isDouble) {
- // Get the derived type for the double trainer since the sprite key is based on the derived type
- ret = TrainerType[this.getDerivedType(this.trainerTypeDouble)].toString().toLowerCase();
- }
- return ret;
- }
-
- setName(name: string): TrainerConfig {
- if (name === "Finn") {
- // Give the rival a localized name
- // First check if i18n is initialized
- if (!getIsInitialized()) {
- initI18n();
- }
- // This is only the male name, because the female name is handled in a different function (setHasGenders)
- if (name === "Finn") {
- name = i18next.t("trainerNames:rival");
- }
- }
- this.name = name;
- return this;
- }
-
- /**
- * Sets if a boss trainer will have a voucher or not.
- * @param hasVoucher - If the boss trainer will have a voucher.
- */
- setHasVoucher(hasVoucher: boolean): void {
- this.hasVoucher = hasVoucher;
- }
-
- setTitle(title: string): TrainerConfig {
- // First check if i18n is initialized
- if (!getIsInitialized()) {
- initI18n();
- }
-
- // Make the title lowercase and replace spaces with underscores
- title = title.toLowerCase().replace(/\s/g, "_");
-
- // Get the title from the i18n file
- this.title = i18next.t(`titles:${title}`);
-
-
- return this;
- }
-
-
- /**
- * Returns the derived trainer type for a given trainer type.
- * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.)
- * @returns {TrainerType} - The derived trainer type.
- */
- 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.MARNIE_ELITE:
- trainerType = TrainerType.MARNIE;
- break;
- case TrainerType.NESSA_ELITE:
- trainerType = TrainerType.NESSA;
- break;
- case TrainerType.BEA_ELITE:
- trainerType = TrainerType.BEA;
- break;
- case TrainerType.ALLISTER_ELITE:
- trainerType = TrainerType.ALLISTER;
- break;
- case TrainerType.RAIHAN_ELITE:
- trainerType = TrainerType.RAIHAN;
- break;
- }
-
- return trainerType;
- }
-
- /**
- * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM).
- * @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned.
- * @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string.
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- **/
- setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig {
- // If the female name is 'Ivy' (the rival), assign a localized name.
- if (nameFemale === "Ivy") {
- // Check if the internationalization (i18n) system is initialized.
- if (!getIsInitialized()) {
- // Initialize the i18n system if it is not already initialized.
- initI18n();
- }
- // Set the localized name for the female rival.
- this.nameFemale = i18next.t("trainerNames:rival_female");
- } else {
- // Otherwise, assign the provided female name.
- this.nameFemale = nameFemale!; // TODO: is this bang correct?
- }
-
- // Indicate that this trainer configuration includes genders.
- this.hasGenders = true;
-
- // If a female encounter BGM is provided.
- if (femaleEncounterBgm) {
- // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase.
- // Otherwise, assign the provided string as the BGM.
- this.femaleEncounterBgm = typeof femaleEncounterBgm === "number"
- ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase()
- : femaleEncounterBgm;
- }
-
- // Return the updated TrainerConfig instance.
- return this;
- }
-
- /**
- * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM.
- * @param nameDouble - The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles).
- * @param doubleEncounterBgm - The encounter BGM for the double trainer, which can be a TrainerType or a string.
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- */
- setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig {
- this.hasDouble = true;
- this.nameDouble = nameDouble;
- if (doubleEncounterBgm) {
- this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() : doubleEncounterBgm;
- }
- return this;
- }
-
- /**
- * Sets the trainer type for double battles.
- * @param trainerTypeDouble - The TrainerType of the partner in a double battle.
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- */
- setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig {
- this.trainerTypeDouble = trainerTypeDouble;
- this.setDoubleMessages(this.nameDouble);
- return this;
- }
-
- /**
- * Sets the encounter and victory messages for double trainers.
- * @param nameDouble - The name of the pair (e.g. "red_blue_double").
- */
- setDoubleMessages(nameDouble: string) {
- // Check if there is double battle dialogue for this trainer
- if (doubleBattleDialogue[nameDouble]) {
- // Set encounter and victory messages for double trainers
- this.doubleEncounterMessages = doubleBattleDialogue[nameDouble].encounter;
- this.doubleVictoryMessages = doubleBattleDialogue[nameDouble].victory;
- this.doubleDefeatMessages = doubleBattleDialogue[nameDouble].defeat;
- }
- }
-
- /**
- * Sets the title for double trainers
- * @param titleDouble - the key for the title in the i18n file. (e.g., "champion_double").
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- */
- setDoubleTitle(titleDouble: string): TrainerConfig {
- // First check if i18n is initialized
- if (!getIsInitialized()) {
- initI18n();
- }
-
- // Make the title lowercase and replace spaces with underscores
- titleDouble = titleDouble.toLowerCase().replace(/\s/g, "_");
-
- // Get the title from the i18n file
- this.titleDouble = i18next.t(`titles:${titleDouble}`);
-
- return this;
- }
-
- setHasCharSprite(): TrainerConfig {
- this.hasCharSprite = true;
- return this;
- }
-
- setDoubleOnly(): TrainerConfig {
- this.doubleOnly = true;
- return this;
- }
-
- setMoneyMultiplier(moneyMultiplier: number): TrainerConfig {
- this.moneyMultiplier = moneyMultiplier;
- return this;
- }
-
- setBoss(): TrainerConfig {
- this.isBoss = true;
- return this;
- }
-
- setStaticParty(): TrainerConfig {
- this.hasStaticParty = true;
- return this;
- }
-
- setUseSameSeedForAllMembers(): TrainerConfig {
- this.useSameSeedForAllMembers = true;
- return this;
- }
-
- setMixedBattleBgm(mixedBattleBgm: string): TrainerConfig {
- this.mixedBattleBgm = mixedBattleBgm;
- return this;
- }
-
- setBattleBgm(battleBgm: string): TrainerConfig {
- this.battleBgm = battleBgm;
- return this;
- }
-
- setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig {
- this.encounterBgm = typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm;
- return this;
- }
-
- setVictoryBgm(victoryBgm: string): TrainerConfig {
- this.victoryBgm = victoryBgm;
- return this;
- }
-
- setPartyTemplates(...partyTemplates: TrainerPartyTemplate[]): TrainerConfig {
- this.partyTemplates = partyTemplates;
- return this;
- }
-
- setPartyTemplateFunc(partyTemplateFunc: PartyTemplateFunc): TrainerConfig {
- this.partyTemplateFunc = partyTemplateFunc;
- return this;
- }
-
- setPartyMemberFunc(slotIndex: integer, partyMemberFunc: PartyMemberFunc): TrainerConfig {
- this.partyMemberFuncs[slotIndex] = partyMemberFunc;
- return this;
- }
-
- setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig {
- this.speciesPools = (Array.isArray(speciesPools) ? {[TrainerPoolTier.COMMON]: speciesPools} : speciesPools) as unknown as TrainerTierPools;
- return this;
- }
-
- setSpeciesFilter(speciesFilter: PokemonSpeciesFilter, allowLegendaries?: boolean): TrainerConfig {
- const baseFilter = this.speciesFilter;
- this.speciesFilter = allowLegendaries ? speciesFilter : species => speciesFilter(species) && baseFilter(species);
- return this;
- }
-
- setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig {
- this.specialtyTypes = specialtyTypes;
- return this;
- }
-
- setGenModifiersFunc(genModifiersFunc: GenModifiersFunc): TrainerConfig {
- this.genModifiersFunc = genModifiersFunc;
- return this;
- }
-
- setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig {
- this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => {
- const modifierTypeFunc = func();
- const modifierType = modifierTypeFunc();
- modifierType.withIdFromFunc(modifierTypeFunc);
- return modifierType;
- });
- return this;
- }
-
- /**
- * Returns the pool of species for an evil team admin
- * @param team - The evil team the admin belongs to.
- * @returns {TrainerTierPools}
- */
- speciesPoolPerEvilTeamAdmin(team): TrainerTierPools {
- team = team.toLowerCase();
- switch (team) {
- case "rocket": {
- return {
- [TrainerPoolTier.COMMON]: [Species.RATTATA, Species.KOFFING, Species.EKANS, Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
- [TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
- [TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR]
- };
- }
- case "magma": {
- return {
- [TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
- [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR],
- [TrainerPoolTier.RARE]: [Species.CAPSAKID, Species.CHARCADET]
- };
- }
- case "aqua": {
- return {
- [TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.CORPHISH, Species.ZIGZAGOON, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
- [TrainerPoolTier.UNCOMMON]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
- [TrainerPoolTier.RARE]: [Species.DONDOZO]
- };
- }
- case "galactic": {
- return {
- [TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
- [TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
- [TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
- };
- }
- case "plasma": {
- return {
- [TrainerPoolTier.COMMON]: [Species.SCRAFTY, Species.LILLIPUP, Species.PURRLOIN, Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
- [TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
- [TrainerPoolTier.RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
- };
- }
- case "flare": {
- return {
- [TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
- [TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
- [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON]
- };
- }
- case "aether": {
- return {
- [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU],
- [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWKING, Species.MEDITITE, Species.BELDUM, Species.ORANGURU, Species.HATTERENE, Species.INKAY, Species.RALTS],
- [TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.GIRAFARIG, Species.PORYGON]
- };
- }
- case "skull": {
- return {
- [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.LURANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING],
- [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWBRO, Species.SKORUPI, Species.PALDEA_WOOPER, Species.NIDORAN_F, Species.CROAGUNK, Species.MANDIBUZZ],
- [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.HISUI_SNEASEL]
- };
- }
- case "macro": {
- return {
- [TrainerPoolTier.COMMON]: [ Species.HATTERENE, Species.MILOTIC, Species.TSAREENA, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS],
- [TrainerPoolTier.UNCOMMON]: [Species.MANDIBUZZ, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.SINISTEA, Species.APPLIN],
- [TrainerPoolTier.RARE]: [Species.TINKATINK, Species.HISUI_LILLIGANT]
- };
- }
- }
-
- console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`);
- return [];
- }
-
- /**
- * Initializes the trainer configuration for an evil team admin.
- * @param title - The title of the evil team admin.
- * @param poolName - The evil team the admin belongs to.
- * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader.
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- * **/
- initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[],): TrainerConfig {
- if (!getIsInitialized()) {
- initI18n();
- }
- this.setPartyTemplates(trainerPartyTemplates.RIVAL_5);
-
- // Set the species pools for the evil team admin.
- this.speciesPools = this.speciesPoolPerEvilTeamAdmin(poolName);
-
- signatureSpecies.forEach((speciesPool, s) => {
- if (!Array.isArray(speciesPool)) {
- speciesPool = [speciesPool];
- }
- this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
- });
-
- const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
- this.name = i18next.t(`trainerNames:${nameForCall}`);
- this.setHasVoucher(false);
- this.setTitle(title);
- this.setMoneyMultiplier(1.5);
- this.setBoss();
- this.setStaticParty();
- this.setBattleBgm("battle_plasma_boss");
- this.setVictoryBgm("victory_team_plasma");
-
- return this;
- }
-
- /**
- * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though.
- * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader.
- * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader.
- * @param boolean whether or not this is the rematch fight
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- * **/
- initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig {
- if (!getIsInitialized()) {
- initI18n();
- }
- if (rematch) {
- this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR);
- } else {
- this.setPartyTemplates(trainerPartyTemplates.RIVAL_5);
- }
- signatureSpecies.forEach((speciesPool, s) => {
- if (!Array.isArray(speciesPool)) {
- speciesPool = [speciesPool];
- }
- this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
- });
- if (specialtyTypes.length) {
- this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined);
- this.setSpecialtyTypes(...specialtyTypes);
- }
- const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
- this.name = i18next.t(`trainerNames:${nameForCall}`);
- this.setTitle(title);
- this.setMoneyMultiplier(2.5);
- this.setBoss();
- this.setStaticParty();
- this.setHasVoucher(true);
- this.setBattleBgm("battle_plasma_boss");
- this.setVictoryBgm("victory_team_plasma");
-
- return this;
- }
-
- /**
- * Initializes the trainer configuration for a Gym Leader.
- * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader.
- * @param {Type[]} specialtyTypes - The specialty types for the Gym Leader.
- * @param isMale - Whether the Gym Leader is Male or Not (for localization of the title).
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- * **/
- initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig {
- // Check if the internationalization (i18n) system is initialized.
- if (!getIsInitialized()) {
- initI18n();
- }
-
- // Set the function to generate the Gym Leader's party template.
- this.setPartyTemplateFunc(getGymLeaderPartyTemplate);
-
- // Set up party members with their corresponding species.
- signatureSpecies.forEach((speciesPool, s) => {
- // Ensure speciesPool is an array.
- if (!Array.isArray(speciesPool)) {
- speciesPool = [speciesPool];
- }
- // Set a function to get a random party member from the species pool.
- this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
- });
-
- // If specialty types are provided, set species filter and specialty types.
- if (specialtyTypes.length) {
- this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined);
- this.setSpecialtyTypes(...specialtyTypes);
- }
-
- // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
- const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
- this.name = i18next.t(`trainerNames:${nameForCall}`);
-
- // Set the title to "gym_leader". (this is the key in the i18n file)
- this.setTitle("gym_leader");
- if (!isMale) {
- this.setTitle("gym_leader_female");
- }
-
- // Configure various properties for the Gym Leader.
- this.setMoneyMultiplier(2.5);
- this.setBoss();
- this.setStaticParty();
- this.setHasVoucher(true);
- this.setBattleBgm("battle_unova_gym");
- this.setVictoryBgm("victory_gym");
- this.setGenModifiersFunc(party => {
- const waveIndex = party[0].scene.currentBattle.waveIndex;
- return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : undefined);
- });
-
- return this;
- }
-
- /**
- * Initializes the trainer configuration for an Elite Four member.
- * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member.
- * @param {Type[]} specialtyTypes - The specialty types for the Elite Four member.
- * @param isMale - Whether the Elite Four Member is Male or Female (for localization of the title).
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- **/
- initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig {
- // Check if the internationalization (i18n) system is initialized.
- if (!getIsInitialized()) {
- initI18n();
- }
-
- // Set the party templates for the Elite Four.
- this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR);
-
- // Set up party members with their corresponding species.
- signatureSpecies.forEach((speciesPool, s) => {
- // Ensure speciesPool is an array.
- if (!Array.isArray(speciesPool)) {
- speciesPool = [speciesPool];
- }
- // Set a function to get a random party member from the species pool.
- this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
- });
-
- // Set species filter and specialty types if provided, otherwise filter by base total.
- if (specialtyTypes.length) {
- this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= 450);
- this.setSpecialtyTypes(...specialtyTypes);
- } else {
- this.setSpeciesFilter(p => p.baseTotal >= 450);
- }
-
- // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
- const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
- this.name = i18next.t(`trainerNames:${nameForCall}`);
-
- // Set the title to "elite_four". (this is the key in the i18n file)
- this.setTitle("elite_four");
- if (!isMale) {
- this.setTitle("elite_four_female");
- }
-
- // Configure various properties for the Elite Four member.
- this.setMoneyMultiplier(3.25);
- this.setBoss();
- this.setStaticParty();
- this.setHasVoucher(true);
- this.setBattleBgm("battle_unova_elite");
- this.setVictoryBgm("victory_gym");
- this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : undefined));
-
- return this;
- }
-
- /**
- * Initializes the trainer configuration for a Champion.
- * @param {Species | Species[]} signatureSpecies - The signature species for the Champion.
- * @param isMale - Whether the Champion is Male or Female (for localization of the title).
- * @returns {TrainerConfig} - The updated TrainerConfig instance.
- **/
- initForChampion(signatureSpecies: (Species | Species[])[], isMale: boolean): TrainerConfig {
- // Check if the internationalization (i18n) system is initialized.
- if (!getIsInitialized()) {
- initI18n();
- }
-
- // Set the party templates for the Champion.
- this.setPartyTemplates(trainerPartyTemplates.CHAMPION);
-
- // Set up party members with their corresponding species.
- signatureSpecies.forEach((speciesPool, s) => {
- // Ensure speciesPool is an array.
- if (!Array.isArray(speciesPool)) {
- speciesPool = [speciesPool];
- }
- // Set a function to get a random party member from the species pool.
- this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
- });
-
- // Set species filter to only include species with a base total of 470 or higher.
- this.setSpeciesFilter(p => p.baseTotal >= 470);
-
- // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
- const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
- this.name = i18next.t(`trainerNames:${nameForCall}`);
-
- // Set the title to "champion". (this is the key in the i18n file)
- this.setTitle("champion");
- if (!isMale) {
- this.setTitle("champion_female");
- }
-
-
- // Configure various properties for the Champion.
- this.setMoneyMultiplier(10);
- this.setBoss();
- this.setStaticParty();
- this.setHasVoucher(true);
- this.setBattleBgm("battle_champion_alder");
- this.setVictoryBgm("victory_champion");
- this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3));
-
- return this;
- }
-
- /**
- * Retrieves the title for the trainer based on the provided trainer slot and variant.
- * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
- * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title.
- * @returns {string} - The title of the trainer.
- **/
- getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string {
- const ret = this.name;
-
- // Check if the variant is double and the name for double exists
- if (!trainerSlot && variant === TrainerVariant.DOUBLE && this.nameDouble) {
- return this.nameDouble;
- }
-
- // Female variant
- if (this.hasGenders) {
- // If the name is already set
- if (this.nameFemale) {
- // Check if the variant is either female or this is for the partner in a double battle
- if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) {
- return this.nameFemale;
- }
- } else
- // Check if !variant is true, if so return the name, else return the name with _female appended
- if (variant) {
- if (!getIsInitialized()) {
- initI18n();
- }
- // Check if the female version exists in the i18n file
- if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) {
- // If it does, return
- return ret + "_female";
- } else {
- // If it doesn't, we do not do anything and go to the normal return
- // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization
- }
- }
- }
-
- return ret;
- }
-
- loadAssets(scene: BattleScene, variant: TrainerVariant): Promise {
- return new Promise(resolve => {
- const isDouble = variant === TrainerVariant.DOUBLE;
- const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE, false);
- const partnerTrainerKey = this.getSpriteKey(true, true);
- scene.loadAtlas(trainerKey, "trainer");
- if (isDouble) {
- scene.loadAtlas(partnerTrainerKey, "trainer");
- }
- scene.load.once(Phaser.Loader.Events.COMPLETE, () => {
- const originalWarn = console.warn;
- // Ignore warnings for missing frames, because there will be a lot
- console.warn = () => {
- };
- const frameNames = scene.anims.generateFrameNames(trainerKey, {
- zeroPad: 4,
- suffix: ".png",
- start: 1,
- end: 128
- });
- const partnerFrameNames = isDouble
- ? scene.anims.generateFrameNames(partnerTrainerKey, {
- zeroPad: 4,
- suffix: ".png",
- start: 1,
- end: 128
- })
- : "";
- console.warn = originalWarn;
- if (!(scene.anims.exists(trainerKey))) {
- scene.anims.create({
- key: trainerKey,
- frames: frameNames,
- frameRate: 24,
- repeat: -1
- });
- }
- if (isDouble && !(scene.anims.exists(partnerTrainerKey))) {
- scene.anims.create({
- key: partnerTrainerKey,
- frames: partnerFrameNames,
- frameRate: 24,
- repeat: -1
- });
- }
- resolve();
- });
- if (!scene.load.isLoading()) {
- scene.load.start();
- }
- });
- }
-}
-
-let t = 0;
-
-interface TrainerConfigs {
- [key: integer]: TrainerConfig
-}
-
-/**
- * The function to get variable strength grunts
- * @param scene the singleton scene being passed in
- * @returns the correct TrainerPartyTemplate
- */
-function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate {
- const waveIndex = scene.currentBattle?.waveIndex;
- if (waveIndex < 40) {
- return trainerPartyTemplates.TWO_AVG;
- } else if (waveIndex < 63) {
- return trainerPartyTemplates.THREE_AVG;
- } else if (waveIndex < 65) {
- return trainerPartyTemplates.TWO_AVG_ONE_STRONG;
- } else if (waveIndex < 112) {
- return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger
- } else {
- return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger
- }
-}
-
-function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) {
- return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)];
-}
-
-function getGymLeaderPartyTemplate(scene: BattleScene) {
- return getWavePartyTemplate(scene, trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5);
-}
-
-function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
- return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
- let species = Utils.randSeedItem(speciesPool);
- if (!ignoreEvolution) {
- species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
- }
- return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess);
- };
-}
-
-function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, postProcess?: (EnemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
- const originalSpeciesFilter = speciesFilter;
- speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species);
- return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
- const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess);
- return ret;
- };
-}
-
-function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] {
- const ret: PersistentModifier[] = [];
- const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i);
- for (let t = 0; t < Math.min(count, party.length); t++) {
- const randomIndex = Utils.randSeedItem(partyMemberIndexes);
- partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1);
- ret.push(modifierTypes.TERA_SHARD().generateType([], [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct?
- }
- return ret;
-}
-
-type SignatureSpecies = {
- [key in string]: (Species | Species[])[];
-};
-
-/*
- * The signature species for each Gym Leader, Elite Four member, and Champion.
- * The key is the trainer type, and the value is an array of Species or Species arrays.
- * This is in a separate const so it can be accessed from other places and not just the trainerConfigs
- */
-export const signatureSpecies: SignatureSpecies = {
- BROCK: [Species.GEODUDE, Species.ONIX],
- MISTY: [Species.STARYU, Species.PSYDUCK],
- LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ],
- ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP],
- JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT],
- SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON],
- BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR],
- GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F],
- FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO],
- BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR],
- WHITNEY: [Species.GIRAFARIG, Species.MILTANK],
- MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE],
- CHUCK: [Species.POLIWRATH, Species.MANKEY],
- JASMINE: [Species.MAGNEMITE, Species.STEELIX],
- PRYCE: [Species.SEEL, Species.SWINUB],
- CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS],
- ROXANNE: [Species.GEODUDE, Species.NOSEPASS],
- BRAWLY: [Species.MACHOP, Species.MAKUHITA],
- WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE],
- FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL],
- NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN],
- WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY],
- TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE],
- LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR],
- JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH],
- ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE],
- GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG],
- MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR],
- CRASHER_WAKE: [Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP],
- FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB],
- BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON],
- CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT],
- VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM],
- CILAN: [Species.PANSAGE, Species.COTTONEE, Species.PETILIL],
- CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR],
- CRESS: [Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE],
- CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PATRAT],
- LENORA: [Species.KANGASKHAN, Species.DEERLING, Species.AUDINO],
- ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI],
- BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST],
- ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK],
- CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT],
- SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET],
- BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO],
- DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO],
- MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA],
- VIOLA: [Species.SURSKIT, Species.SCATTERBUG],
- GRANT: [Species.AMAURA, Species.TYRUNT],
- KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO],
- RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT],
- CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA],
- VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME],
- OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING],
- WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL],
- MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET],
- NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD],
- KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL],
- BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS],
- ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY],
- OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING],
- BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR],
- GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE],
- MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME],
- PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY],
- MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO],
- RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY],
- KATY: [Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS],
- BRASSIUS: [Species.SMOLIV, Species.SHROOMISH, Species.ODDISH],
- IONO: [Species.TADBULB, Species.WATTREL, Species.VOLTORB],
- KOFU: [Species.VELUZA, Species.WIGLETT, Species.WINGULL],
- LARRY: [Species.STARLY, Species.DUNSPARCE, Species.KOMALA],
- RYME: [Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU],
- TULIP: [Species.GIRAFARIG, Species.FLITTLE, Species.RALTS],
- GRUSHA: [Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO],
- LORELEI: [Species.JYNX, [Species.SLOWBRO, Species.GALAR_SLOWBRO], Species.LAPRAS, [Species.ALOLA_SANDSLASH, Species.CLOYSTER]],
- BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.ALOLA_GOLEM, Species.GOLEM]],
- AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK],
- LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR],
- WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR],
- KOGA: [[Species.WEEZING, Species.MUK], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL],
- KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE],
- SIDNEY: [[Species.SHIFTRY, Species.CACTURNE], [Species.SHARPEDO, Species.CRAWDAUNT], Species.ABSOL, Species.MIGHTYENA],
- PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.MISMAGIUS, Species.DRIFBLIM]],
- GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW],
- DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA],
- AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION],
- BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR],
- FLINT: [[Species.FLAREON, Species.RAPIDASH], Species.MAGMORTAR, [Species.STEELIX, Species.LOPUNNY], Species.INFERNAPE],
- LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]],
- SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT],
- MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK],
- GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE],
- CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS],
- MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME],
- SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE],
- WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH],
- DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN],
- HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]],
- MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO],
- OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC],
- ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND],
- KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON],
- MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL],
- NESSA_ELITE: [Species.GOLISOPOD, [Species.PELIPPER, Species.QUAGSIRE], Species.TOXAPEX, Species.DREDNAW],
- BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP],
- ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR],
- RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON],
- RIKA: [Species.WHISCASH, [Species.DONPHAN, Species.DUGTRIO], Species.CAMERUPT, Species.CLODSIRE],
- POPPY: [Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON],
- LARRY_ELITE: [Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS],
- HASSEL: [Species.NOIVERN, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.BAXCALIBUR],
- CRISPIN: [Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN],
- AMARYS: [Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS],
- LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.ALCREMIE, Species.GRANBULL], Species.WHIMSICOTT],
- DRAYTON: [Species.DRAGONITE, Species.ARCHALUDON, Species.HAXORUS, Species.SCEPTILE],
- BLUE: [[Species.GYARADOS, Species.EXEGGUTOR, Species.ARCANINE], Species.HO_OH, [Species.RHYPERIOR, Species.MAGNEZONE]], // Alakazam lead, Mega Pidgeot
- RED: [Species.LUGIA, Species.SNORLAX, [Species.ESPEON, Species.UMBREON, Species.SYLVEON]], // GMax Pikachu lead, Mega gen 1 starter
- LANCE_CHAMPION: [Species.DRAGONITE, Species.KINGDRA, Species.ALOLA_EXEGGUTOR], // Aerodactyl lead, Mega Latias/Latios
- STEVEN: [Species.AGGRON, [Species.ARMALDO, Species.CRADILY], Species.DIALGA], // Skarmory lead, Mega Metagross
- WALLACE: [Species.MILOTIC, Species.PALKIA, Species.LUDICOLO], // Pelipper lead, Mega Swampert
- CYNTHIA: [Species.GIRATINA, Species.LUCARIO, Species.TOGEKISS], // Spiritomb lead, Mega Garchomp
- ALDER: [Species.VOLCARONA, Species.ZEKROM, [Species.ACCELGOR, Species.ESCAVALIER], Species.KELDEO], // Bouffalant/Braviary lead
- IRIS: [Species.HAXORUS, Species.RESHIRAM, Species.ARCHEOPS], // Druddigon lead, Gmax Lapras
- DIANTHA: [Species.HAWLUCHA, Species.XERNEAS, Species.GOODRA], // Gourgeist lead, Mega Gardevoir
- HAU: [[Species.SOLGALEO, Species.LUNALA], Species.NOIVERN, [Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA], [Species.TAPU_BULU, Species.TAPU_FINI, Species.TAPU_KOKO, Species.TAPU_LELE]], // Alola Raichu lead
- LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.AEGISLASH], // Rillaboom/Cinderace/Inteleon lead, GMax Charizard
- GEETA: [Species.MIRAIDON, [Species.ESPATHRA, Species.VELUZA], [Species.AVALUGG, Species.HISUI_AVALUGG], Species.KINGAMBIT], // Glimmora lead
- NEMONA: [Species.KORAIDON, Species.PAWMOT, [Species.DUDUNSPARCE, Species.ORTHWORM], [Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL]], // Lycanroc lead
- KIERAN: [[Species.GRIMMSNARL, Species.INCINEROAR, Species.PORYGON_Z], Species.OGERPON, Species.TERAPAGOS, Species.HYDRAPPLE], // Poliwrath/Politoed lead
-};
-
-export const trainerConfigs: TrainerConfigs = {
- [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(),
- [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER)
- .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)),
- [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG)
- .setSpeciesPools([Species.SMEARGLE]),
- [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER)
- .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO],
- [TrainerPoolTier.UNCOMMON]: [Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY],
- [TrainerPoolTier.RARE]: [Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP],
- [TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA]
- }),
- [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)),
- [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY),
- [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)),
- [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR],
- [TrainerPoolTier.UNCOMMON]: [Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER],
- [TrainerPoolTier.RARE]: [Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS],
- [TrainerPoolTier.SUPER_RARE]: [Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O],
- [TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU]
- }),
- [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders")
- .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER))
- .setSpeciesFilter(s => s.baseTotal < 450),
- [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO],
- [TrainerPoolTier.UNCOMMON]: [Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO],
- [TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE]
- }),
- [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND],
- [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL],
- [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA],
- [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY]
- }),
- [TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW],
- [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS,],
- [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO],
- [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO]
- }),
- [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK),
- [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK)
- .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)),
- [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK)
- .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)),
- [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA],
- [TrainerPoolTier.UNCOMMON]: [Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY],
- [TrainerPoolTier.RARE]: [Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA],
- [TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO]
- }),
- [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)),
- [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1),
- [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER)
- .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI],
- [TrainerPoolTier.UNCOMMON]: [Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL],
- [TrainerPoolTier.RARE]: [Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER],
- [TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR]
- }),
- [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)),
- [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.JANITOR]: new TrainerConfig(++t).setMoneyMultiplier(1.1).setEncounterBgm(TrainerType.CLERK),
- [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH),
- [TrainerType.MUSICIAN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)),
- [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC)
- .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG)
- .setSpeciesFilter(s => s.isOfType(Type.GHOST)),
- [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"),
- [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK)
- .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH],
- [TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF],
- [TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU],
- [TrainerPoolTier.SUPER_RARE]: [],
- [TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU]
- }),
- [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)),
- [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1),
- [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN)
- .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME),
- [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers")
- .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV],
- [TrainerPoolTier.UNCOMMON]: [Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL],
- [TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS],
- [TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK],
- }),
- [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC)
- .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA],
- [TrainerPoolTier.UNCOMMON]: [Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU],
- [TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC],
- [TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER],
- }),
- [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers")
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER],
- [TrainerPoolTier.UNCOMMON]: [Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL],
- [TrainerPoolTier.RARE]: [Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO],
- [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA],
- }),
- [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"),
- [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH),
- [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)),
- [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(Type.WATER) || s.isOfType(Type.FIGHTING)),
- [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING],
- [TrainerPoolTier.UNCOMMON]: [Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE],
- [TrainerPoolTier.RARE]: [Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING],
- [TrainerPoolTier.SUPER_RARE]: [Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT],
- [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN]
- }),
- [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)),
- [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
- [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids")
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING],
- [TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE],
- [TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA],
- [TrainerPoolTier.SUPER_RARE]: [Species.TADBULB]
- }),
- [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)),
- [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers()
- .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG))
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE], TrainerSlot.TRAINER_PARTNER))
- .setEncounterBgm(TrainerType.TWINS),
- [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)),
- [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK)
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO],
- [TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE],
- [TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST]
- }),
- [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)),
- [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER)
- .setSpeciesPools(
- [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP]
- ),
- [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH],
- [TrainerPoolTier.UNCOMMON]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
- [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
- [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR]
- }),
- [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.HOUNDOOM]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.ARIANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin_female", "rocket", [Species.ARBOK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.PROTON]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.CROBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.WEEZING]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
- [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
- [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR],
- [TrainerPoolTier.SUPER_RARE]: [Species.CAPSAKID, Species.CHARCADET]
- }),
- [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL],
- [TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
- [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
- [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO]
- }),
- [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY],
- [TrainerPoolTier.UNCOMMON]: [Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
- [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
- [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
- }),
- [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH],
- [TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
- [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
- [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
- }),
- [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK],
- [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
- [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
- [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON]
- }),
- [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.BOUNSWEET, Species.LILLIPUP, Species.ALOLA_MAROWAK],
- [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ALOLA_EXEGGUTOR, Species.CRABRAWLER, Species.CUTIEFLY, Species.ALOLA_RAICHU, Species.ORICORIO, Species.MUDBRAY],
- [TrainerPoolTier.RARE]: [ Species.ORANGURU, Species.PASSIMIAN, Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
- [TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
- }),
- [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
- [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.ALOLA_MAROWAK, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
- [TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.GASTLY, Species.WISHIWASHI],
- [TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
- }),
- [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
- [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
- .setSpeciesPools({
- [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED],
- [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU],
- [TrainerPoolTier.RARE]: [Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA],
- [TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY]
- }),
- [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
-
- [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, Type.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, Type.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, Type.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, Type.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, Type.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, Type.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, Type.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, Type.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, Type.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, Type.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, Type.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, Type.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, Type.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, Type.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, Type.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, Type.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, Type.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, Type.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, Type.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"),
- [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"),
- [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, Type.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
- [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, Type.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, Type.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, Type.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, Type.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, Type.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, Type.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, Type.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, Type.GRASS).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, Type.FIRE).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, Type.POISON).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, Type.BUG).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, Type.ELECTRIC).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, Type.GROUND).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, Type.FLYING).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, Type.ICE).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, Type.DRAGON).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"),
- [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, Type.BUG).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, Type.ROCK).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, Type.FIGHTING).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, Type.GRASS).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, Type.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, Type.FAIRY).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, Type.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, Type.ICE).setMixedBattleBgm("battle_kalos_gym"),
- [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, Type.GRASS).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, Type.WATER).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, Type.FIRE).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, Type.GHOST).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, Type.ROCK).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, Type.ICE).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"),
- [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC).setMixedBattleBgm("battle_paldea_gym"),
- [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE).setMixedBattleBgm("battle_paldea_gym"),
-
- [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, Type.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, Type.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
- [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, Type.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, Type.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, Type.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
- [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, Type.DARK).setMixedBattleBgm("battle_hoenn_elite"),
- [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, Type.GHOST).setMixedBattleBgm("battle_hoenn_elite"),
- [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, Type.ICE).setMixedBattleBgm("battle_hoenn_elite"),
- [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"),
- [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
- [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"),
- [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"),
- [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, Type.DARK).setMixedBattleBgm("battle_unova_elite"),
- [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, Type.PSYCHIC).setMixedBattleBgm("battle_unova_elite"),
- [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, Type.FIRE).setMixedBattleBgm("battle_kalos_elite"),
- [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, Type.WATER).setMixedBattleBgm("battle_kalos_elite"),
- [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, Type.STEEL).setMixedBattleBgm("battle_kalos_elite"),
- [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, Type.DRAGON).setMixedBattleBgm("battle_kalos_elite"),
- [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, Type.FIGHTING).setMixedBattleBgm("battle_alola_elite"),
- [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, Type.STEEL).setMixedBattleBgm("battle_alola_elite"),
- [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, Type.ROCK).setMixedBattleBgm("battle_alola_elite"),
- [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, Type.GHOST).setMixedBattleBgm("battle_alola_elite"),
- [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, Type.FLYING).setMixedBattleBgm("battle_alola_elite"),
- [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, Type.DARK).setMixedBattleBgm("battle_galar_elite"),
- [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, Type.WATER).setMixedBattleBgm("battle_galar_elite"),
- [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"),
- [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"),
- [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"),
- [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND).setMixedBattleBgm("battle_paldea_elite"),
- [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL).setMixedBattleBgm("battle_paldea_elite"),
- [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.NORMAL, Type.FLYING).setMixedBattleBgm("battle_paldea_elite"),
- [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON).setMixedBattleBgm("battle_paldea_elite"),
- [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE).setMixedBattleBgm("battle_bb_elite"),
- [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL).setMixedBattleBgm("battle_bb_elite"),
- [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY).setMixedBattleBgm("battle_bb_elite"),
- [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON).setMixedBattleBgm("battle_bb_elite"),
-
- [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"], true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALAKAZAM], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 8;
- p.generateAndPopulateMoveset();
- p.generateName();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
- p.abilityIndex = 1; // Drizzle
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.SWAMPERT], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"], false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SPIRITOMB], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"], true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"], false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRUDDIGON], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"], false).setMixedBattleBgm("battle_kalos_champion")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GOURGEIST], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 1;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"], true).setMixedBattleBgm("battle_alola_champion")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"], true).setMixedBattleBgm("battle_galar_champion")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.RILLABOOM, Species.CINDERACE, Species.INTELEON], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 3;
- p.generateAndPopulateMoveset();
- p.generateName();
- })),
- [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"], false).setMixedBattleBgm("battle_champion_geeta")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"], false).setMixedBattleBgm("battle_champion_nemona")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => {
- p.formIndex = 0; // Midday form
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"], true).setMixedBattleBgm("battle_champion_kieran")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.POLIWRATH, Species.POLITOED], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- })),
-
- [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)
- .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)
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
- [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3)
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
- .setSpeciesFilter(species => species.baseTotal >= 540),
- [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4)
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
- .setSpeciesFilter(species => species.baseTotal >= 540)
- .setGenModifiersFunc(party => {
- const starter = party[0];
- return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; // TODO: is the bang correct?
- }),
- [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5)
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
- p => p.setBoss(true, 2)))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
- .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
- .setSpeciesFilter(species => species.baseTotal >= 540)
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 3);
- p.pokeball = PokeballType.MASTER_BALL;
- p.shiny = true;
- p.variant = 1;
- }))
- .setGenModifiersFunc(party => {
- const starter = party[0];
- return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; //TODO: is the bang correct?
- }),
- [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6)
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
- p => {
- p.setBoss(true, 3);
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true,
- p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
- .setSpeciesFilter(species => species.baseTotal >= 540)
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
- p.setBoss();
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- p.shiny = true;
- p.variant = 1;
- p.formIndex = 1;
- p.generateName();
- }))
- .setGenModifiersFunc(party => {
- const starter = party[0];
- return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; // TODO: is the bang correct?
- }),
-
- [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PERSIAN, Species.ALOLA_PERSIAN]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.NIDOKING, Species.NIDOQUEEN]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.RHYPERIOR]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAROWAK, Species.ALOLA_MAROWAK]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- })),
- [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.TYRANITAR, Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HIPPOWDON]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.EXCADRILL]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MIGHTYENA]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CROBAT, Species.GLISCOR]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.WEEZING, Species.GALAR_WEEZING]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MAGMORTAR, Species.TORKOAL]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.FLYGON]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- })),
- [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SOLROCK, Species.TYPHLOSION], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TORKOAL, Species.NINETALES], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 2; // DROUGHT
- }))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SHIFTRY, Species.SCOVILLAIN], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 0; // Chlorophyll
- }))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GREAT_TUSK]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.GROUDON], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LINOONE]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CROBAT, Species.PELIPPER]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MUK, Species.ALOLA_MUK]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.TENTACRUEL]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.RELICANTH, Species.WAILORD]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- })),
- [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.EMPOLEON, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.POLITOED, Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 2; // Drizzle
- }))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.BEARTIC, Species.ARMALDO], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 2; // Swift Swim
- }))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 1; // Swift Swim
- }))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KYOGRE], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- })),
- [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", [], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AZELF, Species.UXIE, Species.MESPRIT], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ELECTRODE, Species.HISUI_ELECTRODE]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SALAMENCE, Species.ROARING_MOON]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.DARKRAI], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", []).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.COFAGRIGUS, Species.RUNERIGUS]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BOUFFALANT]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SEISMITOAD, Species.CARRACOSTA]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.EELEKTROSS, Species.GALVANTULA]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.VOLCARONA]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- })),
- [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- p.formIndex = Utils.randSeedInt(5);
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.gender = Gender.MALE;
- p.formIndex = 1;
- }))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KYUREM], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.gender = Gender.MALE;
- }))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CLAWITZER, Species.DRAGALGE ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK, Species.MALAMAR ]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- })),
- [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", [], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SCREAM_TAIL, Species.FLUTTER_MANE], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.gender = Gender.MALE;
- }))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.IRON_MOTH ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.ULTRA_BALL;
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.YVELTAL], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- }))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.STAKATAKA, Species.CELESTEELA, Species.GUZZLORD ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- }))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- })),
- [TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.abilityIndex = 2; //Anticipation
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => {
- p.abilityIndex = 2; //Sharpness, Adaptability
- }))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.formIndex = 1;
- p.generateName();
- }))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- })),
- [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.FERROTHORN, Species.ESCAVALIER ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ]))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PERRSERKER, Species.KLINKLANG ]))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.formIndex = 1;
- p.generateName();
- })),
- [TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
- .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- }))
- .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
- .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => {
- p.generateAndPopulateMoveset();
- p.abilityIndex = 1; //Strong Jaw, Hustle
- }))
- .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ]))
- .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.pokeball = PokeballType.MASTER_BALL;
- }))
- .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
- p.setBoss(true, 2);
- p.generateAndPopulateMoveset();
- p.formIndex = 1;
- p.generateName();
- })),
-};
+import BattleScene, {startingWave} from "../battle-scene";
+import {ModifierTypeFunc, modifierTypes} from "../modifier/modifier-type";
+import {EnemyPokemon} from "../field/pokemon";
+import * as Utils from "../utils";
+import {PokeballType} from "./pokeball";
+import {pokemonEvolutions, pokemonPrevolutions} from "./pokemon-evolutions";
+import PokemonSpecies, {getPokemonSpecies, PokemonSpeciesFilter} from "./pokemon-species";
+import {tmSpecies} from "./tms";
+import {Type} from "./type";
+import {doubleBattleDialogue} from "./dialogue";
+import {PersistentModifier} from "../modifier/modifier";
+import {TrainerVariant} from "../field/trainer";
+import {getIsInitialized, initI18n} from "#app/plugins/i18n";
+import i18next from "i18next";
+import {Moves} from "#enums/moves";
+import {PartyMemberStrength} from "#enums/party-member-strength";
+import {Species} from "#enums/species";
+import {TrainerType} from "#enums/trainer-type";
+import {Gender} from "./gender";
+
+export enum TrainerPoolTier {
+ COMMON,
+ UNCOMMON,
+ RARE,
+ SUPER_RARE,
+ ULTRA_RARE
+}
+
+export interface TrainerTierPools {
+ [key: integer]: Species[]
+}
+
+export enum TrainerSlot {
+ NONE,
+ TRAINER,
+ TRAINER_PARTNER
+}
+
+export class TrainerPartyTemplate {
+ public size: integer;
+ public strength: PartyMemberStrength;
+ public sameSpecies: boolean;
+ public balanced: boolean;
+
+ constructor(size: integer, strength: PartyMemberStrength, sameSpecies?: boolean, balanced?: boolean) {
+ this.size = size;
+ this.strength = strength;
+ this.sameSpecies = !!sameSpecies;
+ this.balanced = !!balanced;
+ }
+
+ getStrength(index: integer): PartyMemberStrength {
+ return this.strength;
+ }
+
+ isSameSpecies(index: integer): boolean {
+ return this.sameSpecies;
+ }
+
+ isBalanced(index: integer): boolean {
+ return this.balanced;
+ }
+}
+
+export class TrainerPartyCompoundTemplate extends TrainerPartyTemplate {
+ public templates: TrainerPartyTemplate[];
+
+ constructor(...templates: TrainerPartyTemplate[]) {
+ super(templates.reduce((total: integer, template: TrainerPartyTemplate) => {
+ total += template.size;
+ return total;
+ }, 0), PartyMemberStrength.AVERAGE);
+ this.templates = templates;
+ }
+
+ getStrength(index: integer): PartyMemberStrength {
+ let t = 0;
+ for (const template of this.templates) {
+ if (t + template.size > index) {
+ return template.getStrength(index - t);
+ }
+ t += template.size;
+ }
+
+ return super.getStrength(index);
+ }
+
+ isSameSpecies(index: integer): boolean {
+ let t = 0;
+ for (const template of this.templates) {
+ if (t + template.size > index) {
+ return template.isSameSpecies(index - t);
+ }
+ t += template.size;
+ }
+
+ return super.isSameSpecies(index);
+ }
+
+ isBalanced(index: integer): boolean {
+ let t = 0;
+ for (const template of this.templates) {
+ if (t + template.size > index) {
+ return template.isBalanced(index - t);
+ }
+ t += template.size;
+ }
+
+ return super.isBalanced(index);
+ }
+}
+
+export const trainerPartyTemplates = {
+ ONE_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ ONE_AVG: new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE),
+ ONE_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ ONE_STRONG: new TrainerPartyTemplate(1, PartyMemberStrength.STRONG),
+ ONE_STRONGER: new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER),
+ TWO_WEAKER: new TrainerPartyTemplate(2, PartyMemberStrength.WEAKER),
+ TWO_WEAK: new TrainerPartyTemplate(2, PartyMemberStrength.WEAK),
+ TWO_WEAK_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
+ TWO_WEAK_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
+ TWO_WEAK_SAME_TWO_WEAK_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true), new TrainerPartyTemplate(2, PartyMemberStrength.WEAK, true)),
+ TWO_WEAK_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.WEAK), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ TWO_AVG: new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE),
+ TWO_AVG_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ TWO_AVG_SAME_ONE_AVG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
+ TWO_AVG_SAME_ONE_STRONG: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ TWO_AVG_SAME_TWO_AVG_SAME: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, true)),
+ TWO_STRONG: new TrainerPartyTemplate(2, PartyMemberStrength.STRONG),
+ THREE_WEAK: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK),
+ THREE_WEAK_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, true),
+ THREE_AVG: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE),
+ THREE_AVG_SAME: new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, true),
+ THREE_WEAK_BALANCED: new TrainerPartyTemplate(3, PartyMemberStrength.WEAK, false, true),
+ FOUR_WEAKER: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER),
+ FOUR_WEAKER_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAKER, true),
+ FOUR_WEAK: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK),
+ FOUR_WEAK_SAME: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, true),
+ FOUR_WEAK_BALANCED: new TrainerPartyTemplate(4, PartyMemberStrength.WEAK, false, true),
+ FIVE_WEAKER: new TrainerPartyTemplate(5, PartyMemberStrength.WEAKER),
+ FIVE_WEAK: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK),
+ FIVE_WEAK_BALANCED: new TrainerPartyTemplate(5, PartyMemberStrength.WEAK, false, true),
+ SIX_WEAKER: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER),
+ SIX_WEAKER_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAKER, true),
+ SIX_WEAK_SAME: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, true),
+ SIX_WEAK_BALANCED: new TrainerPartyTemplate(6, PartyMemberStrength.WEAK, false, true),
+
+ GYM_LEADER_1: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ GYM_LEADER_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
+ GYM_LEADER_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
+ GYM_LEADER_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
+ GYM_LEADER_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
+
+ ELITE_FOUR: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER)),
+
+ CHAMPION: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER), new TrainerPartyTemplate(5, PartyMemberStrength.STRONG, false, true)),
+
+ RIVAL: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE)),
+ RIVAL_2: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
+ RIVAL_3: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
+ RIVAL_4: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(2, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.WEAK, false, true)),
+ RIVAL_5: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONG)),
+ RIVAL_6: new TrainerPartyCompoundTemplate(new TrainerPartyTemplate(1, PartyMemberStrength.STRONG), new TrainerPartyTemplate(1, PartyMemberStrength.AVERAGE), new TrainerPartyTemplate(3, PartyMemberStrength.AVERAGE, false, true), new TrainerPartyTemplate(1, PartyMemberStrength.STRONGER))
+};
+
+type PartyTemplateFunc = (scene: BattleScene) => TrainerPartyTemplate;
+type PartyMemberFunc = (scene: BattleScene, level: integer, strength: PartyMemberStrength) => EnemyPokemon;
+type GenModifiersFunc = (party: EnemyPokemon[]) => PersistentModifier[];
+
+export interface PartyMemberFuncs {
+ [key: integer]: PartyMemberFunc
+}
+
+export class TrainerConfig {
+ public trainerType: TrainerType;
+ public trainerTypeDouble: TrainerType;
+ public name: string;
+ public nameFemale: string;
+ public nameDouble: string;
+ public title: string;
+ public titleDouble: string;
+ public hasGenders: boolean = false;
+ public hasDouble: boolean = false;
+ public hasCharSprite: boolean = false;
+ public doubleOnly: boolean = false;
+ public moneyMultiplier: number = 1;
+ public isBoss: boolean = false;
+ public hasStaticParty: boolean = false;
+ public useSameSeedForAllMembers: boolean = false;
+ public mixedBattleBgm: string;
+ public battleBgm: string;
+ public encounterBgm: string;
+ public femaleEncounterBgm: string;
+ public doubleEncounterBgm: string;
+ public victoryBgm: string;
+ public genModifiersFunc: GenModifiersFunc;
+ public modifierRewardFuncs: ModifierTypeFunc[] = [];
+ public partyTemplates: TrainerPartyTemplate[];
+ public partyTemplateFunc: PartyTemplateFunc;
+ public partyMemberFuncs: PartyMemberFuncs = {};
+ public speciesPools: TrainerTierPools;
+ public speciesFilter: PokemonSpeciesFilter;
+ public specialtyTypes: Type[] = [];
+ public hasVoucher: boolean = false;
+
+ public encounterMessages: string[] = [];
+ public victoryMessages: string[] = [];
+ public defeatMessages: string[] = [];
+
+ public femaleEncounterMessages: string[];
+ public femaleVictoryMessages: string[];
+ public femaleDefeatMessages: string[];
+
+ public doubleEncounterMessages: string[];
+ public doubleVictoryMessages: string[];
+ public doubleDefeatMessages: string[];
+
+ constructor(trainerType: TrainerType, allowLegendaries?: boolean) {
+ this.trainerType = trainerType;
+ this.name = Utils.toReadableString(TrainerType[this.getDerivedType()]);
+ this.battleBgm = "battle_trainer";
+ this.mixedBattleBgm = "battle_trainer";
+ this.victoryBgm = "victory_trainer";
+ this.partyTemplates = [trainerPartyTemplates.TWO_AVG];
+ this.speciesFilter = species => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden();
+ }
+
+ getKey(): string {
+ return TrainerType[this.getDerivedType()].toString().toLowerCase();
+ }
+
+ getSpriteKey(female?: boolean, isDouble: boolean = false): string {
+ let ret = this.getKey();
+ if (this.hasGenders) {
+ ret += `_${female ? "f" : "m"}`;
+ }
+ // If a special double trainer class was set, set it as the sprite key
+ if (this.trainerTypeDouble && female && isDouble) {
+ // Get the derived type for the double trainer since the sprite key is based on the derived type
+ ret = TrainerType[this.getDerivedType(this.trainerTypeDouble)].toString().toLowerCase();
+ }
+ return ret;
+ }
+
+ setName(name: string): TrainerConfig {
+ if (name === "Finn") {
+ // Give the rival a localized name
+ // First check if i18n is initialized
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+ // This is only the male name, because the female name is handled in a different function (setHasGenders)
+ if (name === "Finn") {
+ name = i18next.t("trainerNames:rival");
+ }
+ }
+ this.name = name;
+ return this;
+ }
+
+ /**
+ * Sets if a boss trainer will have a voucher or not.
+ * @param hasVoucher - If the boss trainer will have a voucher.
+ */
+ setHasVoucher(hasVoucher: boolean): void {
+ this.hasVoucher = hasVoucher;
+ }
+
+ setTitle(title: string): TrainerConfig {
+ // First check if i18n is initialized
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+
+ // Make the title lowercase and replace spaces with underscores
+ title = title.toLowerCase().replace(/\s/g, "_");
+
+ // Get the title from the i18n file
+ this.title = i18next.t(`titles:${title}`);
+
+
+ return this;
+ }
+
+
+ /**
+ * Returns the derived trainer type for a given trainer type.
+ * @param trainerTypeToDeriveFrom - The trainer type to derive from. (If null, the this.trainerType property will be used.)
+ * @returns {TrainerType} - The derived trainer type.
+ */
+ 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.MARNIE_ELITE:
+ trainerType = TrainerType.MARNIE;
+ break;
+ case TrainerType.NESSA_ELITE:
+ trainerType = TrainerType.NESSA;
+ break;
+ case TrainerType.BEA_ELITE:
+ trainerType = TrainerType.BEA;
+ break;
+ case TrainerType.ALLISTER_ELITE:
+ trainerType = TrainerType.ALLISTER;
+ break;
+ case TrainerType.RAIHAN_ELITE:
+ trainerType = TrainerType.RAIHAN;
+ break;
+ }
+
+ return trainerType;
+ }
+
+ /**
+ * Sets the configuration for trainers with genders, including the female name and encounter background music (BGM).
+ * @param {string} [nameFemale] - The name of the female trainer. If 'Ivy', a localized name will be assigned.
+ * @param {TrainerType | string} [femaleEncounterBgm] - The encounter BGM for the female trainer, which can be a TrainerType or a string.
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ **/
+ setHasGenders(nameFemale?: string, femaleEncounterBgm?: TrainerType | string): TrainerConfig {
+ // If the female name is 'Ivy' (the rival), assign a localized name.
+ if (nameFemale === "Ivy") {
+ // Check if the internationalization (i18n) system is initialized.
+ if (!getIsInitialized()) {
+ // Initialize the i18n system if it is not already initialized.
+ initI18n();
+ }
+ // Set the localized name for the female rival.
+ this.nameFemale = i18next.t("trainerNames:rival_female");
+ } else {
+ // Otherwise, assign the provided female name.
+ this.nameFemale = nameFemale!; // TODO: is this bang correct?
+ }
+
+ // Indicate that this trainer configuration includes genders.
+ this.hasGenders = true;
+
+ // If a female encounter BGM is provided.
+ if (femaleEncounterBgm) {
+ // If the BGM is a TrainerType (number), convert it to a string, replace underscores with spaces, and convert to lowercase.
+ // Otherwise, assign the provided string as the BGM.
+ this.femaleEncounterBgm = typeof femaleEncounterBgm === "number"
+ ? TrainerType[femaleEncounterBgm].toString().replace(/_/g, " ").toLowerCase()
+ : femaleEncounterBgm;
+ }
+
+ // Return the updated TrainerConfig instance.
+ return this;
+ }
+
+ /**
+ * Sets the configuration for trainers with double battles, including the name of the double trainer and the encounter BGM.
+ * @param nameDouble - The name of the double trainer (e.g., "Ace Duo" for Trainer Class Doubles or "red_blue_double" for NAMED trainer doubles).
+ * @param doubleEncounterBgm - The encounter BGM for the double trainer, which can be a TrainerType or a string.
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ */
+ setHasDouble(nameDouble: string, doubleEncounterBgm?: TrainerType | string): TrainerConfig {
+ this.hasDouble = true;
+ this.nameDouble = nameDouble;
+ if (doubleEncounterBgm) {
+ this.doubleEncounterBgm = typeof doubleEncounterBgm === "number" ? TrainerType[doubleEncounterBgm].toString().replace(/\_/g, " ").toLowerCase() : doubleEncounterBgm;
+ }
+ return this;
+ }
+
+ /**
+ * Sets the trainer type for double battles.
+ * @param trainerTypeDouble - The TrainerType of the partner in a double battle.
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ */
+ setDoubleTrainerType(trainerTypeDouble: TrainerType): TrainerConfig {
+ this.trainerTypeDouble = trainerTypeDouble;
+ this.setDoubleMessages(this.nameDouble);
+ return this;
+ }
+
+ /**
+ * Sets the encounter and victory messages for double trainers.
+ * @param nameDouble - The name of the pair (e.g. "red_blue_double").
+ */
+ setDoubleMessages(nameDouble: string) {
+ // Check if there is double battle dialogue for this trainer
+ if (doubleBattleDialogue[nameDouble]) {
+ // Set encounter and victory messages for double trainers
+ this.doubleEncounterMessages = doubleBattleDialogue[nameDouble].encounter;
+ this.doubleVictoryMessages = doubleBattleDialogue[nameDouble].victory;
+ this.doubleDefeatMessages = doubleBattleDialogue[nameDouble].defeat;
+ }
+ }
+
+ /**
+ * Sets the title for double trainers
+ * @param titleDouble - the key for the title in the i18n file. (e.g., "champion_double").
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ */
+ setDoubleTitle(titleDouble: string): TrainerConfig {
+ // First check if i18n is initialized
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+
+ // Make the title lowercase and replace spaces with underscores
+ titleDouble = titleDouble.toLowerCase().replace(/\s/g, "_");
+
+ // Get the title from the i18n file
+ this.titleDouble = i18next.t(`titles:${titleDouble}`);
+
+ return this;
+ }
+
+ setHasCharSprite(): TrainerConfig {
+ this.hasCharSprite = true;
+ return this;
+ }
+
+ setDoubleOnly(): TrainerConfig {
+ this.doubleOnly = true;
+ return this;
+ }
+
+ setMoneyMultiplier(moneyMultiplier: number): TrainerConfig {
+ this.moneyMultiplier = moneyMultiplier;
+ return this;
+ }
+
+ setBoss(): TrainerConfig {
+ this.isBoss = true;
+ return this;
+ }
+
+ setStaticParty(): TrainerConfig {
+ this.hasStaticParty = true;
+ return this;
+ }
+
+ setUseSameSeedForAllMembers(): TrainerConfig {
+ this.useSameSeedForAllMembers = true;
+ return this;
+ }
+
+ setMixedBattleBgm(mixedBattleBgm: string): TrainerConfig {
+ this.mixedBattleBgm = mixedBattleBgm;
+ return this;
+ }
+
+ setBattleBgm(battleBgm: string): TrainerConfig {
+ this.battleBgm = battleBgm;
+ return this;
+ }
+
+ setEncounterBgm(encounterBgm: TrainerType | string): TrainerConfig {
+ this.encounterBgm = typeof encounterBgm === "number" ? TrainerType[encounterBgm].toString().toLowerCase() : encounterBgm;
+ return this;
+ }
+
+ setVictoryBgm(victoryBgm: string): TrainerConfig {
+ this.victoryBgm = victoryBgm;
+ return this;
+ }
+
+ setPartyTemplates(...partyTemplates: TrainerPartyTemplate[]): TrainerConfig {
+ this.partyTemplates = partyTemplates;
+ return this;
+ }
+
+ setPartyTemplateFunc(partyTemplateFunc: PartyTemplateFunc): TrainerConfig {
+ this.partyTemplateFunc = partyTemplateFunc;
+ return this;
+ }
+
+ setPartyMemberFunc(slotIndex: integer, partyMemberFunc: PartyMemberFunc): TrainerConfig {
+ this.partyMemberFuncs[slotIndex] = partyMemberFunc;
+ return this;
+ }
+
+ setSpeciesPools(speciesPools: TrainerTierPools | Species[]): TrainerConfig {
+ this.speciesPools = (Array.isArray(speciesPools) ? {[TrainerPoolTier.COMMON]: speciesPools} : speciesPools) as unknown as TrainerTierPools;
+ return this;
+ }
+
+ setSpeciesFilter(speciesFilter: PokemonSpeciesFilter, allowLegendaries?: boolean): TrainerConfig {
+ const baseFilter = this.speciesFilter;
+ this.speciesFilter = allowLegendaries ? speciesFilter : species => speciesFilter(species) && baseFilter(species);
+ return this;
+ }
+
+ setSpecialtyTypes(...specialtyTypes: Type[]): TrainerConfig {
+ this.specialtyTypes = specialtyTypes;
+ return this;
+ }
+
+ setGenModifiersFunc(genModifiersFunc: GenModifiersFunc): TrainerConfig {
+ this.genModifiersFunc = genModifiersFunc;
+ return this;
+ }
+
+ setModifierRewardFuncs(...modifierTypeFuncs: (() => ModifierTypeFunc)[]): TrainerConfig {
+ this.modifierRewardFuncs = modifierTypeFuncs.map(func => () => {
+ const modifierTypeFunc = func();
+ const modifierType = modifierTypeFunc();
+ modifierType.withIdFromFunc(modifierTypeFunc);
+ return modifierType;
+ });
+ return this;
+ }
+
+ /**
+ * Returns the pool of species for an evil team admin
+ * @param team - The evil team the admin belongs to.
+ * @returns {TrainerTierPools}
+ */
+ speciesPoolPerEvilTeamAdmin(team): TrainerTierPools {
+ team = team.toLowerCase();
+ switch (team) {
+ case "rocket": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.RATTATA, Species.KOFFING, Species.EKANS, Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
+ [TrainerPoolTier.UNCOMMON]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
+ [TrainerPoolTier.RARE]: [Species.DRATINI, Species.LARVITAR]
+ };
+ }
+ case "magma": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.NUMEL, Species.POOCHYENA, Species.SLUGMA, Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
+ [TrainerPoolTier.UNCOMMON]: [Species.TRAPINCH, Species.HEATMOR],
+ [TrainerPoolTier.RARE]: [Species.CAPSAKID, Species.CHARCADET]
+ };
+ }
+ case "aqua": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.CORPHISH, Species.ZIGZAGOON, Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
+ [TrainerPoolTier.UNCOMMON]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
+ [TrainerPoolTier.RARE]: [Species.DONDOZO]
+ };
+ }
+ case "galactic": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.BRONZOR, Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
+ [TrainerPoolTier.UNCOMMON]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
+ [TrainerPoolTier.RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
+ };
+ }
+ case "plasma": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.SCRAFTY, Species.LILLIPUP, Species.PURRLOIN, Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
+ [TrainerPoolTier.UNCOMMON]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
+ [TrainerPoolTier.RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
+ };
+ }
+ case "flare": {
+ return {
+ [TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.INKAY, Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
+ [TrainerPoolTier.UNCOMMON]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
+ [TrainerPoolTier.RARE]: [Species.NOIVERN, Species.DRUDDIGON]
+ };
+ }
+ case "aether": {
+ return {
+ [TrainerPoolTier.COMMON]: [ Species.BRUXISH, Species.SLOWPOKE, Species.BALTOY, Species.EXEGGCUTE, Species.ABRA, Species.ALOLA_RAICHU, Species.ELGYEM, Species.NATU],
+ [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWKING, Species.MEDITITE, Species.BELDUM, Species.ORANGURU, Species.HATTERENE, Species.INKAY, Species.RALTS],
+ [TrainerPoolTier.RARE]: [Species.ARMAROUGE, Species.GIRAFARIG, Species.PORYGON]
+ };
+ }
+ case "skull": {
+ return {
+ [TrainerPoolTier.COMMON]: [ Species.MAREANIE, Species.ALOLA_GRIMER, Species.GASTLY, Species.ZUBAT, Species.LURANTIS, Species.VENIPEDE, Species.BUDEW, Species.KOFFING],
+ [TrainerPoolTier.UNCOMMON]: [Species.GALAR_SLOWBRO, Species.SKORUPI, Species.PALDEA_WOOPER, Species.NIDORAN_F, Species.CROAGUNK, Species.MANDIBUZZ],
+ [TrainerPoolTier.RARE]: [Species.DRAGALGE, Species.HISUI_SNEASEL]
+ };
+ }
+ case "macro": {
+ return {
+ [TrainerPoolTier.COMMON]: [ Species.HATTERENE, Species.MILOTIC, Species.TSAREENA, Species.SALANDIT, Species.GALAR_PONYTA, Species.GOTHITA, Species.FROSLASS],
+ [TrainerPoolTier.UNCOMMON]: [Species.MANDIBUZZ, Species.MAREANIE, Species.ALOLA_VULPIX, Species.TOGEPI, Species.GALAR_CORSOLA, Species.SINISTEA, Species.APPLIN],
+ [TrainerPoolTier.RARE]: [Species.TINKATINK, Species.HISUI_LILLIGANT]
+ };
+ }
+ }
+
+ console.warn(`Evil team admin for ${team} not found. Returning empty species pools.`);
+ return [];
+ }
+
+ /**
+ * Initializes the trainer configuration for an evil team admin.
+ * @param title - The title of the evil team admin.
+ * @param poolName - The evil team the admin belongs to.
+ * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader.
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ * **/
+ initForEvilTeamAdmin(title: string, poolName: string, signatureSpecies: (Species | Species[])[],): TrainerConfig {
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+ this.setPartyTemplates(trainerPartyTemplates.RIVAL_5);
+
+ // Set the species pools for the evil team admin.
+ this.speciesPools = this.speciesPoolPerEvilTeamAdmin(poolName);
+
+ signatureSpecies.forEach((speciesPool, s) => {
+ if (!Array.isArray(speciesPool)) {
+ speciesPool = [speciesPool];
+ }
+ this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
+ });
+
+ const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
+ this.name = i18next.t(`trainerNames:${nameForCall}`);
+ this.setHasVoucher(false);
+ this.setTitle(title);
+ this.setMoneyMultiplier(1.5);
+ this.setBoss();
+ this.setStaticParty();
+ this.setBattleBgm("battle_plasma_boss");
+ this.setVictoryBgm("victory_team_plasma");
+
+ return this;
+ }
+
+ /**
+ * Initializes the trainer configuration for an evil team leader. Temporarily hardcoding evil leader teams though.
+ * @param {Species | Species[]} signatureSpecies - The signature species for the evil team leader.
+ * @param {Type[]} specialtyTypes - The specialty types for the evil team Leader.
+ * @param boolean whether or not this is the rematch fight
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ * **/
+ initForEvilTeamLeader(title: string, signatureSpecies: (Species | Species[])[], rematch: boolean = false, ...specialtyTypes: Type[]): TrainerConfig {
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+ if (rematch) {
+ this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR);
+ } else {
+ this.setPartyTemplates(trainerPartyTemplates.RIVAL_5);
+ }
+ signatureSpecies.forEach((speciesPool, s) => {
+ if (!Array.isArray(speciesPool)) {
+ speciesPool = [speciesPool];
+ }
+ this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
+ });
+ if (specialtyTypes.length) {
+ this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined);
+ this.setSpecialtyTypes(...specialtyTypes);
+ }
+ const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
+ this.name = i18next.t(`trainerNames:${nameForCall}`);
+ this.setTitle(title);
+ this.setMoneyMultiplier(2.5);
+ this.setBoss();
+ this.setStaticParty();
+ this.setHasVoucher(true);
+ this.setBattleBgm("battle_plasma_boss");
+ this.setVictoryBgm("victory_team_plasma");
+
+ return this;
+ }
+
+ /**
+ * Initializes the trainer configuration for a Gym Leader.
+ * @param {Species | Species[]} signatureSpecies - The signature species for the Gym Leader.
+ * @param {Type[]} specialtyTypes - The specialty types for the Gym Leader.
+ * @param isMale - Whether the Gym Leader is Male or Not (for localization of the title).
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ * **/
+ initForGymLeader(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig {
+ // Check if the internationalization (i18n) system is initialized.
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+
+ // Set the function to generate the Gym Leader's party template.
+ this.setPartyTemplateFunc(getGymLeaderPartyTemplate);
+
+ // Set up party members with their corresponding species.
+ signatureSpecies.forEach((speciesPool, s) => {
+ // Ensure speciesPool is an array.
+ if (!Array.isArray(speciesPool)) {
+ speciesPool = [speciesPool];
+ }
+ // Set a function to get a random party member from the species pool.
+ this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
+ });
+
+ // If specialty types are provided, set species filter and specialty types.
+ if (specialtyTypes.length) {
+ this.setSpeciesFilter(p => specialtyTypes.find(t => p.isOfType(t)) !== undefined);
+ this.setSpecialtyTypes(...specialtyTypes);
+ }
+
+ // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
+ const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
+ this.name = i18next.t(`trainerNames:${nameForCall}`);
+
+ // Set the title to "gym_leader". (this is the key in the i18n file)
+ this.setTitle("gym_leader");
+ if (!isMale) {
+ this.setTitle("gym_leader_female");
+ }
+
+ // Configure various properties for the Gym Leader.
+ this.setMoneyMultiplier(2.5);
+ this.setBoss();
+ this.setStaticParty();
+ this.setHasVoucher(true);
+ this.setBattleBgm("battle_unova_gym");
+ this.setVictoryBgm("victory_gym");
+ this.setGenModifiersFunc(party => {
+ const waveIndex = party[0].scene.currentBattle.waveIndex;
+ return getRandomTeraModifiers(party, waveIndex >= 100 ? 1 : 0, specialtyTypes.length ? specialtyTypes : undefined);
+ });
+
+ return this;
+ }
+
+ /**
+ * Initializes the trainer configuration for an Elite Four member.
+ * @param {Species | Species[]} signatureSpecies - The signature species for the Elite Four member.
+ * @param {Type[]} specialtyTypes - The specialty types for the Elite Four member.
+ * @param isMale - Whether the Elite Four Member is Male or Female (for localization of the title).
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ **/
+ initForEliteFour(signatureSpecies: (Species | Species[])[], isMale: boolean, ...specialtyTypes: Type[]): TrainerConfig {
+ // Check if the internationalization (i18n) system is initialized.
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+
+ // Set the party templates for the Elite Four.
+ this.setPartyTemplates(trainerPartyTemplates.ELITE_FOUR);
+
+ // Set up party members with their corresponding species.
+ signatureSpecies.forEach((speciesPool, s) => {
+ // Ensure speciesPool is an array.
+ if (!Array.isArray(speciesPool)) {
+ speciesPool = [speciesPool];
+ }
+ // Set a function to get a random party member from the species pool.
+ this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
+ });
+
+ // Set species filter and specialty types if provided, otherwise filter by base total.
+ if (specialtyTypes.length) {
+ this.setSpeciesFilter(p => specialtyTypes.some(t => p.isOfType(t)) && p.baseTotal >= 450);
+ this.setSpecialtyTypes(...specialtyTypes);
+ } else {
+ this.setSpeciesFilter(p => p.baseTotal >= 450);
+ }
+
+ // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
+ const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
+ this.name = i18next.t(`trainerNames:${nameForCall}`);
+
+ // Set the title to "elite_four". (this is the key in the i18n file)
+ this.setTitle("elite_four");
+ if (!isMale) {
+ this.setTitle("elite_four_female");
+ }
+
+ // Configure various properties for the Elite Four member.
+ this.setMoneyMultiplier(3.25);
+ this.setBoss();
+ this.setStaticParty();
+ this.setHasVoucher(true);
+ this.setBattleBgm("battle_unova_elite");
+ this.setVictoryBgm("victory_gym");
+ this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 2, specialtyTypes.length ? specialtyTypes : undefined));
+
+ return this;
+ }
+
+ /**
+ * Initializes the trainer configuration for a Champion.
+ * @param {Species | Species[]} signatureSpecies - The signature species for the Champion.
+ * @param isMale - Whether the Champion is Male or Female (for localization of the title).
+ * @returns {TrainerConfig} - The updated TrainerConfig instance.
+ **/
+ initForChampion(signatureSpecies: (Species | Species[])[], isMale: boolean): TrainerConfig {
+ // Check if the internationalization (i18n) system is initialized.
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+
+ // Set the party templates for the Champion.
+ this.setPartyTemplates(trainerPartyTemplates.CHAMPION);
+
+ // Set up party members with their corresponding species.
+ signatureSpecies.forEach((speciesPool, s) => {
+ // Ensure speciesPool is an array.
+ if (!Array.isArray(speciesPool)) {
+ speciesPool = [speciesPool];
+ }
+ // Set a function to get a random party member from the species pool.
+ this.setPartyMemberFunc(-(s + 1), getRandomPartyMemberFunc(speciesPool));
+ });
+
+ // Set species filter to only include species with a base total of 470 or higher.
+ this.setSpeciesFilter(p => p.baseTotal >= 470);
+
+ // Localize the trainer's name by converting it to lowercase and replacing spaces with underscores.
+ const nameForCall = this.name.toLowerCase().replace(/\s/g, "_");
+ this.name = i18next.t(`trainerNames:${nameForCall}`);
+
+ // Set the title to "champion". (this is the key in the i18n file)
+ this.setTitle("champion");
+ if (!isMale) {
+ this.setTitle("champion_female");
+ }
+
+
+ // Configure various properties for the Champion.
+ this.setMoneyMultiplier(10);
+ this.setBoss();
+ this.setStaticParty();
+ this.setHasVoucher(true);
+ this.setBattleBgm("battle_champion_alder");
+ this.setVictoryBgm("victory_champion");
+ this.setGenModifiersFunc(party => getRandomTeraModifiers(party, 3));
+
+ return this;
+ }
+
+ /**
+ * Retrieves the title for the trainer based on the provided trainer slot and variant.
+ * @param {TrainerSlot} trainerSlot - The slot to determine which title to use. Defaults to TrainerSlot.NONE.
+ * @param {TrainerVariant} variant - The variant of the trainer to determine the specific title.
+ * @returns {string} - The title of the trainer.
+ **/
+ getTitle(trainerSlot: TrainerSlot = TrainerSlot.NONE, variant: TrainerVariant): string {
+ const ret = this.name;
+
+ // Check if the variant is double and the name for double exists
+ if (!trainerSlot && variant === TrainerVariant.DOUBLE && this.nameDouble) {
+ return this.nameDouble;
+ }
+
+ // Female variant
+ if (this.hasGenders) {
+ // If the name is already set
+ if (this.nameFemale) {
+ // Check if the variant is either female or this is for the partner in a double battle
+ if (variant === TrainerVariant.FEMALE || (variant === TrainerVariant.DOUBLE && trainerSlot === TrainerSlot.TRAINER_PARTNER)) {
+ return this.nameFemale;
+ }
+ } else
+ // Check if !variant is true, if so return the name, else return the name with _female appended
+ if (variant) {
+ if (!getIsInitialized()) {
+ initI18n();
+ }
+ // Check if the female version exists in the i18n file
+ if (i18next.exists(`trainerClasses:${this.name.toLowerCase()}`)) {
+ // If it does, return
+ return ret + "_female";
+ } else {
+ // If it doesn't, we do not do anything and go to the normal return
+ // This is to prevent the game from displaying an error if a female version of the trainer does not exist in the localization
+ }
+ }
+ }
+
+ return ret;
+ }
+
+ loadAssets(scene: BattleScene, variant: TrainerVariant): Promise {
+ return new Promise(resolve => {
+ const isDouble = variant === TrainerVariant.DOUBLE;
+ const trainerKey = this.getSpriteKey(variant === TrainerVariant.FEMALE, false);
+ const partnerTrainerKey = this.getSpriteKey(true, true);
+ scene.loadAtlas(trainerKey, "trainer");
+ if (isDouble) {
+ scene.loadAtlas(partnerTrainerKey, "trainer");
+ }
+ scene.load.once(Phaser.Loader.Events.COMPLETE, () => {
+ const originalWarn = console.warn;
+ // Ignore warnings for missing frames, because there will be a lot
+ console.warn = () => {
+ };
+ const frameNames = scene.anims.generateFrameNames(trainerKey, {
+ zeroPad: 4,
+ suffix: ".png",
+ start: 1,
+ end: 128
+ });
+ const partnerFrameNames = isDouble
+ ? scene.anims.generateFrameNames(partnerTrainerKey, {
+ zeroPad: 4,
+ suffix: ".png",
+ start: 1,
+ end: 128
+ })
+ : "";
+ console.warn = originalWarn;
+ if (!(scene.anims.exists(trainerKey))) {
+ scene.anims.create({
+ key: trainerKey,
+ frames: frameNames,
+ frameRate: 24,
+ repeat: -1
+ });
+ }
+ if (isDouble && !(scene.anims.exists(partnerTrainerKey))) {
+ scene.anims.create({
+ key: partnerTrainerKey,
+ frames: partnerFrameNames,
+ frameRate: 24,
+ repeat: -1
+ });
+ }
+ resolve();
+ });
+ if (!scene.load.isLoading()) {
+ scene.load.start();
+ }
+ });
+ }
+}
+
+let t = 0;
+
+interface TrainerConfigs {
+ [key: integer]: TrainerConfig
+}
+
+/**
+ * The function to get variable strength grunts
+ * @param scene the singleton scene being passed in
+ * @returns the correct TrainerPartyTemplate
+ */
+function getEvilGruntPartyTemplate(scene: BattleScene): TrainerPartyTemplate {
+ const waveIndex = scene.currentBattle?.waveIndex;
+ if (waveIndex < 40) {
+ return trainerPartyTemplates.TWO_AVG;
+ } else if (waveIndex < 63) {
+ return trainerPartyTemplates.THREE_AVG;
+ } else if (waveIndex < 65) {
+ return trainerPartyTemplates.TWO_AVG_ONE_STRONG;
+ } else if (waveIndex < 112) {
+ return trainerPartyTemplates.GYM_LEADER_4; // 3avg 1 strong 1 stronger
+ } else {
+ return trainerPartyTemplates.GYM_LEADER_5; // 3 avg 2 strong 1 stronger
+ }
+}
+
+function getWavePartyTemplate(scene: BattleScene, ...templates: TrainerPartyTemplate[]) {
+ return templates[Math.min(Math.max(Math.ceil((scene.gameMode.getWaveForDifficulty(scene.currentBattle?.waveIndex || startingWave, true) - 20) / 30), 0), templates.length - 1)];
+}
+
+function getGymLeaderPartyTemplate(scene: BattleScene) {
+ return getWavePartyTemplate(scene, trainerPartyTemplates.GYM_LEADER_1, trainerPartyTemplates.GYM_LEADER_2, trainerPartyTemplates.GYM_LEADER_3, trainerPartyTemplates.GYM_LEADER_4, trainerPartyTemplates.GYM_LEADER_5);
+}
+
+function getRandomPartyMemberFunc(speciesPool: Species[], trainerSlot: TrainerSlot = TrainerSlot.TRAINER, ignoreEvolution: boolean = false, postProcess?: (enemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
+ return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
+ let species = Utils.randSeedItem(speciesPool);
+ if (!ignoreEvolution) {
+ species = getPokemonSpecies(species).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex);
+ }
+ return scene.addEnemyPokemon(getPokemonSpecies(species), level, trainerSlot, undefined, undefined, postProcess);
+ };
+}
+
+function getSpeciesFilterRandomPartyMemberFunc(speciesFilter: PokemonSpeciesFilter, trainerSlot: TrainerSlot = TrainerSlot.TRAINER, allowLegendaries?: boolean, postProcess?: (EnemyPokemon: EnemyPokemon) => void): PartyMemberFunc {
+ const originalSpeciesFilter = speciesFilter;
+ speciesFilter = (species: PokemonSpecies) => (allowLegendaries || (!species.legendary && !species.subLegendary && !species.mythical)) && !species.isTrainerForbidden() && originalSpeciesFilter(species);
+ return (scene: BattleScene, level: integer, strength: PartyMemberStrength) => {
+ const ret = scene.addEnemyPokemon(getPokemonSpecies(scene.randomSpecies(scene.currentBattle.waveIndex, level, false, speciesFilter).getTrainerSpeciesForLevel(level, true, strength, scene.currentBattle.waveIndex)), level, trainerSlot, undefined, undefined, postProcess);
+ return ret;
+ };
+}
+
+function getRandomTeraModifiers(party: EnemyPokemon[], count: integer, types?: Type[]): PersistentModifier[] {
+ const ret: PersistentModifier[] = [];
+ const partyMemberIndexes = new Array(party.length).fill(null).map((_, i) => i);
+ for (let t = 0; t < Math.min(count, party.length); t++) {
+ const randomIndex = Utils.randSeedItem(partyMemberIndexes);
+ partyMemberIndexes.splice(partyMemberIndexes.indexOf(randomIndex), 1);
+ ret.push(modifierTypes.TERA_SHARD().generateType([], [Utils.randSeedItem(types ? types : party[randomIndex].getTypes())])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(party[randomIndex]) as PersistentModifier); // TODO: is the bang correct?
+ }
+ return ret;
+}
+
+type SignatureSpecies = {
+ [key in string]: (Species | Species[])[];
+};
+
+/*
+ * The signature species for each Gym Leader, Elite Four member, and Champion.
+ * The key is the trainer type, and the value is an array of Species or Species arrays.
+ * This is in a separate const so it can be accessed from other places and not just the trainerConfigs
+ */
+export const signatureSpecies: SignatureSpecies = {
+ BROCK: [Species.GEODUDE, Species.ONIX],
+ MISTY: [Species.STARYU, Species.PSYDUCK],
+ LT_SURGE: [Species.VOLTORB, Species.PIKACHU, Species.ELECTABUZZ],
+ ERIKA: [Species.ODDISH, Species.BELLSPROUT, Species.TANGELA, Species.HOPPIP],
+ JANINE: [Species.VENONAT, Species.SPINARAK, Species.ZUBAT],
+ SABRINA: [Species.ABRA, Species.MR_MIME, Species.ESPEON],
+ BLAINE: [Species.GROWLITHE, Species.PONYTA, Species.MAGMAR],
+ GIOVANNI: [Species.SANDILE, Species.MURKROW, Species.NIDORAN_M, Species.NIDORAN_F],
+ FALKNER: [Species.PIDGEY, Species.HOOTHOOT, Species.DODUO],
+ BUGSY: [Species.SCYTHER, Species.HERACROSS, Species.SHUCKLE, Species.PINSIR],
+ WHITNEY: [Species.GIRAFARIG, Species.MILTANK],
+ MORTY: [Species.GASTLY, Species.MISDREAVUS, Species.SABLEYE],
+ CHUCK: [Species.POLIWRATH, Species.MANKEY],
+ JASMINE: [Species.MAGNEMITE, Species.STEELIX],
+ PRYCE: [Species.SEEL, Species.SWINUB],
+ CLAIR: [Species.DRATINI, Species.HORSEA, Species.GYARADOS],
+ ROXANNE: [Species.GEODUDE, Species.NOSEPASS],
+ BRAWLY: [Species.MACHOP, Species.MAKUHITA],
+ WATTSON: [Species.MAGNEMITE, Species.VOLTORB, Species.ELECTRIKE],
+ FLANNERY: [Species.SLUGMA, Species.TORKOAL, Species.NUMEL],
+ NORMAN: [Species.SLAKOTH, Species.SPINDA, Species.CHANSEY, Species.KANGASKHAN],
+ WINONA: [Species.SWABLU, Species.WINGULL, Species.TROPIUS, Species.SKARMORY],
+ TATE: [Species.SOLROCK, Species.NATU, Species.CHIMECHO, Species.GALLADE],
+ LIZA: [Species.LUNATONE, Species.SPOINK, Species.BALTOY, Species.GARDEVOIR],
+ JUAN: [Species.HORSEA, Species.BARBOACH, Species.SPHEAL, Species.RELICANTH],
+ ROARK: [Species.CRANIDOS, Species.LARVITAR, Species.GEODUDE],
+ GARDENIA: [Species.ROSELIA, Species.TANGELA, Species.TURTWIG],
+ MAYLENE: [Species.LUCARIO, Species.MEDITITE, Species.CHIMCHAR],
+ CRASHER_WAKE: [Species.BUIZEL, Species.MAGIKARP, Species.PIPLUP],
+ FANTINA: [Species.MISDREAVUS, Species.DRIFLOON, Species.SPIRITOMB],
+ BYRON: [Species.SHIELDON, Species.BRONZOR, Species.AGGRON],
+ CANDICE: [Species.SNEASEL, Species.SNOVER, Species.SNORUNT],
+ VOLKNER: [Species.SHINX, Species.CHINCHOU, Species.ROTOM],
+ CILAN: [Species.PANSAGE, Species.COTTONEE, Species.PETILIL],
+ CHILI: [Species.PANSEAR, Species.DARUMAKA, Species.HEATMOR],
+ CRESS: [Species.PANPOUR, Species.BASCULIN, Species.TYMPOLE],
+ CHEREN: [Species.LILLIPUP, Species.MINCCINO, Species.PATRAT],
+ LENORA: [Species.KANGASKHAN, Species.DEERLING, Species.AUDINO],
+ ROXIE: [Species.VENIPEDE, Species.TRUBBISH, Species.SKORUPI],
+ BURGH: [Species.SEWADDLE, Species.SHELMET, Species.KARRABLAST],
+ ELESA: [Species.EMOLGA, Species.BLITZLE, Species.JOLTIK],
+ CLAY: [Species.DRILBUR, Species.SANDILE, Species.GOLETT],
+ SKYLA: [Species.DUCKLETT, Species.WOOBAT, Species.RUFFLET],
+ BRYCEN: [Species.CRYOGONAL, Species.VANILLITE, Species.CUBCHOO],
+ DRAYDEN: [Species.DRUDDIGON, Species.AXEW, Species.DEINO],
+ MARLON: [Species.WAILMER, Species.FRILLISH, Species.TIRTOUGA],
+ VIOLA: [Species.SURSKIT, Species.SCATTERBUG],
+ GRANT: [Species.AMAURA, Species.TYRUNT],
+ KORRINA: [Species.HAWLUCHA, Species.LUCARIO, Species.MIENFOO],
+ RAMOS: [Species.SKIDDO, Species.HOPPIP, Species.BELLSPROUT],
+ CLEMONT: [Species.HELIOPTILE, Species.MAGNEMITE, Species.EMOLGA],
+ VALERIE: [Species.SYLVEON, Species.MAWILE, Species.MR_MIME],
+ OLYMPIA: [Species.ESPURR, Species.SIGILYPH, Species.SLOWKING],
+ WULFRIC: [Species.BERGMITE, Species.SNOVER, Species.CRYOGONAL],
+ MILO: [Species.GOSSIFLEUR, Species.APPLIN, Species.BOUNSWEET],
+ NESSA: [Species.CHEWTLE, Species.ARROKUDA, Species.WIMPOD],
+ KABU: [Species.SIZZLIPEDE, Species.VULPIX, Species.TORKOAL],
+ BEA: [Species.GALAR_FARFETCHD, Species.MACHOP, Species.CLOBBOPUS],
+ ALLISTER: [Species.GALAR_YAMASK, Species.GALAR_CORSOLA, Species.GASTLY],
+ OPAL: [Species.MILCERY, Species.TOGETIC, Species.GALAR_WEEZING],
+ BEDE: [Species.HATENNA, Species.GALAR_PONYTA, Species.GARDEVOIR],
+ GORDIE: [Species.ROLYCOLY, Species.STONJOURNER, Species.BINACLE],
+ MELONY: [Species.SNOM, Species.GALAR_DARUMAKA, Species.GALAR_MR_MIME],
+ PIERS: [Species.GALAR_ZIGZAGOON, Species.SCRAGGY, Species.INKAY],
+ MARNIE: [Species.IMPIDIMP, Species.PURRLOIN, Species.MORPEKO],
+ RAIHAN: [Species.DURALUDON, Species.TURTONATOR, Species.GOOMY],
+ KATY: [Species.NYMBLE, Species.TAROUNTULA, Species.HERACROSS],
+ BRASSIUS: [Species.SMOLIV, Species.SHROOMISH, Species.ODDISH],
+ IONO: [Species.TADBULB, Species.WATTREL, Species.VOLTORB],
+ KOFU: [Species.VELUZA, Species.WIGLETT, Species.WINGULL],
+ LARRY: [Species.STARLY, Species.DUNSPARCE, Species.KOMALA],
+ RYME: [Species.GREAVARD, Species.SHUPPET, Species.MIMIKYU],
+ TULIP: [Species.GIRAFARIG, Species.FLITTLE, Species.RALTS],
+ GRUSHA: [Species.CETODDLE, Species.ALOLA_VULPIX, Species.CUBCHOO],
+ LORELEI: [Species.JYNX, [Species.SLOWBRO, Species.GALAR_SLOWBRO], Species.LAPRAS, [Species.ALOLA_SANDSLASH, Species.CLOYSTER]],
+ BRUNO: [Species.MACHAMP, Species.HITMONCHAN, Species.HITMONLEE, [Species.ALOLA_GOLEM, Species.GOLEM]],
+ AGATHA: [Species.GENGAR, [Species.ARBOK, Species.WEEZING], Species.CROBAT, Species.ALOLA_MAROWAK],
+ LANCE: [Species.DRAGONITE, Species.GYARADOS, Species.AERODACTYL, Species.ALOLA_EXEGGUTOR],
+ WILL: [Species.XATU, Species.JYNX, [Species.SLOWBRO, Species.SLOWKING], Species.EXEGGUTOR],
+ KOGA: [[Species.WEEZING, Species.MUK], [Species.VENOMOTH, Species.ARIADOS], Species.CROBAT, Species.TENTACRUEL],
+ KAREN: [Species.UMBREON, Species.HONCHKROW, Species.HOUNDOOM, Species.WEAVILE],
+ SIDNEY: [[Species.SHIFTRY, Species.CACTURNE], [Species.SHARPEDO, Species.CRAWDAUNT], Species.ABSOL, Species.MIGHTYENA],
+ PHOEBE: [Species.SABLEYE, Species.DUSKNOIR, Species.BANETTE, [Species.MISMAGIUS, Species.DRIFBLIM]],
+ GLACIA: [Species.GLALIE, Species.WALREIN, Species.FROSLASS, Species.ABOMASNOW],
+ DRAKE: [Species.ALTARIA, Species.SALAMENCE, Species.FLYGON, Species.KINGDRA],
+ AARON: [[Species.SCIZOR, Species.KLEAVOR], Species.HERACROSS, [Species.VESPIQUEN, Species.YANMEGA], Species.DRAPION],
+ BERTHA: [Species.WHISCASH, Species.HIPPOWDON, Species.GLISCOR, Species.RHYPERIOR],
+ FLINT: [[Species.FLAREON, Species.RAPIDASH], Species.MAGMORTAR, [Species.STEELIX, Species.LOPUNNY], Species.INFERNAPE],
+ LUCIAN: [Species.MR_MIME, Species.GALLADE, Species.BRONZONG, [Species.ALAKAZAM, Species.ESPEON]],
+ SHAUNTAL: [Species.COFAGRIGUS, Species.CHANDELURE, Species.GOLURK, Species.JELLICENT],
+ MARSHAL: [Species.CONKELDURR, Species.MIENSHAO, Species.THROH, Species.SAWK],
+ GRIMSLEY: [Species.LIEPARD, Species.KINGAMBIT, Species.SCRAFTY, Species.KROOKODILE],
+ CAITLIN: [Species.MUSHARNA, Species.GOTHITELLE, Species.SIGILYPH, Species.REUNICLUS],
+ MALVA: [Species.PYROAR, Species.TORKOAL, Species.CHANDELURE, Species.TALONFLAME],
+ SIEBOLD: [Species.CLAWITZER, Species.GYARADOS, Species.BARBARACLE, Species.STARMIE],
+ WIKSTROM: [Species.KLEFKI, Species.PROBOPASS, Species.SCIZOR, Species.AEGISLASH],
+ DRASNA: [Species.DRAGALGE, Species.DRUDDIGON, Species.ALTARIA, Species.NOIVERN],
+ HALA: [Species.HARIYAMA, Species.BEWEAR, Species.CRABOMINABLE, [Species.POLIWRATH, Species.ANNIHILAPE]],
+ MOLAYNE: [Species.KLEFKI, Species.MAGNEZONE, Species.METAGROSS, Species.ALOLA_DUGTRIO],
+ OLIVIA: [Species.RELICANTH, Species.CARBINK, Species.ALOLA_GOLEM, Species.LYCANROC],
+ ACEROLA: [[Species.BANETTE, Species.DRIFBLIM], Species.MIMIKYU, Species.DHELMISE, Species.PALOSSAND],
+ KAHILI: [[Species.BRAVIARY, Species.MANDIBUZZ], Species.HAWLUCHA, Species.ORICORIO, Species.TOUCANNON],
+ MARNIE_ELITE: [Species.MORPEKO, Species.LIEPARD, [Species.TOXICROAK, Species.SCRAFTY], Species.GRIMMSNARL],
+ NESSA_ELITE: [Species.GOLISOPOD, [Species.PELIPPER, Species.QUAGSIRE], Species.TOXAPEX, Species.DREDNAW],
+ BEA_ELITE: [Species.HAWLUCHA, [Species.GRAPPLOCT, Species.SIRFETCHD], Species.FALINKS, Species.MACHAMP],
+ ALLISTER_ELITE: [Species.DUSKNOIR, [Species.POLTEAGEIST, Species.RUNERIGUS], Species.CURSOLA, Species.GENGAR],
+ RAIHAN_ELITE: [Species.GOODRA, [Species.TORKOAL, Species.TURTONATOR], Species.FLYGON, Species.ARCHALUDON],
+ RIKA: [Species.WHISCASH, [Species.DONPHAN, Species.DUGTRIO], Species.CAMERUPT, Species.CLODSIRE],
+ POPPY: [Species.COPPERAJAH, Species.BRONZONG, Species.CORVIKNIGHT, Species.TINKATON],
+ LARRY_ELITE: [Species.STARAPTOR, Species.FLAMIGO, Species.ALTARIA, Species.TROPIUS],
+ HASSEL: [Species.NOIVERN, [Species.FLAPPLE, Species.APPLETUN], Species.DRAGALGE, Species.BAXCALIBUR],
+ CRISPIN: [Species.TALONFLAME, Species.CAMERUPT, Species.MAGMORTAR, Species.BLAZIKEN],
+ AMARYS: [Species.SKARMORY, Species.EMPOLEON, Species.SCIZOR, Species.METAGROSS],
+ LACEY: [Species.EXCADRILL, Species.PRIMARINA, [Species.ALCREMIE, Species.GRANBULL], Species.WHIMSICOTT],
+ DRAYTON: [Species.DRAGONITE, Species.ARCHALUDON, Species.HAXORUS, Species.SCEPTILE],
+ BLUE: [[Species.GYARADOS, Species.EXEGGUTOR, Species.ARCANINE], Species.HO_OH, [Species.RHYPERIOR, Species.MAGNEZONE]], // Alakazam lead, Mega Pidgeot
+ RED: [Species.LUGIA, Species.SNORLAX, [Species.ESPEON, Species.UMBREON, Species.SYLVEON]], // GMax Pikachu lead, Mega gen 1 starter
+ LANCE_CHAMPION: [Species.DRAGONITE, Species.KINGDRA, Species.ALOLA_EXEGGUTOR], // Aerodactyl lead, Mega Latias/Latios
+ STEVEN: [Species.AGGRON, [Species.ARMALDO, Species.CRADILY], Species.DIALGA], // Skarmory lead, Mega Metagross
+ WALLACE: [Species.MILOTIC, Species.PALKIA, Species.LUDICOLO], // Pelipper lead, Mega Swampert
+ CYNTHIA: [Species.GIRATINA, Species.LUCARIO, Species.TOGEKISS], // Spiritomb lead, Mega Garchomp
+ ALDER: [Species.VOLCARONA, Species.ZEKROM, [Species.ACCELGOR, Species.ESCAVALIER], Species.KELDEO], // Bouffalant/Braviary lead
+ IRIS: [Species.HAXORUS, Species.RESHIRAM, Species.ARCHEOPS], // Druddigon lead, Gmax Lapras
+ DIANTHA: [Species.HAWLUCHA, Species.XERNEAS, Species.GOODRA], // Gourgeist lead, Mega Gardevoir
+ HAU: [[Species.SOLGALEO, Species.LUNALA], Species.NOIVERN, [Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA], [Species.TAPU_BULU, Species.TAPU_FINI, Species.TAPU_KOKO, Species.TAPU_LELE]], // Alola Raichu lead
+ LEON: [Species.DRAGAPULT, [Species.ZACIAN, Species.ZAMAZENTA], Species.AEGISLASH], // Rillaboom/Cinderace/Inteleon lead, GMax Charizard
+ GEETA: [Species.MIRAIDON, [Species.ESPATHRA, Species.VELUZA], [Species.AVALUGG, Species.HISUI_AVALUGG], Species.KINGAMBIT], // Glimmora lead
+ NEMONA: [Species.KORAIDON, Species.PAWMOT, [Species.DUDUNSPARCE, Species.ORTHWORM], [Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL]], // Lycanroc lead
+ KIERAN: [[Species.GRIMMSNARL, Species.INCINEROAR, Species.PORYGON_Z], Species.OGERPON, Species.TERAPAGOS, Species.HYDRAPPLE], // Poliwrath/Politoed lead
+};
+
+export const trainerConfigs: TrainerConfigs = {
+ [TrainerType.UNKNOWN]: new TrainerConfig(0).setHasGenders(),
+ [TrainerType.ACE_TRAINER]: new TrainerConfig(++t).setHasGenders("Ace Trainer Female").setHasDouble("Ace Duo").setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.ACE_TRAINER)
+ .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.THREE_WEAK_BALANCED, trainerPartyTemplates.FOUR_WEAK_BALANCED, trainerPartyTemplates.FIVE_WEAK_BALANCED, trainerPartyTemplates.SIX_WEAK_BALANCED)),
+ [TrainerType.ARTIST]: new TrainerConfig(++t).setEncounterBgm(TrainerType.RICH).setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.THREE_AVG)
+ .setSpeciesPools([Species.SMEARGLE]),
+ [TrainerType.BACKERS]: new TrainerConfig(++t).setHasGenders("Backers").setDoubleOnly().setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.BACKPACKER]: new TrainerConfig(++t).setHasGenders("Backpacker Female").setHasDouble("Backpackers").setSpeciesFilter(s => s.isOfType(Type.FLYING) || s.isOfType(Type.ROCK)).setEncounterBgm(TrainerType.BACKPACKER)
+ .setPartyTemplates(trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.ONE_WEAK_ONE_STRONG, trainerPartyTemplates.ONE_AVG_ONE_STRONG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.RHYHORN, Species.AIPOM, Species.MAKUHITA, Species.MAWILE, Species.NUMEL, Species.LILLIPUP, Species.SANDILE, Species.WOOLOO],
+ [TrainerPoolTier.UNCOMMON]: [Species.GIRAFARIG, Species.ZANGOOSE, Species.SEVIPER, Species.CUBCHOO, Species.PANCHAM, Species.SKIDDO, Species.MUDBRAY],
+ [TrainerPoolTier.RARE]: [Species.TAUROS, Species.STANTLER, Species.DARUMAKA, Species.BOUFFALANT, Species.DEERLING, Species.IMPIDIMP],
+ [TrainerPoolTier.SUPER_RARE]: [Species.GALAR_DARUMAKA, Species.TEDDIURSA]
+ }),
+ [TrainerType.BAKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.35).setSpeciesFilter(s => s.isOfType(Type.GRASS) || s.isOfType(Type.FIRE)),
+ [TrainerType.BEAUTY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY),
+ [TrainerType.BIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON)),
+ [TrainerType.BLACK_BELT]: new TrainerConfig(++t).setHasGenders("Battle Girl", TrainerType.PSYCHIC).setHasDouble("Crush Kin").setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.FIGHTING)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_STRONG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_AVG_ONE_STRONG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.NIDORAN_F, Species.NIDORAN_M, Species.MACHOP, Species.MAKUHITA, Species.MEDITITE, Species.CROAGUNK, Species.TIMBURR],
+ [TrainerPoolTier.UNCOMMON]: [Species.MANKEY, Species.POLIWRATH, Species.TYROGUE, Species.BRELOOM, Species.SCRAGGY, Species.MIENFOO, Species.PANCHAM, Species.STUFFUL, Species.CRABRAWLER],
+ [TrainerPoolTier.RARE]: [Species.HERACROSS, Species.RIOLU, Species.THROH, Species.SAWK, Species.PASSIMIAN, Species.CLOBBOPUS],
+ [TrainerPoolTier.SUPER_RARE]: [Species.HITMONTOP, Species.INFERNAPE, Species.GALLADE, Species.HAWLUCHA, Species.HAKAMO_O],
+ [TrainerPoolTier.ULTRA_RARE]: [Species.KUBFU]
+ }),
+ [TrainerType.BREEDER]: new TrainerConfig(++t).setMoneyMultiplier(1.325).setEncounterBgm(TrainerType.POKEFAN).setHasGenders("Breeder Female").setHasDouble("Breeders")
+ .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.FIVE_WEAKER, trainerPartyTemplates.SIX_WEAKER))
+ .setSpeciesFilter(s => s.baseTotal < 450),
+ [TrainerType.CLERK]: new TrainerConfig(++t).setHasGenders("Clerk Female").setHasDouble("Colleagues").setEncounterBgm(TrainerType.CLERK)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_ONE_AVG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.MEOWTH, Species.PSYDUCK, Species.BUDEW, Species.PIDOVE, Species.CINCCINO, Species.LITLEO],
+ [TrainerPoolTier.UNCOMMON]: [Species.JIGGLYPUFF, Species.MAGNEMITE, Species.MARILL, Species.COTTONEE, Species.SKIDDO],
+ [TrainerPoolTier.RARE]: [Species.BUIZEL, Species.SNEASEL, Species.KLEFKI, Species.INDEEDEE]
+ }),
+ [TrainerType.CYCLIST]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setHasGenders("Cyclist Female").setHasDouble("Cyclists").setEncounterBgm(TrainerType.CYCLIST)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.PICHU, Species.STARLY, Species.TAILLOW, Species.BOLTUND],
+ [TrainerPoolTier.UNCOMMON]: [Species.DODUO, Species.ELECTRIKE, Species.BLITZLE, Species.WATTREL],
+ [TrainerPoolTier.RARE]: [Species.YANMA, Species.NINJASK, Species.WHIRLIPEDE, Species.EMOLGA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.ACCELGOR, Species.DREEPY]
+ }),
+ [TrainerType.DANCER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CYCLIST)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.RALTS, Species.SPOINK, Species.LOTAD, Species.BUDEW],
+ [TrainerPoolTier.UNCOMMON]: [Species.SPINDA, Species.SWABLU, Species.MARACTUS,],
+ [TrainerPoolTier.RARE]: [Species.BELLOSSOM, Species.HITMONTOP, Species.MIME_JR, Species.ORICORIO],
+ [TrainerPoolTier.SUPER_RARE]: [Species.POPPLIO]
+ }),
+ [TrainerType.DEPOT_AGENT]: new TrainerConfig(++t).setMoneyMultiplier(1.45).setEncounterBgm(TrainerType.CLERK),
+ [TrainerType.DOCTOR]: new TrainerConfig(++t).setHasGenders("Nurse", "lass").setHasDouble("Medical Team").setMoneyMultiplier(3).setEncounterBgm(TrainerType.CLERK)
+ .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.HEAL_PULSE)),
+ [TrainerType.FIREBREATHER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK)
+ .setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SMOG) || s.isOfType(Type.FIRE)),
+ [TrainerType.FISHERMAN]: new TrainerConfig(++t).setMoneyMultiplier(1.25).setEncounterBgm(TrainerType.BACKPACKER).setSpecialtyTypes(Type.WATER)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.THREE_WEAK_SAME, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.SIX_WEAKER)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.TENTACOOL, Species.MAGIKARP, Species.GOLDEEN, Species.STARYU, Species.REMORAID, Species.SKRELP, Species.CLAUNCHER, Species.ARROKUDA],
+ [TrainerPoolTier.UNCOMMON]: [Species.POLIWAG, Species.SHELLDER, Species.KRABBY, Species.HORSEA, Species.CARVANHA, Species.BARBOACH, Species.CORPHISH, Species.FINNEON, Species.TYMPOLE, Species.BASCULIN, Species.FRILLISH, Species.INKAY],
+ [TrainerPoolTier.RARE]: [Species.CHINCHOU, Species.CORSOLA, Species.WAILMER, Species.BARBOACH, Species.CLAMPERL, Species.LUVDISC, Species.MANTYKE, Species.ALOMOMOLA, Species.TATSUGIRI, Species.VELUZA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.LAPRAS, Species.FEEBAS, Species.RELICANTH, Species.DONDOZO]
+ }),
+ [TrainerType.GUITARIST]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.ROUGHNECK).setSpecialtyTypes(Type.ELECTRIC).setSpeciesFilter(s => s.isOfType(Type.ELECTRIC)),
+ [TrainerType.HARLEQUIN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.PSYCHIC).setSpeciesFilter(s => tmSpecies[Moves.TRICK_ROOM].indexOf(s.speciesId) > -1),
+ [TrainerType.HIKER]: new TrainerConfig(++t).setEncounterBgm(TrainerType.BACKPACKER)
+ .setPartyTemplates(trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.TWO_AVG_SAME_ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.ONE_STRONG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.SANDSHREW, Species.DIGLETT, Species.GEODUDE, Species.MACHOP, Species.ARON, Species.ROGGENROLA, Species.DRILBUR, Species.NACLI],
+ [TrainerPoolTier.UNCOMMON]: [Species.ZUBAT, Species.RHYHORN, Species.ONIX, Species.CUBONE, Species.WOOBAT, Species.SWINUB, Species.NOSEPASS, Species.HIPPOPOTAS, Species.DWEBBLE, Species.KLAWF, Species.TOEDSCOOL],
+ [TrainerPoolTier.RARE]: [Species.TORKOAL, Species.TRAPINCH, Species.BARBOACH, Species.GOLETT, Species.ALOLA_DIGLETT, Species.ALOLA_GEODUDE, Species.GALAR_STUNFISK, Species.PALDEA_WOOPER],
+ [TrainerPoolTier.SUPER_RARE]: [Species.MAGBY, Species.LARVITAR]
+ }),
+ [TrainerType.HOOLIGANS]: new TrainerConfig(++t).setDoubleOnly().setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.POISON) || s.isOfType(Type.DARK)),
+ [TrainerType.HOOPSTER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.INFIELDER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.JANITOR]: new TrainerConfig(++t).setMoneyMultiplier(1.1).setEncounterBgm(TrainerType.CLERK),
+ [TrainerType.LINEBACKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.MAID]: new TrainerConfig(++t).setMoneyMultiplier(1.6).setEncounterBgm(TrainerType.RICH),
+ [TrainerType.MUSICIAN]: new TrainerConfig(++t).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => !!s.getLevelMoves().find(plm => plm[1] === Moves.SING)),
+ [TrainerType.HEX_MANIAC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.PSYCHIC)
+ .setPartyTemplates(trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_AVG_ONE_STRONG, trainerPartyTemplates.TWO_AVG_SAME_ONE_AVG, trainerPartyTemplates.THREE_AVG, trainerPartyTemplates.TWO_STRONG)
+ .setSpeciesFilter(s => s.isOfType(Type.GHOST)),
+ [TrainerType.NURSERY_AIDE]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm("lass"),
+ [TrainerType.OFFICER]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.CLERK)
+ .setPartyTemplates(trainerPartyTemplates.ONE_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.VULPIX, Species.GROWLITHE, Species.SNUBBULL, Species.POOCHYENA, Species.ELECTRIKE, Species.LILLIPUP, Species.YAMPER, Species.FIDOUGH],
+ [TrainerPoolTier.UNCOMMON]: [Species.HOUNDOUR, Species.ROCKRUFF, Species.MASCHIFF],
+ [TrainerPoolTier.RARE]: [Species.JOLTEON, Species.RIOLU],
+ [TrainerPoolTier.SUPER_RARE]: [],
+ [TrainerPoolTier.ULTRA_RARE]: [Species.ENTEI, Species.SUICUNE, Species.RAIKOU]
+ }),
+ [TrainerType.PARASOL_LADY]: new TrainerConfig(++t).setMoneyMultiplier(1.55).setEncounterBgm(TrainerType.PARASOL_LADY).setSpeciesFilter(s => s.isOfType(Type.WATER)),
+ [TrainerType.PILOT]: new TrainerConfig(++t).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => tmSpecies[Moves.FLY].indexOf(s.speciesId) > -1),
+ [TrainerType.POKEFAN]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("PokéFan").setHasGenders("PokéFan Female").setHasDouble("PokéFan Family").setEncounterBgm(TrainerType.POKEFAN)
+ .setPartyTemplates(trainerPartyTemplates.SIX_WEAKER, trainerPartyTemplates.FOUR_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.ONE_STRONG, trainerPartyTemplates.FOUR_WEAK_SAME, trainerPartyTemplates.FIVE_WEAK, trainerPartyTemplates.SIX_WEAKER_SAME),
+ [TrainerType.PRESCHOOLER]: new TrainerConfig(++t).setMoneyMultiplier(0.2).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Preschooler Female", "lass").setHasDouble("Preschoolers")
+ .setPartyTemplates(trainerPartyTemplates.THREE_WEAK, trainerPartyTemplates.FOUR_WEAKER, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.FIVE_WEAKER)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.CATERPIE, Species.PICHU, Species.SANDSHREW, Species.LEDYBA, Species.BUDEW, Species.BURMY, Species.WOOLOO, Species.PAWMI, Species.SMOLIV],
+ [TrainerPoolTier.UNCOMMON]: [Species.EEVEE, Species.CLEFFA, Species.IGGLYBUFF, Species.SWINUB, Species.WOOPER, Species.DRIFLOON, Species.DEDENNE, Species.STUFFUL],
+ [TrainerPoolTier.RARE]: [Species.RALTS, Species.RIOLU, Species.JOLTIK, Species.TANDEMAUS],
+ [TrainerPoolTier.SUPER_RARE]: [Species.DARUMAKA, Species.TINKATINK],
+ }),
+ [TrainerType.PSYCHIC]: new TrainerConfig(++t).setHasGenders("Psychic Female").setHasDouble("Psychics").setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.PSYCHIC)
+ .setPartyTemplates(trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_WEAK_SAME_ONE_AVG, trainerPartyTemplates.TWO_WEAK_SAME_TWO_WEAK_SAME, trainerPartyTemplates.ONE_STRONGER)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.ABRA, Species.DROWZEE, Species.RALTS, Species.SPOINK, Species.GOTHITA, Species.SOLOSIS, Species.BLIPBUG, Species.ESPURR, Species.HATENNA],
+ [TrainerPoolTier.UNCOMMON]: [Species.MIME_JR, Species.EXEGGCUTE, Species.MEDITITE, Species.NATU, Species.EXEGGCUTE, Species.WOOBAT, Species.INKAY, Species.ORANGURU],
+ [TrainerPoolTier.RARE]: [Species.ELGYEM, Species.SIGILYPH, Species.BALTOY, Species.GIRAFARIG, Species.MEOWSTIC],
+ [TrainerPoolTier.SUPER_RARE]: [Species.BELDUM, Species.ESPEON, Species.STANTLER],
+ }),
+ [TrainerType.RANGER]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setName("Pokémon Ranger").setEncounterBgm(TrainerType.BACKPACKER).setHasGenders("Pokémon Ranger Female").setHasDouble("Pokémon Rangers")
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.PICHU, Species.GROWLITHE, Species.PONYTA, Species.ZIGZAGOON, Species.SEEDOT, Species.BIDOOF, Species.RIOLU, Species.SEWADDLE, Species.SKIDDO, Species.SALANDIT, Species.YAMPER],
+ [TrainerPoolTier.UNCOMMON]: [Species.AZURILL, Species.TAUROS, Species.MAREEP, Species.FARFETCHD, Species.TEDDIURSA, Species.SHROOMISH, Species.ELECTRIKE, Species.BUDEW, Species.BUIZEL, Species.MUDBRAY, Species.STUFFUL],
+ [TrainerPoolTier.RARE]: [Species.EEVEE, Species.SCYTHER, Species.KANGASKHAN, Species.RALTS, Species.MUNCHLAX, Species.ZORUA, Species.PALDEA_TAUROS, Species.TINKATINK, Species.CYCLIZAR, Species.FLAMIGO],
+ [TrainerPoolTier.SUPER_RARE]: [Species.LARVESTA],
+ }),
+ [TrainerType.RICH]: new TrainerConfig(++t).setMoneyMultiplier(5).setName("Gentleman").setHasGenders("Madame").setHasDouble("Rich Couple"),
+ [TrainerType.RICH_KID]: new TrainerConfig(++t).setMoneyMultiplier(3.75).setName("Rich Boy").setHasGenders("Lady").setHasDouble("Rich Kids").setEncounterBgm(TrainerType.RICH),
+ [TrainerType.ROUGHNECK]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.ROUGHNECK).setSpeciesFilter(s => s.isOfType(Type.DARK)),
+ [TrainerType.SAILOR]: new TrainerConfig(++t).setMoneyMultiplier(1.4).setEncounterBgm(TrainerType.BACKPACKER).setSpeciesFilter(s => s.isOfType(Type.WATER) || s.isOfType(Type.FIGHTING)),
+ [TrainerType.SCIENTIST]: new TrainerConfig(++t).setHasGenders("Scientist Female").setHasDouble("Scientists").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.SCIENTIST)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.MAGNEMITE, Species.GRIMER, Species.DROWZEE, Species.VOLTORB, Species.KOFFING],
+ [TrainerPoolTier.UNCOMMON]: [Species.BALTOY, Species.BRONZOR, Species.FERROSEED, Species.KLINK, Species.CHARJABUG, Species.BLIPBUG, Species.HELIOPTILE],
+ [TrainerPoolTier.RARE]: [Species.ABRA, Species.DITTO, Species.PORYGON, Species.ELEKID, Species.SOLOSIS, Species.GALAR_WEEZING],
+ [TrainerPoolTier.SUPER_RARE]: [Species.OMANYTE, Species.KABUTO, Species.AERODACTYL, Species.LILEEP, Species.ANORITH, Species.CRANIDOS, Species.SHIELDON, Species.TIRTOUGA, Species.ARCHEN, Species.ARCTOVISH, Species.ARCTOZOLT, Species.DRACOVISH, Species.DRACOZOLT],
+ [TrainerPoolTier.ULTRA_RARE]: [Species.ROTOM, Species.MELTAN]
+ }),
+ [TrainerType.SMASHER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.SNOW_WORKER]: new TrainerConfig(++t).setName("Worker").setHasGenders("Worker Female").setHasDouble("Workers").setMoneyMultiplier(1.7).setEncounterBgm(TrainerType.CLERK).setSpeciesFilter(s => s.isOfType(Type.ICE) || s.isOfType(Type.STEEL)),
+ [TrainerType.STRIKER]: new TrainerConfig(++t).setMoneyMultiplier(1.2).setEncounterBgm(TrainerType.CYCLIST),
+ [TrainerType.SCHOOL_KID]: new TrainerConfig(++t).setMoneyMultiplier(0.75).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("School Kid Female", "lass").setHasDouble("School Kids")
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.ODDISH, Species.EXEGGCUTE, Species.TEDDIURSA, Species.WURMPLE, Species.RALTS, Species.SHROOMISH, Species.FLETCHLING],
+ [TrainerPoolTier.UNCOMMON]: [Species.VOLTORB, Species.WHISMUR, Species.MEDITITE, Species.MIME_JR, Species.NYMBLE],
+ [TrainerPoolTier.RARE]: [Species.TANGELA, Species.EEVEE, Species.YANMA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.TADBULB]
+ }),
+ [TrainerType.SWIMMER]: new TrainerConfig(++t).setMoneyMultiplier(1.3).setEncounterBgm(TrainerType.PARASOL_LADY).setHasGenders("Swimmer Female").setHasDouble("Swimmers").setSpecialtyTypes(Type.WATER).setSpeciesFilter(s => s.isOfType(Type.WATER)),
+ [TrainerType.TWINS]: new TrainerConfig(++t).setDoubleOnly().setMoneyMultiplier(0.65).setUseSameSeedForAllMembers()
+ .setPartyTemplateFunc(scene => getWavePartyTemplate(scene, trainerPartyTemplates.TWO_WEAK, trainerPartyTemplates.TWO_AVG, trainerPartyTemplates.TWO_STRONG))
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PLUSLE, Species.VOLBEAT, Species.PACHIRISU, Species.SILCOON, Species.METAPOD, Species.IGGLYBUFF, Species.PETILIL, Species.EEVEE]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.MINUN, Species.ILLUMISE, Species.EMOLGA, Species.CASCOON, Species.KAKUNA, Species.CLEFFA, Species.COTTONEE, Species.EEVEE], TrainerSlot.TRAINER_PARTNER))
+ .setEncounterBgm(TrainerType.TWINS),
+ [TrainerType.VETERAN]: new TrainerConfig(++t).setHasGenders("Veteran Female").setHasDouble("Veteran Duo").setMoneyMultiplier(2.5).setEncounterBgm(TrainerType.ACE_TRAINER).setSpeciesFilter(s => s.isOfType(Type.DRAGON)),
+ [TrainerType.WAITER]: new TrainerConfig(++t).setHasGenders("Waitress").setHasDouble("Restaurant Staff").setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.CLERK)
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.CLEFFA, Species.CHATOT, Species.PANSAGE, Species.PANSEAR, Species.PANPOUR, Species.MINCCINO],
+ [TrainerPoolTier.UNCOMMON]: [Species.TROPIUS, Species.PETILIL, Species.BOUNSWEET, Species.INDEEDEE],
+ [TrainerPoolTier.RARE]: [Species.APPLIN, Species.SINISTEA, Species.POLTCHAGEIST]
+ }),
+ [TrainerType.WORKER]: new TrainerConfig(++t).setHasGenders("Worker Female").setHasDouble("Workers").setEncounterBgm(TrainerType.CLERK).setMoneyMultiplier(1.7).setSpeciesFilter(s => s.isOfType(Type.ROCK) || s.isOfType(Type.STEEL)),
+ [TrainerType.YOUNGSTER]: new TrainerConfig(++t).setMoneyMultiplier(0.5).setEncounterBgm(TrainerType.YOUNGSTER).setHasGenders("Lass", "lass").setHasDouble("Beginners").setPartyTemplates(trainerPartyTemplates.TWO_WEAKER)
+ .setSpeciesPools(
+ [Species.CATERPIE, Species.WEEDLE, Species.RATTATA, Species.SENTRET, Species.POOCHYENA, Species.ZIGZAGOON, Species.WURMPLE, Species.BIDOOF, Species.PATRAT, Species.LILLIPUP]
+ ),
+ [TrainerType.ROCKET_GRUNT]: new TrainerConfig(++t).setHasGenders("Rocket Grunt Female").setHasDouble("Rocket Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.WEEDLE, Species.RATTATA, Species.EKANS, Species.SANDSHREW, Species.ZUBAT, Species.GEODUDE, Species.KOFFING, Species.GRIMER, Species.ODDISH],
+ [TrainerPoolTier.UNCOMMON]: [Species.GYARADOS, Species.TAUROS, Species.SCYTHER, Species.CUBONE, Species.GROWLITHE, Species.MURKROW, Species.GASTLY, Species.EXEGGCUTE, Species.VOLTORB],
+ [TrainerPoolTier.RARE]: [Species.PORYGON, Species.ALOLA_RATTATA, Species.ALOLA_SANDSHREW, Species.ALOLA_MEOWTH, Species.ALOLA_GRIMER, Species.ALOLA_GEODUDE],
+ [TrainerPoolTier.SUPER_RARE]: [Species.DRATINI, Species.LARVITAR]
+ }),
+ [TrainerType.ARCHER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.HOUNDOOM]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.ARIANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin_female", "rocket", [Species.ARBOK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.PROTON]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.CROBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.PETREL]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("rocket_admin", "rocket", [Species.WEEZING]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_rocket_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.MAGMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Magma Grunt Female").setHasDouble("Magma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.SLUGMA, Species.POOCHYENA, Species.NUMEL, Species.ZIGZAGOON, Species.DIGLETT, Species.MAGBY, Species.TORKOAL, Species.BALTOY, Species.BARBOACH],
+ [TrainerPoolTier.UNCOMMON]: [Species.SOLROCK, Species.HIPPOPOTAS, Species.SANDACONDA, Species.PHANPY, Species.ROLYCOLY, Species.GLIGAR],
+ [TrainerPoolTier.RARE]: [Species.TRAPINCH, Species.HEATMOR],
+ [TrainerPoolTier.SUPER_RARE]: [Species.CAPSAKID, Species.CHARCADET]
+ }),
+ [TrainerType.TABITHA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.COURTNEY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("magma_admin_female", "magma", [Species.CAMERUPT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.AQUA_GRUNT]: new TrainerConfig(++t).setHasGenders("Aqua Grunt Female").setHasDouble("Aqua Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.CARVANHA, Species.WAILMER, Species.ZIGZAGOON, Species.LOTAD, Species.CORPHISH, Species.SPHEAL],
+ [TrainerPoolTier.UNCOMMON]: [Species.CLAMPERL, Species.CHINCHOU, Species.WOOPER, Species.WINGULL, Species.TENTACOOL, Species.QWILFISH],
+ [TrainerPoolTier.RARE]: [Species.MANTINE, Species.BASCULEGION, Species.REMORAID, Species.ARROKUDA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.DONDOZO]
+ }),
+ [TrainerType.MATT]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.SHELLY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aqua_admin_female", "aqua", [Species.SHARPEDO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aqua_magma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.GALACTIC_GRUNT]: new TrainerConfig(++t).setHasGenders("Galactic Grunt Female").setHasDouble("Galactic Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.GLAMEOW, Species.STUNKY, Species.CROAGUNK, Species.SHINX, Species.WURMPLE, Species.BRONZOR, Species.DRIFLOON, Species.BURMY],
+ [TrainerPoolTier.UNCOMMON]: [Species.CARNIVINE, Species.GROWLITHE, Species.QWILFISH, Species.SNEASEL],
+ [TrainerPoolTier.RARE]: [Species.HISUI_GROWLITHE, Species.HISUI_QWILFISH, Species.HISUI_SNEASEL],
+ [TrainerPoolTier.SUPER_RARE]: [Species.HISUI_ZORUA, Species.HISUI_SLIGGOO]
+ }),
+ [TrainerType.JUPITER]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.SKUNTANK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.MARS]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander_female", "galactic", [Species.PURUGLY]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.SATURN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("galactic_commander", "galactic", [Species.TOXICROAK]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_galactic_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.PLASMA_GRUNT]: new TrainerConfig(++t).setHasGenders("Plasma Grunt Female").setHasDouble("Plasma Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.PATRAT, Species.LILLIPUP, Species.PURRLOIN, Species.SCRAFTY, Species.WOOBAT, Species.VANILLITE, Species.SANDILE, Species.TRUBBISH],
+ [TrainerPoolTier.UNCOMMON]: [Species.FRILLISH, Species.VENIPEDE, Species.GOLETT, Species.TIMBURR, Species.DARUMAKA, Species.AMOONGUSS],
+ [TrainerPoolTier.RARE]: [Species.PAWNIARD, Species.VULLABY, Species.ZORUA, Species.DRILBUR, Species.KLINK],
+ [TrainerPoolTier.SUPER_RARE]: [Species.DRUDDIGON, Species.BOUFFALANT, Species.AXEW, Species.DEINO, Species.DURANT]
+ }),
+ [TrainerType.ZINZOLIN]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.CRYOGONAL]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.ROOD]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("plasma_sage", "plasma", [Species.SWOOBAT]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_plasma_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.FLARE_GRUNT]: new TrainerConfig(++t).setHasGenders("Flare Grunt Female").setHasDouble("Flare Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [Species.FLETCHLING, Species.LITLEO, Species.PONYTA, Species.INKAY, Species.HOUNDOUR, Species.SKORUPI, Species.SCRAFTY, Species.CROAGUNK],
+ [TrainerPoolTier.UNCOMMON]: [Species.HELIOPTILE, Species.ELECTRIKE, Species.SKRELP, Species.GULPIN, Species.PURRLOIN, Species.POOCHYENA, Species.SCATTERBUG],
+ [TrainerPoolTier.RARE]: [Species.LITWICK, Species.SNEASEL, Species.PANCHAM, Species.PAWNIARD],
+ [TrainerPoolTier.SUPER_RARE]: [Species.NOIVERN, Species.DRUDDIGON]
+ }),
+ [TrainerType.BRYONY]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin_female", "flare", [Species.LIEPARD]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.XEROSIC]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("flare_admin", "flare", [Species.MALAMAR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_flare_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.AETHER_GRUNT]: new TrainerConfig(++t).setHasGenders("Aether Grunt Female").setHasDouble("Aether Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [ Species.PIKIPEK, Species.ROCKRUFF, Species.ALOLA_DIGLETT, Species.YUNGOOS, Species.CORSOLA, Species.ALOLA_GEODUDE, Species.BOUNSWEET, Species.LILLIPUP, Species.ALOLA_MAROWAK],
+ [TrainerPoolTier.UNCOMMON]: [ Species.POLIWAG, Species.STUFFUL, Species.ALOLA_EXEGGUTOR, Species.CRABRAWLER, Species.CUTIEFLY, Species.ALOLA_RAICHU, Species.ORICORIO, Species.MUDBRAY],
+ [TrainerPoolTier.RARE]: [ Species.ORANGURU, Species.PASSIMIAN, Species.GALAR_CORSOLA, Species.ALOLA_SANDSHREW, Species.ALOLA_VULPIX, Species.TURTONATOR, Species.DRAMPA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.JANGMO_O, Species.PORYGON]
+ }),
+ [TrainerType.FABA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("aether_admin", "aether", [Species.HYPNO]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_aether_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.SKULL_GRUNT]: new TrainerConfig(++t).setHasGenders("Skull Grunt Female").setHasDouble("Skull Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [ Species.SALANDIT, Species.ALOLA_RATTATA, Species.ALOLA_MEOWTH, Species.SCRAGGY, Species.KOFFING, Species.ALOLA_GRIMER, Species.MAREANIE, Species.SPINARAK, Species.TRUBBISH],
+ [TrainerPoolTier.UNCOMMON]: [ Species.FOMANTIS, Species.SABLEYE, Species.SANDILE, Species.ALOLA_MAROWAK, Species.PANCHAM, Species.DROWZEE, Species.ZUBAT, Species.VENIPEDE, Species.VULLABY],
+ [TrainerPoolTier.RARE]: [Species.SANDYGAST, Species.PAWNIARD, Species.MIMIKYU, Species.DHELMISE, Species.GASTLY, Species.WISHIWASHI],
+ [TrainerPoolTier.SUPER_RARE]: [Species.GRUBBIN, Species.DEWPIDER]
+ }),
+ [TrainerType.PLUMERIA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("skull_admin", "skull", [Species.SALAZZLE]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_skull_admin").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+ [TrainerType.MACRO_GRUNT]: new TrainerConfig(++t).setHasGenders("Macro Grunt Female").setHasDouble("Macro Grunts").setMoneyMultiplier(1.0).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_macro_grunt").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene))
+ .setSpeciesPools({
+ [TrainerPoolTier.COMMON]: [ Species.CUFANT, Species.GALAR_MEOWTH, Species.KLINK, Species.ROOKIDEE, Species.CRAMORANT, Species.GALAR_ZIGZAGOON, Species.SKWOVET, Species.STEELIX, Species.MAWILE, Species.FERROSEED],
+ [TrainerPoolTier.UNCOMMON]: [ Species.DRILBUR, Species.MAGNEMITE, Species.HATENNA, Species.ARROKUDA, Species.APPLIN, Species.GALAR_PONYTA, Species.GALAR_YAMASK, Species.SINISTEA, Species.RIOLU],
+ [TrainerPoolTier.RARE]: [Species.FALINKS, Species.BELDUM, Species.GALAR_FARFETCHD, Species.GALAR_MR_MIME, Species.HONEDGE, Species.SCIZOR, Species.GALAR_DARUMAKA],
+ [TrainerPoolTier.SUPER_RARE]: [Species.DURALUDON, Species.DREEPY]
+ }),
+ [TrainerType.OLEANA]: new TrainerConfig(++t).setMoneyMultiplier(1.5).initForEvilTeamAdmin("macro_admin", "macro", [Species.GARBODOR]).setEncounterBgm(TrainerType.PLASMA_GRUNT).setBattleBgm("battle_plasma_grunt").setMixedBattleBgm("battle_oleana").setVictoryBgm("victory_team_plasma").setPartyTemplateFunc(scene => getEvilGruntPartyTemplate(scene)),
+
+ [TrainerType.BROCK]: new TrainerConfig((t = TrainerType.BROCK)).initForGymLeader(signatureSpecies["BROCK"], true, Type.ROCK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.MISTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MISTY"], false, Type.WATER).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.LT_SURGE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LT_SURGE"], true, Type.ELECTRIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.ERIKA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ERIKA"], false, Type.GRASS).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.JANINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JANINE"], false, Type.POISON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.SABRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SABRINA"], false, Type.PSYCHIC).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.BLAINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BLAINE"], true, Type.FIRE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.GIOVANNI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GIOVANNI"], true, Type.DARK).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.FALKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FALKNER"], true, Type.FLYING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.BUGSY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BUGSY"], true, Type.BUG).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.WHITNEY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WHITNEY"], false, Type.NORMAL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.MORTY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MORTY"], true, Type.GHOST).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.CHUCK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHUCK"], true, Type.FIGHTING).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.JASMINE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JASMINE"], false, Type.STEEL).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.PRYCE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PRYCE"], true, Type.ICE).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.CLAIR]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAIR"], false, Type.DRAGON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.ROXANNE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXANNE"], false, Type.ROCK).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.BRAWLY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRAWLY"], true, Type.FIGHTING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.WATTSON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WATTSON"], true, Type.ELECTRIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.FLANNERY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FLANNERY"], false, Type.FIRE).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.NORMAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["NORMAN"], true, Type.NORMAL).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.WINONA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WINONA"], false, Type.FLYING).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.TATE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TATE"], true, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("tate_liza_double").setDoubleTrainerType(TrainerType.LIZA).setDoubleTitle("gym_leader_double"),
+ [TrainerType.LIZA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LIZA"], false, Type.PSYCHIC).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym").setHasDouble("liza_tate_double").setDoubleTrainerType(TrainerType.TATE).setDoubleTitle("gym_leader_double"),
+ [TrainerType.JUAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["JUAN"], true, Type.WATER).setBattleBgm("battle_hoenn_gym").setMixedBattleBgm("battle_hoenn_gym"),
+ [TrainerType.ROARK]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROARK"], true, Type.ROCK).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.GARDENIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GARDENIA"], false, Type.GRASS).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.MAYLENE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MAYLENE"], false, Type.FIGHTING).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.CRASHER_WAKE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRASHER_WAKE"], true, Type.WATER).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.FANTINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["FANTINA"], false, Type.GHOST).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.BYRON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BYRON"], true, Type.STEEL).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.CANDICE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CANDICE"], false, Type.ICE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.VOLKNER]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VOLKNER"], true, Type.ELECTRIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.CILAN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CILAN"], true, Type.GRASS).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.CHILI]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHILI"], true, Type.FIRE).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.CRESS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CRESS"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.CHEREN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CHEREN"], true, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.LENORA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["LENORA"], false, Type.NORMAL).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.ROXIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ROXIE"], false, Type.POISON).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.BURGH]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BURGH"], true, Type.BUG).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.ELESA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["ELESA"], false, Type.ELECTRIC).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.CLAY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLAY"], true, Type.GROUND).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.SKYLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["SKYLA"], false, Type.FLYING).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.BRYCEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRYCEN"], true, Type.ICE).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.DRAYDEN]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["DRAYDEN"], true, Type.DRAGON).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.MARLON]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MARLON"], true, Type.WATER).setMixedBattleBgm("battle_unova_gym"),
+ [TrainerType.VIOLA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VIOLA"], false, Type.BUG).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.GRANT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRANT"], true, Type.ROCK).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.KORRINA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KORRINA"], false, Type.FIGHTING).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.RAMOS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RAMOS"], true, Type.GRASS).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.CLEMONT]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["CLEMONT"], true, Type.ELECTRIC).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.VALERIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["VALERIE"], false, Type.FAIRY).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.OLYMPIA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OLYMPIA"], false, Type.PSYCHIC).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.WULFRIC]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["WULFRIC"], true, Type.ICE).setMixedBattleBgm("battle_kalos_gym"),
+ [TrainerType.MILO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MILO"], true, Type.GRASS).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.NESSA]: new TrainerConfig(++t).setName("Nessa").initForGymLeader(signatureSpecies["NESSA"], false, Type.WATER).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.KABU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KABU"], true, Type.FIRE).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.BEA]: new TrainerConfig(++t).setName("Bea").initForGymLeader(signatureSpecies["BEA"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.ALLISTER]: new TrainerConfig(++t).setName("Allister").initForGymLeader(signatureSpecies["ALLISTER"], true, Type.GHOST).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.OPAL]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["OPAL"], false, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.BEDE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BEDE"], true, Type.FAIRY).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.GORDIE]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GORDIE"], true, Type.ROCK).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.MELONY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["MELONY"], false, Type.ICE).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.PIERS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["PIERS"], true, Type.DARK).setHasDouble("piers_marnie_double").setDoubleTrainerType(TrainerType.MARNIE).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.MARNIE]: new TrainerConfig(++t).setName("Marnie").initForGymLeader(signatureSpecies["MARNIE"], false, Type.DARK).setHasDouble("marnie_piers_double").setDoubleTrainerType(TrainerType.PIERS).setDoubleTitle("gym_leader_double").setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.RAIHAN]: new TrainerConfig(++t).setName("Raihan").initForGymLeader(signatureSpecies["RAIHAN"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_gym"),
+ [TrainerType.KATY]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KATY"], false, Type.BUG).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.BRASSIUS]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["BRASSIUS"], true, Type.GRASS).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.IONO]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["IONO"], false, Type.ELECTRIC).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.KOFU]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["KOFU"], true, Type.WATER).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.LARRY]: new TrainerConfig(++t).setName("Larry").initForGymLeader(signatureSpecies["LARRY"], true, Type.NORMAL).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.RYME]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["RYME"], false, Type.GHOST).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.TULIP]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["TULIP"], false, Type.PSYCHIC).setMixedBattleBgm("battle_paldea_gym"),
+ [TrainerType.GRUSHA]: new TrainerConfig(++t).initForGymLeader(signatureSpecies["GRUSHA"], true, Type.ICE).setMixedBattleBgm("battle_paldea_gym"),
+
+ [TrainerType.LORELEI]: new TrainerConfig((t = TrainerType.LORELEI)).initForEliteFour(signatureSpecies["LORELEI"], false, Type.ICE).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.BRUNO]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BRUNO"], true, Type.FIGHTING).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.AGATHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AGATHA"], false, Type.GHOST).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.LANCE]: new TrainerConfig(++t).setName("Lance").initForEliteFour(signatureSpecies["LANCE"], true, Type.DRAGON).setBattleBgm("battle_kanto_gym").setMixedBattleBgm("battle_kanto_gym"),
+ [TrainerType.WILL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WILL"], true, Type.PSYCHIC).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.KOGA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KOGA"], true, Type.POISON).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.KAREN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAREN"], false, Type.DARK).setBattleBgm("battle_johto_gym").setMixedBattleBgm("battle_johto_gym"),
+ [TrainerType.SIDNEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIDNEY"], true, Type.DARK).setMixedBattleBgm("battle_hoenn_elite"),
+ [TrainerType.PHOEBE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["PHOEBE"], false, Type.GHOST).setMixedBattleBgm("battle_hoenn_elite"),
+ [TrainerType.GLACIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GLACIA"], false, Type.ICE).setMixedBattleBgm("battle_hoenn_elite"),
+ [TrainerType.DRAKE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAKE"], true, Type.DRAGON).setMixedBattleBgm("battle_hoenn_elite"),
+ [TrainerType.AARON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AARON"], true, Type.BUG).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.BERTHA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["BERTHA"], false, Type.GROUND).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.FLINT]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["FLINT"], true, Type.FIRE).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.LUCIAN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LUCIAN"], true, Type.PSYCHIC).setBattleBgm("battle_sinnoh_gym").setMixedBattleBgm("battle_sinnoh_gym"),
+ [TrainerType.SHAUNTAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SHAUNTAL"], false, Type.GHOST).setMixedBattleBgm("battle_unova_elite"),
+ [TrainerType.MARSHAL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MARSHAL"], true, Type.FIGHTING).setMixedBattleBgm("battle_unova_elite"),
+ [TrainerType.GRIMSLEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["GRIMSLEY"], true, Type.DARK).setMixedBattleBgm("battle_unova_elite"),
+ [TrainerType.CAITLIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CAITLIN"], false, Type.PSYCHIC).setMixedBattleBgm("battle_unova_elite"),
+ [TrainerType.MALVA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MALVA"], false, Type.FIRE).setMixedBattleBgm("battle_kalos_elite"),
+ [TrainerType.SIEBOLD]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["SIEBOLD"], true, Type.WATER).setMixedBattleBgm("battle_kalos_elite"),
+ [TrainerType.WIKSTROM]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["WIKSTROM"], true, Type.STEEL).setMixedBattleBgm("battle_kalos_elite"),
+ [TrainerType.DRASNA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRASNA"], false, Type.DRAGON).setMixedBattleBgm("battle_kalos_elite"),
+ [TrainerType.HALA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HALA"], true, Type.FIGHTING).setMixedBattleBgm("battle_alola_elite"),
+ [TrainerType.MOLAYNE]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["MOLAYNE"], true, Type.STEEL).setMixedBattleBgm("battle_alola_elite"),
+ [TrainerType.OLIVIA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["OLIVIA"], false, Type.ROCK).setMixedBattleBgm("battle_alola_elite"),
+ [TrainerType.ACEROLA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["ACEROLA"], false, Type.GHOST).setMixedBattleBgm("battle_alola_elite"),
+ [TrainerType.KAHILI]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["KAHILI"], false, Type.FLYING).setMixedBattleBgm("battle_alola_elite"),
+ [TrainerType.MARNIE_ELITE]: new TrainerConfig(++t).setName("Marnie").initForEliteFour(signatureSpecies["MARNIE_ELITE"], false, Type.DARK).setMixedBattleBgm("battle_galar_elite"),
+ [TrainerType.NESSA_ELITE]: new TrainerConfig(++t).setName("Nessa").initForEliteFour(signatureSpecies["NESSA_ELITE"], false, Type.WATER).setMixedBattleBgm("battle_galar_elite"),
+ [TrainerType.BEA_ELITE]: new TrainerConfig(++t).setName("Bea").initForEliteFour(signatureSpecies["BEA_ELITE"], false, Type.FIGHTING).setMixedBattleBgm("battle_galar_elite"),
+ [TrainerType.ALLISTER_ELITE]: new TrainerConfig(++t).setName("Allister").initForEliteFour(signatureSpecies["ALLISTER_ELITE"], true, Type.GHOST).setMixedBattleBgm("battle_galar_elite"),
+ [TrainerType.RAIHAN_ELITE]: new TrainerConfig(++t).setName("Raihan").initForEliteFour(signatureSpecies["RAIHAN_ELITE"], true, Type.DRAGON).setMixedBattleBgm("battle_galar_elite"),
+ [TrainerType.RIKA]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["RIKA"], false, Type.GROUND).setMixedBattleBgm("battle_paldea_elite"),
+ [TrainerType.POPPY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["POPPY"], false, Type.STEEL).setMixedBattleBgm("battle_paldea_elite"),
+ [TrainerType.LARRY_ELITE]: new TrainerConfig(++t).setName("Larry").initForEliteFour(signatureSpecies["LARRY_ELITE"], true, Type.NORMAL, Type.FLYING).setMixedBattleBgm("battle_paldea_elite"),
+ [TrainerType.HASSEL]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["HASSEL"], true, Type.DRAGON).setMixedBattleBgm("battle_paldea_elite"),
+ [TrainerType.CRISPIN]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["CRISPIN"], true, Type.FIRE).setMixedBattleBgm("battle_bb_elite"),
+ [TrainerType.AMARYS]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["AMARYS"], false, Type.STEEL).setMixedBattleBgm("battle_bb_elite"),
+ [TrainerType.LACEY]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["LACEY"], false, Type.FAIRY).setMixedBattleBgm("battle_bb_elite"),
+ [TrainerType.DRAYTON]: new TrainerConfig(++t).initForEliteFour(signatureSpecies["DRAYTON"], true, Type.DRAGON).setMixedBattleBgm("battle_bb_elite"),
+
+ [TrainerType.BLUE]: new TrainerConfig((t = TrainerType.BLUE)).initForChampion(signatureSpecies["BLUE"], true).setBattleBgm("battle_kanto_champion").setMixedBattleBgm("battle_kanto_champion").setHasDouble("blue_red_double").setDoubleTrainerType(TrainerType.RED).setDoubleTitle("champion_double")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALAKAZAM], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.RED]: new TrainerConfig(++t).initForChampion(signatureSpecies["RED"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion").setHasDouble("red_blue_double").setDoubleTrainerType(TrainerType.BLUE).setDoubleTitle("champion_double")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PIKACHU], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 8;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.LANCE_CHAMPION]: new TrainerConfig(++t).setName("Lance").initForChampion(signatureSpecies["LANCE_CHAMPION"], true).setBattleBgm("battle_johto_champion").setMixedBattleBgm("battle_johto_champion")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AERODACTYL], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LATIAS, Species.LATIOS], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.STEVEN]: new TrainerConfig(++t).initForChampion(signatureSpecies["STEVEN"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("steven_wallace_double").setDoubleTrainerType(TrainerType.WALLACE).setDoubleTitle("champion_double")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SKARMORY], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.METAGROSS], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.WALLACE]: new TrainerConfig(++t).initForChampion(signatureSpecies["WALLACE"], true).setBattleBgm("battle_hoenn_champion_g5").setMixedBattleBgm("battle_hoenn_champion_g6").setHasDouble("wallace_steven_double").setDoubleTrainerType(TrainerType.STEVEN).setDoubleTitle("champion_double")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
+ p.abilityIndex = 1; // Drizzle
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.SWAMPERT], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.CYNTHIA]: new TrainerConfig(++t).initForChampion(signatureSpecies["CYNTHIA"], false).setBattleBgm("battle_sinnoh_champion").setMixedBattleBgm("battle_sinnoh_champion")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SPIRITOMB], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARCHOMP], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.ALDER]: new TrainerConfig(++t).initForChampion(signatureSpecies["ALDER"], true).setHasDouble("alder_iris_double").setDoubleTrainerType(TrainerType.IRIS).setDoubleTitle("champion_double").setBattleBgm("battle_champion_alder").setMixedBattleBgm("battle_champion_alder")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.BOUFFALANT, Species.BRAVIARY], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.IRIS]: new TrainerConfig(++t).initForChampion(signatureSpecies["IRIS"], false).setBattleBgm("battle_champion_iris").setMixedBattleBgm("battle_champion_iris").setHasDouble("iris_alder_double").setDoubleTrainerType(TrainerType.ALDER).setDoubleTitle("champion_double")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.DRUDDIGON], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.LAPRAS], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.DIANTHA]: new TrainerConfig(++t).initForChampion(signatureSpecies["DIANTHA"], false).setMixedBattleBgm("battle_kalos_champion")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GOURGEIST], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.GARDEVOIR], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 1;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.HAU]: new TrainerConfig(++t).initForChampion(signatureSpecies["HAU"], true).setMixedBattleBgm("battle_alola_champion")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.ALOLA_RAICHU], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.LEON]: new TrainerConfig(++t).initForChampion(signatureSpecies["LEON"], true).setMixedBattleBgm("battle_galar_champion")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.RILLABOOM, Species.CINDERACE, Species.INTELEON], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CHARIZARD], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 3;
+ p.generateAndPopulateMoveset();
+ p.generateName();
+ })),
+ [TrainerType.GEETA]: new TrainerConfig(++t).initForChampion(signatureSpecies["GEETA"], false).setMixedBattleBgm("battle_champion_geeta")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.GLIMMORA], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.NEMONA]: new TrainerConfig(++t).initForChampion(signatureSpecies["NEMONA"], false).setMixedBattleBgm("battle_champion_nemona")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LYCANROC], TrainerSlot.TRAINER, true, p => {
+ p.formIndex = 0; // Midday form
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.KIERAN]: new TrainerConfig(++t).initForChampion(signatureSpecies["KIERAN"], true).setMixedBattleBgm("battle_champion_kieran")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.POLIWRATH, Species.POLITOED], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ })),
+
+ [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)
+ .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)
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.IVYSAUR, Species.CHARMELEON, Species.WARTORTLE, Species.BAYLEEF, Species.QUILAVA, Species.CROCONAW, Species.GROVYLE, Species.COMBUSKEN, Species.MARSHTOMP, Species.GROTLE, Species.MONFERNO, Species.PRINPLUP, Species.SERVINE, Species.PIGNITE, Species.DEWOTT, Species.QUILLADIN, Species.BRAIXEN, Species.FROGADIER, Species.DARTRIX, Species.TORRACAT, Species.BRIONNE, Species.THWACKEY, Species.RABOOT, Species.DRIZZILE, Species.FLORAGATO, Species.CROCALOR, Species.QUAXWELL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOTTO, Species.HOOTHOOT, Species.TAILLOW, Species.STARAVIA, Species.TRANQUILL, Species.FLETCHINDER, Species.TRUMBEAK, Species.CORVISQUIRE, Species.WATTREL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450)),
+ [TrainerType.RIVAL_3]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setStaticParty().setMoneyMultiplier(1.5).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival").setMixedBattleBgm("battle_rival").setPartyTemplates(trainerPartyTemplates.RIVAL_3)
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
+ .setSpeciesFilter(species => species.baseTotal >= 540),
+ [TrainerType.RIVAL_4]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(1.75).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_2").setMixedBattleBgm("battle_rival_2").setPartyTemplates(trainerPartyTemplates.RIVAL_4)
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
+ .setSpeciesFilter(species => species.baseTotal >= 540)
+ .setGenModifiersFunc(party => {
+ const starter = party[0];
+ return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; // TODO: is the bang correct?
+ }),
+ [TrainerType.RIVAL_5]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(2.25).setEncounterBgm(TrainerType.RIVAL).setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_5)
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
+ p => p.setBoss(true, 2)))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true))
+ .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
+ .setSpeciesFilter(species => species.baseTotal >= 540)
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 3);
+ p.pokeball = PokeballType.MASTER_BALL;
+ p.shiny = true;
+ p.variant = 1;
+ }))
+ .setGenModifiersFunc(party => {
+ const starter = party[0];
+ return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; //TODO: is the bang correct?
+ }),
+ [TrainerType.RIVAL_6]: new TrainerConfig(++t).setName("Finn").setHasGenders("Ivy").setHasCharSprite().setTitle("Rival").setBoss().setStaticParty().setMoneyMultiplier(3).setEncounterBgm("final").setBattleBgm("battle_rival_3").setMixedBattleBgm("battle_rival_3").setPartyTemplates(trainerPartyTemplates.RIVAL_6)
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.VENUSAUR, Species.CHARIZARD, Species.BLASTOISE, Species.MEGANIUM, Species.TYPHLOSION, Species.FERALIGATR, Species.SCEPTILE, Species.BLAZIKEN, Species.SWAMPERT, Species.TORTERRA, Species.INFERNAPE, Species.EMPOLEON, Species.SERPERIOR, Species.EMBOAR, Species.SAMUROTT, Species.CHESNAUGHT, Species.DELPHOX, Species.GRENINJA, Species.DECIDUEYE, Species.INCINEROAR, Species.PRIMARINA, Species.RILLABOOM, Species.CINDERACE, Species.INTELEON, Species.MEOWSCARADA, Species.SKELEDIRGE, Species.QUAQUAVAL], TrainerSlot.TRAINER, true,
+ p => {
+ p.setBoss(true, 3);
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.PIDGEOT, Species.NOCTOWL, Species.SWELLOW, Species.STARAPTOR, Species.UNFEZANT, Species.TALONFLAME, Species.TOUCANNON, Species.CORVIKNIGHT, Species.KILOWATTREL], TrainerSlot.TRAINER, true,
+ p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(2, getSpeciesFilterRandomPartyMemberFunc((species: PokemonSpecies) => !pokemonEvolutions.hasOwnProperty(species.speciesId) && !pokemonPrevolutions.hasOwnProperty(species.speciesId) && species.baseTotal >= 450))
+ .setSpeciesFilter(species => species.baseTotal >= 540)
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.RAYQUAZA], TrainerSlot.TRAINER, true, p => {
+ p.setBoss();
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ p.shiny = true;
+ p.variant = 1;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setGenModifiersFunc(party => {
+ const starter = party[0];
+ return [modifierTypes.TERA_SHARD().generateType([], [starter.species.type1])!.withIdFromFunc(modifierTypes.TERA_SHARD).newModifier(starter) as PersistentModifier]; // TODO: is the bang correct?
+ }),
+
+ [TrainerType.ROCKET_BOSS_GIOVANNI_1]: new TrainerConfig(t = TrainerType.ROCKET_BOSS_GIOVANNI_1).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", []).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.PERSIAN, Species.ALOLA_PERSIAN]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.NIDOKING, Species.NIDOQUEEN]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.RHYPERIOR]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.DUGTRIO, Species.ALOLA_DUGTRIO]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.MAROWAK, Species.ALOLA_MAROWAK]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ })),
+ [TrainerType.ROCKET_BOSS_GIOVANNI_2]: new TrainerConfig(++t).setName("Giovanni").initForEvilTeamLeader("Rocket Boss", [], true).setMixedBattleBgm("battle_rocket_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.TYRANITAR, Species.IRON_THORNS], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.HIPPOWDON]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.EXCADRILL]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.KANGASKHAN], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.GASTRODON]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.MEWTWO], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.MAXIE]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.MIGHTYENA]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CROBAT, Species.GLISCOR]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.WEEZING, Species.GALAR_WEEZING]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.MAGMORTAR, Species.TORKOAL]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.FLYGON]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ })),
+ [TrainerType.MAXIE_2]: new TrainerConfig(++t).setName("Maxie").initForEvilTeamLeader("Magma Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SOLROCK, Species.TYPHLOSION], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.TORKOAL, Species.NINETALES], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 2; // DROUGHT
+ }))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SHIFTRY, Species.SCOVILLAIN], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 0; // Chlorophyll
+ }))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.GREAT_TUSK]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.CAMERUPT], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.GROUDON], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.ARCHIE]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", []).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.LINOONE]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.CROBAT, Species.PELIPPER]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.MUK, Species.ALOLA_MUK]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.TENTACRUEL]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.RELICANTH, Species.WAILORD]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ })),
+ [TrainerType.ARCHIE_2]: new TrainerConfig(++t).setName("Archie").initForEvilTeamLeader("Aqua Boss", [], true).setMixedBattleBgm("battle_aqua_magma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.EMPOLEON, Species.LUDICOLO], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.POLITOED, Species.PELIPPER], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 2; // Drizzle
+ }))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.BEARTIC, Species.ARMALDO], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 2; // Swift Swim
+ }))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.OVERQWIL ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 1; // Swift Swim
+ }))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.SHARPEDO], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KYOGRE], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.CYRUS]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", []).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GYARADOS ]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.HISUI_BRAVIARY ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.CROBAT, Species.GLISCOR ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.AZELF, Species.UXIE, Species.MESPRIT ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HOUNDOOM ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ })),
+ [TrainerType.CYRUS_2]: new TrainerConfig(++t).setName("Cyrus").initForEvilTeamLeader("Galactic Boss", [], true).setMixedBattleBgm("battle_galactic_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.AZELF, Species.UXIE, Species.MESPRIT], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.ELECTRODE, Species.HISUI_ELECTRODE]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SALAMENCE, Species.ROARING_MOON]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.HOUNDOOM], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.WEAVILE], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.DARKRAI], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.GHETSIS]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", []).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.COFAGRIGUS, Species.RUNERIGUS]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([Species.BOUFFALANT]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([Species.SEISMITOAD, Species.CARRACOSTA]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([Species.EELEKTROSS, Species.GALVANTULA]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([Species.VOLCARONA]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.HYDREIGON], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ })),
+ [TrainerType.GHETSIS_2]: new TrainerConfig(++t).setName("Ghetsis").initForEvilTeamLeader("Plasma Boss", [], true).setMixedBattleBgm("battle_plasma_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GENESECT ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ p.formIndex = Utils.randSeedInt(5);
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.BASCULEGION, Species.JELLICENT ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.gender = Gender.MALE;
+ p.formIndex = 1;
+ }))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.KINGAMBIT ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.VOLCARONA, Species.SLITHER_WING ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HYDREIGON, Species.IRON_JUGULIS ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.KYUREM], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.LYSANDRE]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", []).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.MIENSHAO ]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HONCHKROW, Species.TALONFLAME ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.gender = Gender.MALE;
+ }))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CLAWITZER, Species.DRAGALGE ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.HELIOLISK, Species.MALAMAR ]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ })),
+ [TrainerType.LYSANDRE_2]: new TrainerConfig(++t).setName("Lysandre").initForEvilTeamLeader("Flare Boss", [], true).setMixedBattleBgm("battle_flare_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([Species.SCREAM_TAIL, Species.FLUTTER_MANE], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.PYROAR ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.gender = Gender.MALE;
+ }))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.IRON_MOTH ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GOODRA, Species.HISUI_GOODRA ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GYARADOS ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.ULTRA_BALL;
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([Species.YVELTAL], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.LUSAMINE]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", []).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.LILLIGANT, Species.HISUI_LILLIGANT ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALAR_SLOWBRO, Species.GALAR_SLOWKING ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BEWEAR ]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.LUSAMINE_2]: new TrainerConfig(++t).setName("Lusamine").initForEvilTeamLeader("Aether Boss", [], true).setMixedBattleBgm("battle_aether_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.CLEFABLE ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.MILOTIC, Species.PRIMARINA ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.PHEROMOSA ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ }))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.STAKATAKA, Species.CELESTEELA, Species.GUZZLORD ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ }))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.NIHILEGO ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.NECROZMA ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.GUZMA]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", []).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.LOKIX, Species.YANMEGA ]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HERACROSS ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.GALVANTULA, Species.VIKAVOLT]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ })),
+ [TrainerType.GUZMA_2]: new TrainerConfig(++t).setName("Guzma").initForEvilTeamLeader("Skull Boss", [], true).setMixedBattleBgm("battle_skull_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.GOLISOPOD ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 2; //Anticipation
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.HISUI_SAMUROTT, Species.CRAWDAUNT ], TrainerSlot.TRAINER, true, p => {
+ p.abilityIndex = 2; //Sharpness, Adaptability
+ }))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SCIZOR, Species.KLEAVOR ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.PINSIR ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.formIndex = 1;
+ p.generateName();
+ }))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.BUZZWOLE ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.XURKITREE ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ })),
+ [TrainerType.ROSE]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", []).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ]))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.FERROTHORN, Species.ESCAVALIER ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.SIRFETCHD, Species.MR_RIME ]))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.CORVIKNIGHT ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.PERRSERKER, Species.KLINKLANG ]))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.formIndex = 1;
+ p.generateName();
+ })),
+ [TrainerType.ROSE_2]: new TrainerConfig(++t).setName("Rose").initForEvilTeamLeader("Macro Boss", [], true).setMixedBattleBgm("battle_macro_boss").setVictoryBgm("victory_team_plasma")
+ .setPartyMemberFunc(0, getRandomPartyMemberFunc([ Species.ARCHALUDON ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ }))
+ .setPartyMemberFunc(1, getRandomPartyMemberFunc([ Species.AEGISLASH, Species.GHOLDENGO ]))
+ .setPartyMemberFunc(2, getRandomPartyMemberFunc([ Species.DRACOVISH, Species.DRACOZOLT ], TrainerSlot.TRAINER, true, p => {
+ p.generateAndPopulateMoveset();
+ p.abilityIndex = 1; //Strong Jaw, Hustle
+ }))
+ .setPartyMemberFunc(3, getRandomPartyMemberFunc([ Species.MELMETAL ]))
+ .setPartyMemberFunc(4, getRandomPartyMemberFunc([ Species.GALAR_ARTICUNO, Species.GALAR_ZAPDOS, Species.GALAR_MOLTRES ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.pokeball = PokeballType.MASTER_BALL;
+ }))
+ .setPartyMemberFunc(5, getRandomPartyMemberFunc([ Species.COPPERAJAH ], TrainerSlot.TRAINER, true, p => {
+ p.setBoss(true, 2);
+ p.generateAndPopulateMoveset();
+ p.formIndex = 1;
+ p.generateName();
+ })),
+};
diff --git a/src/data/type.ts b/src/data/type.ts
index 7a9f7f3605e..47bea8dd72b 100644
--- a/src/data/type.ts
+++ b/src/data/type.ts
@@ -23,7 +23,7 @@ export enum Type {
export type TypeDamageMultiplier = 0 | 0.125 | 0.25 | 0.5 | 1 | 2 | 4 | 8;
-export function getTypeDamageMultiplier(attackType: integer, defType: integer): TypeDamageMultiplier {
+export function getTypeDamageMultiplier(attackType: Type, defType: Type): TypeDamageMultiplier {
if (attackType === Type.UNKNOWN || defType === Type.UNKNOWN) {
return 1;
}
@@ -33,26 +33,10 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
switch (attackType) {
case Type.FIGHTING:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.ROCK:
- case Type.BUG:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.GHOST:
- default:
return 0;
+ default:
+ return 1;
}
case Type.FIGHTING:
switch (attackType) {
@@ -60,25 +44,12 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.PSYCHIC:
case Type.FAIRY:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.POISON:
- case Type.GROUND:
- case Type.GHOST:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.ICE:
- case Type.DRAGON:
- return 1;
case Type.ROCK:
case Type.BUG:
case Type.DARK:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.FLYING:
switch (attackType) {
@@ -86,43 +57,20 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.ELECTRIC:
case Type.ICE:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.POISON:
- case Type.GHOST:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.FIGHTING:
case Type.BUG:
case Type.GRASS:
return 0.5;
case Type.GROUND:
- default:
return 0;
+ default:
+ return 1;
}
case Type.POISON:
switch (attackType) {
case Type.GROUND:
case Type.PSYCHIC:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.ROCK:
- case Type.GHOST:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.ELECTRIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.DARK:
- return 1;
case Type.FIGHTING:
case Type.POISON:
case Type.BUG:
@@ -130,7 +78,7 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.FAIRY:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.GROUND:
switch (attackType) {
@@ -138,25 +86,13 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.GRASS:
case Type.ICE:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.FLYING:
- case Type.GROUND:
- case Type.BUG:
- case Type.GHOST:
- case Type.STEEL:
- case Type.FIRE:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.POISON:
case Type.ROCK:
return 0.5;
case Type.ELECTRIC:
- default:
return 0;
+ default:
+ return 1;
}
case Type.ROCK:
switch (attackType) {
@@ -166,23 +102,13 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.WATER:
case Type.GRASS:
return 2;
- case Type.ROCK:
- case Type.BUG:
- case Type.GHOST:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.NORMAL:
case Type.FLYING:
case Type.POISON:
case Type.FIRE:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.BUG:
switch (attackType) {
@@ -190,51 +116,26 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.ROCK:
case Type.FIRE:
return 2;
- case Type.NORMAL:
- case Type.POISON:
- case Type.BUG:
- case Type.GHOST:
- case Type.STEEL:
- case Type.WATER:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.FIGHTING:
case Type.GROUND:
case Type.GRASS:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.GHOST:
switch (attackType) {
case Type.GHOST:
case Type.DARK:
return 2;
- case Type.FLYING:
- case Type.GROUND:
- case Type.ROCK:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.FAIRY:
- return 1;
case Type.POISON:
case Type.BUG:
return 0.5;
case Type.NORMAL:
case Type.FIGHTING:
- default:
return 0;
+ default:
+ return 1;
}
case Type.STEEL:
switch (attackType) {
@@ -242,11 +143,6 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.GROUND:
case Type.FIRE:
return 2;
- case Type.GHOST:
- case Type.WATER:
- case Type.ELECTRIC:
- case Type.DARK:
- return 1;
case Type.NORMAL:
case Type.FLYING:
case Type.ROCK:
@@ -259,8 +155,9 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.FAIRY:
return 0.5;
case Type.POISON:
- default:
return 0;
+ default:
+ return 1;
}
case Type.FIRE:
switch (attackType) {
@@ -268,16 +165,6 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.ROCK:
case Type.WATER:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.FLYING:
- case Type.POISON:
- case Type.GHOST:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- return 1;
case Type.BUG:
case Type.STEEL:
case Type.FIRE:
@@ -286,33 +173,20 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.FAIRY:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.WATER:
switch (attackType) {
case Type.GRASS:
case Type.ELECTRIC:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.ROCK:
- case Type.BUG:
- case Type.GHOST:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.STEEL:
case Type.FIRE:
case Type.WATER:
case Type.ICE:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.GRASS:
switch (attackType) {
@@ -322,49 +196,24 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.FIRE:
case Type.ICE:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.ROCK:
- case Type.GHOST:
- case Type.STEEL:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.GROUND:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.ELECTRIC:
switch (attackType) {
case Type.GROUND:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.POISON:
- case Type.ROCK:
- case Type.BUG:
- case Type.GHOST:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.FLYING:
case Type.STEEL:
case Type.ELECTRIC:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.PSYCHIC:
switch (attackType) {
@@ -372,25 +221,11 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.GHOST:
case Type.DARK:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.ROCK:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.ICE:
- case Type.DRAGON:
- case Type.FAIRY:
- return 1;
case Type.FIGHTING:
case Type.PSYCHIC:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.ICE:
switch (attackType) {
@@ -399,24 +234,10 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.STEEL:
case Type.FIRE:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.BUG:
- case Type.GHOST:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.DRAGON:
- case Type.DARK:
- case Type.FAIRY:
- return 1;
case Type.ICE:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.DRAGON:
switch (attackType) {
@@ -424,25 +245,13 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.DRAGON:
case Type.FAIRY:
return 2;
- case Type.NORMAL:
- case Type.FIGHTING:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.ROCK:
- case Type.BUG:
- case Type.GHOST:
- case Type.STEEL:
- case Type.PSYCHIC:
- case Type.DARK:
- return 1;
case Type.FIRE:
case Type.WATER:
case Type.GRASS:
case Type.ELECTRIC:
return 0.5;
default:
- return 0;
+ return 1;
}
case Type.DARK:
switch (attackType) {
@@ -450,106 +259,33 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer):
case Type.BUG:
case Type.FAIRY:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.POISON:
- case Type.GROUND:
- case Type.ROCK:
- case Type.STEEL:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.ICE:
- case Type.DRAGON:
- return 1;
case Type.GHOST:
case Type.DARK:
return 0.5;
case Type.PSYCHIC:
- default:
return 0;
+ default:
+ return 1;
}
case Type.FAIRY:
switch (attackType) {
case Type.POISON:
case Type.STEEL:
return 2;
- case Type.NORMAL:
- case Type.FLYING:
- case Type.GROUND:
- case Type.ROCK:
- case Type.GHOST:
- case Type.FIRE:
- case Type.WATER:
- case Type.GRASS:
- case Type.ELECTRIC:
- case Type.PSYCHIC:
- case Type.ICE:
- case Type.FAIRY:
- return 1;
case Type.FIGHTING:
case Type.BUG:
case Type.DARK:
return 0.5;
case Type.DRAGON:
- default:
return 0;
+ default:
+ return 1;
}
case Type.STELLAR:
return 1;
}
- return 0;
-}
-
-/**
- * Retrieve the types resisting a given type
- * @returns An array populated with Types, or an empty array if no resistances exist (Unknown or Stellar type)
- */
-export function getTypeResistances(type: number): Type[] {
- switch (type) {
- case Type.NORMAL:
- return [Type.ROCK, Type.STEEL, Type.GHOST];
- case Type.FIGHTING:
- return [Type.FLYING, Type.POISON, Type.BUG, Type.PSYCHIC, Type.FAIRY, Type.GHOST];
- case Type.FLYING:
- return [Type.ROCK, Type.ELECTRIC, Type.STEEL];
- case Type.POISON:
- return [Type.POISON, Type.GROUND, Type.ROCK, Type.GHOST, Type.STEEL];
- case Type.GROUND:
- return [Type.BUG, Type.GRASS, Type.FLYING];
- case Type.ROCK:
- return [Type.FIGHTING, Type.GROUND, Type.STEEL];
- case Type.BUG:
- return [Type.FIGHTING, Type.FLYING, Type.POISON, Type.GHOST, Type.STEEL, Type.FIRE, Type.FAIRY];
- case Type.GHOST:
- return [Type.DARK, Type.NORMAL];
- case Type.STEEL:
- return [Type.STEEL, Type.FIRE, Type.WATER, Type.ELECTRIC];
- case Type.FIRE:
- return [Type.ROCK, Type.FIRE, Type.WATER, Type.DRAGON];
- case Type.WATER:
- return [Type.WATER, Type.GRASS, Type.DRAGON];
- case Type.GRASS:
- return [Type.FLYING, Type.POISON, Type.BUG, Type.STEEL, Type.FIRE, Type.GRASS, Type.DRAGON];
- case Type.ELECTRIC:
- return [Type.GRASS, Type.ELECTRIC, Type.DRAGON, Type.GROUND];
- case Type.PSYCHIC:
- return [Type.STEEL, Type.PSYCHIC];
- case Type.ICE:
- return [Type.STEEL, Type.FIRE, Type.WATER, Type.ICE];
- case Type.DRAGON:
- return [Type.STEEL, Type.FAIRY];
- case Type.DARK:
- return [Type.FIGHTING, Type.DARK, Type.FAIRY];
- case Type.FAIRY:
- return [Type.POISON, Type.STEEL, Type.FIRE];
- case Type.UNKNOWN:
- case Type.STELLAR:
- default:
- return [];
- }
+ return 1;
}
/**
diff --git a/src/enums/arena-tag-type.ts b/src/enums/arena-tag-type.ts
index 1265b815bf4..1c79750c91a 100644
--- a/src/enums/arena-tag-type.ts
+++ b/src/enums/arena-tag-type.ts
@@ -22,5 +22,6 @@ export enum ArenaTagType {
CRAFTY_SHIELD = "CRAFTY_SHIELD",
TAILWIND = "TAILWIND",
HAPPY_HOUR = "HAPPY_HOUR",
+ SAFEGUARD = "SAFEGUARD",
NO_CRIT = "NO_CRIT"
}
diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts
index b133b442801..20ceb1b331f 100644
--- a/src/enums/battler-tag-type.ts
+++ b/src/enums/battler-tag-type.ts
@@ -69,5 +69,7 @@ export enum BattlerTagType {
GULP_MISSILE_ARROKUDA = "GULP_MISSILE_ARROKUDA",
GULP_MISSILE_PIKACHU = "GULP_MISSILE_PIKACHU",
BEAK_BLAST_CHARGING = "BEAK_BLAST_CHARGING",
- SHELL_TRAP = "SHELL_TRAP"
+ SHELL_TRAP = "SHELL_TRAP",
+ DRAGON_CHEER = "DRAGON_CHEER",
+ NO_RETREAT = "NO_RETREAT",
}
diff --git a/src/enums/challenges.ts b/src/enums/challenges.ts
index 690e1cdc32d..c4dc7460dfe 100644
--- a/src/enums/challenges.ts
+++ b/src/enums/challenges.ts
@@ -3,5 +3,6 @@ export enum Challenges {
SINGLE_TYPE,
LOWER_MAX_STARTER_COST,
LOWER_STARTER_POINTS,
- FRESH_START
+ FRESH_START,
+ INVERSE_BATTLE,
}
diff --git a/src/enums/shop-cursor-target.ts b/src/enums/shop-cursor-target.ts
index d2f72fed0d6..11f524399b2 100644
--- a/src/enums/shop-cursor-target.ts
+++ b/src/enums/shop-cursor-target.ts
@@ -1,13 +1,13 @@
/**
- * Determines the cursor target when entering the shop phase.
+ * Determines the row cursor target when entering the shop phase.
*/
export enum ShopCursorTarget {
- /** Cursor points to Reroll */
+ /** Cursor points to Reroll row */
REROLL,
- /** Cursor points to Items */
- ITEMS,
- /** Cursor points to Shop */
+ /** Cursor points to Rewards row */
+ REWARDS,
+ /** Cursor points to Shop row */
SHOP,
- /** Cursor points to Check Team */
+ /** Cursor points to Check Team row */
CHECK_TEAM
}
diff --git a/src/enums/stat.ts b/src/enums/stat.ts
index a40319664d6..a12d53e8559 100644
--- a/src/enums/stat.ts
+++ b/src/enums/stat.ts
@@ -1,8 +1,75 @@
+/** Enum that comprises all possible stat-related attributes, in-battle and permanent, of a Pokemon. */
export enum Stat {
+ /** Hit Points */
HP = 0,
+ /** Attack */
ATK,
+ /** Defense */
DEF,
+ /** Special Attack */
SPATK,
+ /** Special Defense */
SPDEF,
+ /** Speed */
SPD,
+ /** Accuracy */
+ ACC,
+ /** Evasiveness */
+ EVA
+}
+
+/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode PermanentStat}. */
+export const PERMANENT_STATS = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
+/** Type used to describe the core, permanent stats of a Pokemon. */
+export type PermanentStat = typeof PERMANENT_STATS[number];
+
+/** A constant array comprised of the {@linkcode Stat} values that make up {@linkcode EFfectiveStat}. */
+export const EFFECTIVE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD ] as const;
+/** Type used to describe the intersection of core stats and stats that have stages in battle. */
+export type EffectiveStat = typeof EFFECTIVE_STATS[number];
+
+/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode BattleStat}. */
+export const BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC, Stat.EVA ] as const;
+/** Type used to describe the stats that have stages which can be incremented and decremented in battle. */
+export type BattleStat = typeof BATTLE_STATS[number];
+
+/** A constant array comprised of {@linkcode Stat} the values that make up {@linkcode TempBattleStat}. */
+export const TEMP_BATTLE_STATS = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.SPD, Stat.ACC ] as const;
+/** Type used to describe the stats that have X item (`TEMP_STAT_STAGE_BOOSTER`) equivalents. */
+export type TempBattleStat = typeof TEMP_BATTLE_STATS[number];
+
+/**
+ * Provides the translation key corresponding to the amount of stat stages and whether those stat stages
+ * are positive or negative.
+ * @param stages the amount of stages
+ * @param isIncrease dictates a negative (`false`) or a positive (`true`) stat stage change
+ * @returns the translation key fitting the conditions described by {@linkcode stages} and {@linkcode isIncrease}
+ */
+export function getStatStageChangeDescriptionKey(stages: number, isIncrease: boolean) {
+ if (stages === 1) {
+ return isIncrease ? "battle:statRose" : "battle:statFell";
+ } else if (stages === 2) {
+ return isIncrease ? "battle:statSharplyRose" : "battle:statHarshlyFell";
+ } else if (stages <= 6) {
+ return isIncrease ? "battle:statRoseDrastically" : "battle:statSeverelyFell";
+ }
+ return isIncrease ? "battle:statWontGoAnyHigher" : "battle:statWontGoAnyLower";
+}
+
+/**
+ * Provides the translation key corresponding to a given stat which can be translated into its full name.
+ * @param stat the {@linkcode Stat} to be translated
+ * @returns the translation key corresponding to the given {@linkcode Stat}
+ */
+export function getStatKey(stat: Stat) {
+ return `pokemonInfo:Stat.${Stat[stat]}`;
+}
+
+/**
+ * Provides the translation key corresponding to a given stat which can be translated into its shortened name.
+ * @param stat the {@linkcode Stat} to be translated
+ * @returns the translation key corresponding to the given {@linkcode Stat}
+ */
+export function getShortenedStatKey(stat: PermanentStat) {
+ return `pokemonInfo:Stat.${Stat[stat]}shortened`;
}
diff --git a/src/field/arena.ts b/src/field/arena.ts
index 7622b9a014f..e8defbd1a8e 100644
--- a/src/field/arena.ts
+++ b/src/field/arena.ts
@@ -339,7 +339,10 @@ export class Arena {
*/
triggerWeatherBasedFormChanges(): void {
this.scene.getField(true).forEach( p => {
- if (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM) {
+ const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST) && p.species.speciesId === Species.CASTFORM);
+ const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT) && p.species.speciesId === Species.CHERRIM);
+
+ if (isCastformWithForecast || isCherrimWithFlowerGift) {
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
this.scene.triggerPokemonFormChange(p, SpeciesFormChangeWeatherTrigger);
}
@@ -351,7 +354,10 @@ export class Arena {
*/
triggerWeatherBasedFormChangesToNormal(): void {
this.scene.getField(true).forEach( p => {
- if (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM) {
+ const isCastformWithForecast = (p.hasAbility(Abilities.FORECAST, false, true) && p.species.speciesId === Species.CASTFORM);
+ const isCherrimWithFlowerGift = (p.hasAbility(Abilities.FLOWER_GIFT, false, true) && p.species.speciesId === Species.CHERRIM);
+
+ if (isCastformWithForecast || isCherrimWithFlowerGift) {
new ShowAbilityPhase(this.scene, p.getBattlerIndex());
return this.scene.triggerPokemonFormChange(p, SpeciesFormChangeRevertWeatherFormTrigger);
}
diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts
index 8a3a6b280cb..e0a9a4a86ce 100644
--- a/src/field/pokemon.ts
+++ b/src/field/pokemon.ts
@@ -3,26 +3,24 @@ import BattleScene, { AnySound } from "../battle-scene";
import { Variant, VariantSet, variantColorCache } from "#app/data/variant";
import { variantData } from "#app/data/variant";
import BattleInfo, { PlayerBattleInfo, EnemyBattleInfo } from "../ui/battle-info";
-import Move, { HighCritAttr, HitsTagAttr, applyMoveAttrs, FixedDamageAttr, VariableAtkAttr, allMoves, MoveCategory, TypelessAttr, CritOnlyAttr, getMoveTargets, OneHitKOAttr, VariableMoveTypeAttr, VariableDefAttr, AttackMove, ModifiedDamageAttr, VariableMoveTypeMultiplierAttr, IgnoreOpponentStatChangesAttr, SacrificialAttr, VariableMoveCategoryAttr, CounterDamageAttr, StatChangeAttr, RechargeAttr, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../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, ChargeAttr, IgnoreWeatherTypeDebuffAttr, BypassBurnDamageReductionAttr, SacrificialAttrOnHit, OneHitKOAccuracyAttr, RespectAttackTypeImmunityAttr } from "../data/move";
import { default as PokemonSpecies, PokemonSpeciesForm, SpeciesFormKey, getFusedSpeciesName, getPokemonSpecies, getPokemonSpeciesForm, getStarterValueFriendshipCap, speciesStarters, starterPassiveAbilities } from "../data/pokemon-species";
import { Constructor } from "#app/utils";
import * as Utils from "../utils";
import { Type, TypeDamageMultiplier, getTypeDamageMultiplier, getTypeRgb } from "../data/type";
import { getLevelTotalExp } from "../data/exp";
-import { Stat } from "../data/pokemon-stat";
-import { DamageMoneyRewardModifier, EnemyDamageBoosterModifier, EnemyDamageReducerModifier, EnemyEndureChanceModifier, EnemyFusionChanceModifier, HiddenAbilityRateBoosterModifier, PokemonBaseStatModifier, PokemonFriendshipBoosterModifier, PokemonHeldItemModifier, PokemonNatureWeightModifier, ShinyRateBoosterModifier, SurviveDamageModifier, TempBattleStatBoosterModifier, StatBoosterModifier, CritBoosterModifier, TerastallizeModifier } from "../modifier/modifier";
+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 } from "../modifier/modifier";
import { PokeballType } from "../data/pokeball";
import { Gender } from "../data/gender";
import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims";
import { Status, StatusEffect, getRandomStatus } from "../data/status-effect";
import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions";
import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms";
-import { BattleStat } from "../data/battle-stat";
-import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag } from "../data/battler-tags";
+import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags";
import { WeatherType } from "../data/weather";
-import { TempBattleStat } from "../data/temp-battle-stat";
import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag";
-import { Ability, AbAttr, BattleStatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatChangesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyBattleStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldBattleStatMultiplierAbAttrs, FieldMultiplyBattleStatAbAttr, AddSecondStrikeAbAttr, IgnoreOpponentEvasionAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr } from "../data/ability";
+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 } from "../data/ability";
import PokemonData from "../system/pokemon-data";
import { BattlerIndex } from "../battle";
import { Mode } from "../ui/ui";
@@ -40,7 +38,7 @@ import Overrides from "#app/overrides";
import i18next from "i18next";
import { speciesEggMoves } from "../data/egg-moves";
import { ModifierTier } from "../modifier/modifier-tier";
-import { applyChallenges, ChallengeType } from "#app/data/challenge.js";
+import { applyChallenges, ChallengeType } from "#app/data/challenge";
import { Abilities } from "#enums/abilities";
import { ArenaTagType } from "#enums/arena-tag-type";
import { BattleSpec } from "#enums/battle-spec";
@@ -49,16 +47,17 @@ import { BerryType } from "#enums/berry-type";
import { Biome } from "#enums/biome";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { DamagePhase } from "#app/phases/damage-phase.js";
-import { FaintPhase } from "#app/phases/faint-phase.js";
-import { LearnMovePhase } from "#app/phases/learn-move-phase.js";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase.js";
-import { MoveEndPhase } from "#app/phases/move-end-phase.js";
-import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase.js";
-import { StatChangePhase } from "#app/phases/stat-change-phase.js";
-import { SwitchSummonPhase } from "#app/phases/switch-summon-phase.js";
-import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase.js";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { DamagePhase } from "#app/phases/damage-phase";
+import { FaintPhase } from "#app/phases/faint-phase";
+import { LearnMovePhase } from "#app/phases/learn-move-phase";
+import { MoveEffectPhase } from "#app/phases/move-effect-phase";
+import { MoveEndPhase } from "#app/phases/move-end-phase";
+import { ObtainStatusEffectPhase } from "#app/phases/obtain-status-effect-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
+import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
+import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase";
+import { Challenges } from "#enums/challenges";
export enum FieldPosition {
CENTER,
@@ -118,6 +117,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
public maskEnabled: boolean;
public maskSprite: Phaser.GameObjects.Sprite | null;
+ public usedTMs: Moves[];
+
private shinySparkle: Phaser.GameObjects.Sprite;
constructor(scene: BattleScene, x: number, y: number, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
@@ -132,9 +133,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.scene.applyModifiers(HiddenAbilityRateBoosterModifier, true, hiddenAbilityChance);
}
- const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
- const randAbilityIndex = Utils.randSeedInt(2);
-
this.species = species;
this.pokeball = dataSource?.pokeball || PokeballType.POKEBALL;
this.level = level;
@@ -145,6 +143,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.abilityIndex = abilityIndex; // Use the provided ability index if it is defined
} else {
// If abilityIndex is not provided, determine it based on species and hidden ability
+ const hasHiddenAbility = !Utils.randSeedInt(hiddenAbilityChance.value);
+ const randAbilityIndex = Utils.randSeedInt(2);
if (species.abilityHidden && hasHiddenAbility) {
// If the species has a hidden ability and the hidden ability is present
this.abilityIndex = 2;
@@ -195,6 +195,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.fusionVariant = dataSource.fusionVariant || 0;
this.fusionGender = dataSource.fusionGender;
this.fusionLuck = dataSource.fusionLuck;
+ this.usedTMs = dataSource.usedTMs ?? [];
} else {
this.id = Utils.randSeedInt(4294967296);
this.ivs = ivs || Utils.getIvsFromId(this.id);
@@ -250,7 +251,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
this.shiny = false;
}
- this.calculateStats();
+ if (!dataSource) {
+ this.calculateStats();
+ }
}
@@ -671,49 +674,139 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
});
}
- getStat(stat: Stat): integer {
+ /**
+ * Retrieves the entire set of stats of the {@linkcode Pokemon}.
+ * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overriden stats (`false`)
+ * @returns the numeric values of the {@linkcode Pokemon}'s stats
+ */
+ getStats(bypassSummonData: boolean = true): number[] {
+ if (!bypassSummonData && this.summonData?.stats) {
+ return this.summonData.stats;
+ }
+ return this.stats;
+ }
+
+ /**
+ * Retrieves the corresponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
+ * @param stat the desired {@linkcode PermanentStat}
+ * @param bypassSummonData prefer actual stats (`true` by default) or in-battle overridden stats (`false`)
+ * @returns the numeric value of the desired {@linkcode Stat}
+ */
+ getStat(stat: PermanentStat, bypassSummonData: boolean = true): number {
+ if (!bypassSummonData && this.summonData && (this.summonData.stats[stat] !== 0)) {
+ return this.summonData.stats[stat];
+ }
return this.stats[stat];
}
- getBattleStat(stat: Stat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer {
- if (stat === Stat.HP) {
- return this.getStat(Stat.HP);
- }
- const battleStat = (stat - 1) as BattleStat;
- const statLevel = new Utils.IntegerHolder(this.summonData.battleStats[battleStat]);
- if (opponent) {
- if (isCritical) {
- switch (stat) {
- case Stat.ATK:
- case Stat.SPATK:
- statLevel.value = Math.max(statLevel.value, 0);
- break;
- case Stat.DEF:
- case Stat.SPDEF:
- statLevel.value = Math.min(statLevel.value, 0);
- break;
- }
- }
- applyAbAttrs(IgnoreOpponentStatChangesAbAttr, opponent, null, false, statLevel);
- if (move) {
- applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, opponent, move, statLevel);
+ /**
+ * Writes the value to the corrseponding {@linkcode PermanentStat} of the {@linkcode Pokemon}.
+ *
+ * Note that this does nothing if {@linkcode value} is less than 0.
+ * @param stat the desired {@linkcode PermanentStat} to be overwritten
+ * @param value the desired numeric value
+ * @param bypassSummonData write to actual stats (`true` by default) or in-battle overridden stats (`false`)
+ */
+ setStat(stat: PermanentStat, value: number, bypassSummonData: boolean = true): void {
+ if (value >= 0) {
+ if (!bypassSummonData && this.summonData) {
+ this.summonData.stats[stat] = value;
+ } else {
+ this.stats[stat] = value;
}
}
- if (this.isPlayer()) {
- this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), battleStat as integer as TempBattleStat, statLevel);
+ }
+
+ /**
+ * Retrieves the entire set of in-battle stat stages of the {@linkcode Pokemon}.
+ * @returns the numeric values of the {@linkcode Pokemon}'s in-battle stat stages if available, a fresh stat stage array otherwise
+ */
+ getStatStages(): number[] {
+ return this.summonData ? this.summonData.statStages : [ 0, 0, 0, 0, 0, 0, 0 ];
+ }
+
+ /**
+ * Retrieves the in-battle stage of the specified {@linkcode BattleStat}.
+ * @param stat the {@linkcode BattleStat} whose stage is desired
+ * @returns the stage of the desired {@linkcode BattleStat} if available, 0 otherwise
+ */
+ getStatStage(stat: BattleStat): number {
+ return this.summonData ? this.summonData.statStages[stat - 1] : 0;
+ }
+
+ /**
+ * Writes the value to the in-battle stage of the corresponding {@linkcode BattleStat} of the {@linkcode Pokemon}.
+ *
+ * Note that, if the value is not within a range of [-6, 6], it will be forced to the closest range bound.
+ * @param stat the {@linkcode BattleStat} whose stage is to be overwritten
+ * @param value the desired numeric value
+ */
+ setStatStage(stat: BattleStat, value: number): void {
+ if (this.summonData) {
+ if (value >= -6) {
+ this.summonData.statStages[stat - 1] = Math.min(value, 6);
+ } else {
+ this.summonData.statStages[stat - 1] = Math.max(value, -6);
+ }
}
- const statValue = new Utils.NumberHolder(this.getStat(stat));
+ }
+
+ /**
+ * Retrieves the critical-hit stage considering the move used and the Pokemon
+ * who used it.
+ * @param source the {@linkcode Pokemon} who using the move
+ * @param move the {@linkcode Move} being used
+ * @returns the final critical-hit stage value
+ */
+ getCritStage(source: Pokemon, move: Move): number {
+ const critStage = new Utils.IntegerHolder(0);
+ applyMoveAttrs(HighCritAttr, source, this, move, critStage);
+ this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critStage);
+ this.scene.applyModifiers(TempCritBoosterModifier, source.isPlayer(), critStage);
+ const bonusCrit = new Utils.BooleanHolder(false);
+ //@ts-ignore
+ if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
+ if (bonusCrit.value) {
+ critStage.value += 1;
+ }
+ }
+ const critBoostTag = source.getTag(CritBoostTag);
+ if (critBoostTag) {
+ if (critBoostTag instanceof DragonCheerTag) {
+ critStage.value += critBoostTag.typesOnAdd.includes(Type.DRAGON) ? 2 : 1;
+ } else {
+ critStage.value += 2;
+ }
+ }
+
+ console.log(`crit stage: +${critStage.value}`);
+ return critStage.value;
+ }
+
+ /**
+ * Calculates and retrieves the final value of a stat considering any held
+ * items, move effects, opponent abilities, and whether there was a critical
+ * hit.
+ * @param stat the desired {@linkcode EffectiveStat}
+ * @param opponent the target {@linkcode Pokemon}
+ * @param move the {@linkcode Move} being used
+ * @param isCritical determines whether a critical hit has occurred or not (`false` by default)
+ * @returns the final in-battle value of a stat
+ */
+ getEffectiveStat(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): integer {
+ const statValue = new Utils.NumberHolder(this.getStat(stat, false));
this.scene.applyModifiers(StatBoosterModifier, this.isPlayer(), this, stat, statValue);
const fieldApplied = new Utils.BooleanHolder(false);
for (const pokemon of this.scene.getField(true)) {
- applyFieldBattleStatMultiplierAbAttrs(FieldMultiplyBattleStatAbAttr, pokemon, stat, statValue, this, fieldApplied);
+ applyFieldStatMultiplierAbAttrs(FieldMultiplyStatAbAttr, pokemon, stat, statValue, this, fieldApplied);
if (fieldApplied.value) {
break;
}
}
- applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, battleStat, statValue);
- let ret = statValue.value * (Math.max(2, 2 + statLevel.value) / Math.max(2, 2 - statLevel.value));
+ applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, stat, statValue);
+ let ret = statValue.value * this.getStatStageMultiplier(stat, opponent, move, isCritical);
+
switch (stat) {
case Stat.ATK:
if (this.getTag(BattlerTagType.SLOW_START)) {
@@ -760,24 +853,25 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (!this.stats) {
this.stats = [ 0, 0, 0, 0, 0, 0 ];
}
- const baseStats = this.getSpeciesForm().baseStats.slice(0);
- if (this.fusionSpecies) {
- const fusionBaseStats = this.getFusionSpeciesForm().baseStats;
- for (let s = 0; s < this.stats.length; s++) {
+
+ // Get and manipulate base stats
+ const baseStats = this.getSpeciesForm(true).baseStats.slice();
+ if (this.isFusion()) {
+ const fusionBaseStats = this.getFusionSpeciesForm(true).baseStats;
+ for (const s of PERMANENT_STATS) {
baseStats[s] = Math.ceil((baseStats[s] + fusionBaseStats[s]) / 2);
}
} else if (this.scene.gameMode.isSplicedOnly) {
- for (let s = 0; s < this.stats.length; s++) {
+ for (const s of PERMANENT_STATS) {
baseStats[s] = Math.ceil(baseStats[s] / 2);
}
}
- this.scene.applyModifiers(PokemonBaseStatModifier, this.isPlayer(), this, baseStats);
- const stats = Utils.getEnumValues(Stat);
- for (const s of stats) {
- const isHp = s === Stat.HP;
- const baseStat = baseStats[s];
- let value = Math.floor(((2 * baseStat + this.ivs[s]) * this.level) * 0.01);
- if (isHp) {
+ this.scene.applyModifiers(BaseStatModifier, this.isPlayer(), this, baseStats);
+
+ // Using base stats, calculate and store stats one by one
+ for (const s of PERMANENT_STATS) {
+ let value = Math.floor(((2 * baseStats[s] + this.ivs[s]) * this.level) * 0.01);
+ if (s === Stat.HP) {
value = value + this.level + 10;
if (this.hasAbility(Abilities.WONDER_GUARD, false, true)) {
value = 1;
@@ -798,7 +892,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
value = Math.max(Math[natureStatMultiplier.value > 1 ? "ceil" : "floor"](value * natureStatMultiplier.value), 1);
}
}
- this.stats[s] = value;
+
+ this.setStat(s, value);
}
}
@@ -933,7 +1028,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (this.metBiome === -1 && !this.scene.gameMode.isFreshStartChallenge() && !this.scene.gameMode.isDaily) {
levelMoves = this.getUnlockedEggMoves().concat(levelMoves);
}
- return levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
+ if (Array.isArray(this.usedTMs) && this.usedTMs.length > 0) {
+ levelMoves = this.usedTMs.filter(m => !levelMoves.includes(m)).concat(levelMoves);
+ }
+ levelMoves = levelMoves.filter(lm => !this.moveset.some(m => m?.moveId === lm));
+ return levelMoves;
}
/**
@@ -1207,6 +1306,28 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return !!this.getTag(GroundedTag) || (!this.isOfType(Type.FLYING, true, true) && !this.hasAbility(Abilities.LEVITATE) && !this.getTag(BattlerTagType.MAGNET_RISEN) && !this.getTag(SemiInvulnerableTag));
}
+ /**
+ * Determines whether this Pokemon is prevented from running or switching due
+ * to effects from moves and/or abilities.
+ * @param trappedAbMessages `string[]` If defined, ability trigger messages
+ * (e.g. from Shadow Tag) are forwarded through this array.
+ * @param simulated `boolean` if `true`, applies abilities via simulated calls.
+ * @returns
+ */
+ isTrapped(trappedAbMessages: string[] = [], simulated: boolean = true): boolean {
+ if (this.isOfType(Type.GHOST)) {
+ return false;
+ }
+
+ const trappedByAbility = new Utils.BooleanHolder(false);
+
+ this.scene.getEnemyField()!.forEach(enemyPokemon =>
+ applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated)
+ );
+
+ return (trappedByAbility.value || !!this.getTag(TrappedTag));
+ }
+
/**
* Calculates the type of a move when used by this Pokemon after
* type-changing move and ability attributes have applied.
@@ -1273,6 +1394,11 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
}
+ // Apply Tera Shell's effect to attacks after all immunities are accounted for
+ if (!ignoreAbility && move.category !== MoveCategory.STATUS) {
+ applyPreDefendAbAttrs(FullHpResistTypeAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier);
+ }
+
return (!cancelledHolder.value ? typeMultiplier.value : 0) as TypeDamageMultiplier;
}
@@ -1315,12 +1441,15 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return 1;
}
}
-
- return getTypeDamageMultiplier(moveType, defType);
+ const multiplier = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, defType));
+ applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, multiplier);
+ return multiplier.value;
}).reduce((acc, cur) => acc * cur, 1) as TypeDamageMultiplier;
+ const typeMultiplierAgainstFlying = new Utils.NumberHolder(getTypeDamageMultiplier(moveType, Type.FLYING));
+ applyChallenges(this.scene.gameMode, ChallengeType.TYPE_EFFECTIVENESS, typeMultiplierAgainstFlying);
// Handle strong winds lowering effectiveness of types super effective against pure flying
- if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && getTypeDamageMultiplier(moveType, Type.FLYING) === 2) {
+ if (!ignoreStrongWinds && arena.weather?.weatherType === WeatherType.STRONG_WINDS && !arena.weather.isEffectSuppressed(this.scene) && this.isOfType(Type.FLYING) && typeMultiplierAgainstFlying.value === 2) {
multiplier /= 2;
if (!simulated) {
this.scene.queueMessage(i18next.t("weather:strongWindsEffectMessage"));
@@ -1339,7 +1468,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const types = this.getTypes(true);
const enemyTypes = opponent.getTypes(true, true);
/** Is this Pokemon faster than the opponent? */
- const outspeed = (this.isActive(true) ? this.getBattleStat(Stat.SPD, opponent) : this.getStat(Stat.SPD)) >= opponent.getBattleStat(Stat.SPD, this);
+ const outspeed = (this.isActive(true) ? this.getEffectiveStat(Stat.SPD, opponent) : this.getStat(Stat.SPD, false)) >= opponent.getEffectiveStat(Stat.SPD, this);
/**
* Based on how effective this Pokemon's types are offensively against the opponent's types.
* This score is increased by 25 percent if this Pokemon is faster than the opponent.
@@ -1495,13 +1624,14 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
/**
- * Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID
+ * Function that tries to set a Pokemon shiny based on the trainer's trainer ID and secret ID.
* Endless Pokemon in the end biome are unable to be set to shiny
*
- * The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID
- * F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits
- * The XOR of E and F are then compared to the thresholdOverride (default case 32) to see whether or not to generate a shiny
- * @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance
+ * The exact mechanic is that it calculates E as the XOR of the player's trainer ID and secret ID.
+ * F is calculated as the XOR of the first 16 bits of the Pokemon's ID with the last 16 bits.
+ * The XOR of E and F are then compared to the {@linkcode shinyThreshold} (or {@linkcode thresholdOverride} if set) to see whether or not to generate a shiny.
+ * The base shiny odds are {@linkcode baseShinyChance} / 65536
+ * @param thresholdOverride number that is divided by 2^16 (65536) to get the shiny chance, overrides {@linkcode shinyThreshold} if set (bypassing shiny rate modifiers such as Shiny Charm)
* @returns true if the Pokemon has been set as a shiny, false otherwise
*/
trySetShiny(thresholdOverride?: integer): boolean {
@@ -1516,7 +1646,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
const E = this.scene.gameData.trainerId ^ this.scene.gameData.secretId;
const F = rand1 ^ rand2;
- const shinyThreshold = new Utils.IntegerHolder(32);
+ /** `64/65536 -> 1/1024` */
+ const baseShinyChance = 64;
+ const shinyThreshold = new Utils.IntegerHolder(baseShinyChance);
if (thresholdOverride === undefined) {
if (this.scene.eventManager.isEventActive()) {
shinyThreshold.value *= this.scene.eventManager.getShinyMultiplier();
@@ -1529,9 +1661,6 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
}
this.shiny = (E ^ F) < shinyThreshold.value;
- if ((E ^ F) < 32) {
- console.log("REAL SHINY!!");
- }
if (this.shiny) {
this.initShinySparkle();
@@ -1718,7 +1847,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttr) ? 0.5 : 1)]);
movePool = movePool.map(m => [m[0], m[1] * (!!allMoves[m[0]].hasAttr(SacrificialAttrOnHit) ? 0.5 : 1)]);
// Trainers get a weight bump to stat buffing moves
- movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].getAttrs(StatChangeAttr).some(a => a.levels > 1 && a.selfTarget) ? 1.25 : 1)]);
+ 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)]);
}
@@ -1730,8 +1859,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === MoveCategory.STATUS ? 1 : Math.max(Math.min(allMoves[m[0]].power/maxPower, 1), 0.5))]);
// Weight damaging moves against the lower stat
- const worseCategory: MoveCategory = this.stats[Stat.ATK] > this.stats[Stat.SPATK] ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL;
- const statRatio = worseCategory === MoveCategory.PHYSICAL ? this.stats[Stat.ATK]/this.stats[Stat.SPATK] : this.stats[Stat.SPATK]/this.stats[Stat.ATK];
+ const atk = this.getStat(Stat.ATK);
+ const spAtk = this.getStat(Stat.SPATK);
+ const worseCategory: MoveCategory = atk > spAtk ? MoveCategory.SPECIAL : MoveCategory.PHYSICAL;
+ const statRatio = worseCategory === MoveCategory.PHYSICAL ? atk / spAtk : spAtk / atk;
movePool = movePool.map(m => [m[0], m[1] * (allMoves[m[0]].category === worseCategory ? statRatio : 1)]);
let weightMultiplier = 0.9; // The higher this is the more the game weights towards higher level moves. At 0 all moves are equal weight.
@@ -1917,6 +2048,48 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return this instanceof PlayerPokemon ? this.scene.getPlayerField() : this.scene.getEnemyField();
}
+ /**
+ * Calculates the stat stage multiplier of the user against an opponent.
+ *
+ * Note that this does not apply to evasion or accuracy
+ * @see {@linkcode getAccuracyMultiplier}
+ * @param stat the desired {@linkcode EffectiveStat}
+ * @param opponent the target {@linkcode Pokemon}
+ * @param move the {@linkcode Move} being used
+ * @param isCritical determines whether a critical hit has occurred or not (`false` by default)
+ * @return the stat stage multiplier to be used for effective stat calculation
+ */
+ getStatStageMultiplier(stat: EffectiveStat, opponent?: Pokemon, move?: Move, isCritical: boolean = false): number {
+ const statStage = new Utils.IntegerHolder(this.getStatStage(stat));
+ const ignoreStatStage = new Utils.BooleanHolder(false);
+
+ 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;
+ }
+ }
+ applyAbAttrs(IgnoreOpponentStatStagesAbAttr, opponent, null, false, stat, ignoreStatStage);
+ if (move) {
+ applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, opponent, move, ignoreStatStage);
+ }
+ }
+
+ if (!ignoreStatStage.value) {
+ const statStageMultiplier = new Utils.NumberHolder(Math.max(2, 2 + statStage.value) / Math.max(2, 2 - statStage.value));
+ this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), stat, statStageMultiplier);
+ return Math.min(statStageMultiplier.value, 4);
+ }
+ return 1;
+ }
+
/**
* Calculates the accuracy multiplier of the user against a target.
*
@@ -1933,34 +2106,38 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
return 1;
}
- const userAccuracyLevel = new Utils.IntegerHolder(this.summonData.battleStats[BattleStat.ACC]);
- const targetEvasionLevel = new Utils.IntegerHolder(target.summonData.battleStats[BattleStat.EVA]);
+ const userAccStage = new Utils.IntegerHolder(this.getStatStage(Stat.ACC));
+ const targetEvaStage = new Utils.IntegerHolder(target.getStatStage(Stat.EVA));
- applyAbAttrs(IgnoreOpponentStatChangesAbAttr, target, null, false, userAccuracyLevel);
- applyAbAttrs(IgnoreOpponentStatChangesAbAttr, this, null, false, targetEvasionLevel);
- applyAbAttrs(IgnoreOpponentEvasionAbAttr, this, null, false, targetEvasionLevel);
- applyMoveAttrs(IgnoreOpponentStatChangesAttr, this, target, sourceMove, targetEvasionLevel);
- this.scene.applyModifiers(TempBattleStatBoosterModifier, this.isPlayer(), TempBattleStat.ACC, userAccuracyLevel);
+ const ignoreAccStatStage = new Utils.BooleanHolder(false);
+ const ignoreEvaStatStage = new Utils.BooleanHolder(false);
+
+ applyAbAttrs(IgnoreOpponentStatStagesAbAttr, target, null, false, Stat.ACC, ignoreAccStatStage);
+ applyAbAttrs(IgnoreOpponentStatStagesAbAttr, this, null, false, Stat.EVA, ignoreEvaStatStage);
+ applyMoveAttrs(IgnoreOpponentStatStagesAttr, this, target, sourceMove, ignoreEvaStatStage);
+
+ this.scene.applyModifiers(TempStatStageBoosterModifier, this.isPlayer(), Stat.ACC, userAccStage);
+
+ userAccStage.value = ignoreAccStatStage.value ? 0 : Math.min(userAccStage.value, 6);
+ targetEvaStage.value = ignoreEvaStatStage.value ? 0 : targetEvaStage.value;
if (target.findTag(t => t instanceof ExposedTag)) {
- targetEvasionLevel.value = Math.min(0, targetEvasionLevel.value);
+ targetEvaStage.value = Math.min(0, targetEvaStage.value);
}
const accuracyMultiplier = new Utils.NumberHolder(1);
- if (userAccuracyLevel.value !== targetEvasionLevel.value) {
- accuracyMultiplier.value = userAccuracyLevel.value > targetEvasionLevel.value
- ? (3 + Math.min(userAccuracyLevel.value - targetEvasionLevel.value, 6)) / 3
- : 3 / (3 + Math.min(targetEvasionLevel.value - userAccuracyLevel.value, 6));
+ if (userAccStage.value !== targetEvaStage.value) {
+ accuracyMultiplier.value = userAccStage.value > targetEvaStage.value
+ ? (3 + Math.min(userAccStage.value - targetEvaStage.value, 6)) / 3
+ : 3 / (3 + Math.min(targetEvaStage.value - userAccStage.value, 6));
}
- applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, this, BattleStat.ACC, accuracyMultiplier, false, sourceMove);
+ applyStatMultiplierAbAttrs(StatMultiplierAbAttr, this, Stat.ACC, accuracyMultiplier, false, sourceMove);
const evasionMultiplier = new Utils.NumberHolder(1);
- applyBattleStatMultiplierAbAttrs(BattleStatMultiplierAbAttr, target, BattleStat.EVA, evasionMultiplier);
+ applyStatMultiplierAbAttrs(StatMultiplierAbAttr, target, Stat.EVA, evasionMultiplier);
- accuracyMultiplier.value /= evasionMultiplier.value;
-
- return accuracyMultiplier.value;
+ return accuracyMultiplier.value / evasionMultiplier.value;
}
/**
@@ -2047,22 +2224,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
if (critOnly.value || critAlways) {
isCritical = true;
} else {
- const critLevel = new Utils.IntegerHolder(0);
- applyMoveAttrs(HighCritAttr, source, this, move, critLevel);
- this.scene.applyModifiers(CritBoosterModifier, source.isPlayer(), source, critLevel);
- this.scene.applyModifiers(TempBattleStatBoosterModifier, source.isPlayer(), TempBattleStat.CRIT, critLevel);
- const bonusCrit = new Utils.BooleanHolder(false);
- //@ts-ignore
- if (applyAbAttrs(BonusCritAbAttr, source, null, false, bonusCrit)) { // TODO: resolve ts-ignore. This is a promise. Checking a promise is bogus.
- if (bonusCrit.value) {
- critLevel.value += 1;
- }
- }
- if (source.getTag(BattlerTagType.CRIT_BOOST)) {
- critLevel.value += 2;
- }
- console.log(`crit stage: +${critLevel.value}`);
- const critChance = [24, 8, 2, 1][Math.max(0, Math.min(critLevel.value, 3))];
+ const critChance = [24, 8, 2, 1][Math.max(0, Math.min(this.getCritStage(source, move), 3))];
isCritical = critChance === 1 || !this.scene.randBattleSeedInt(critChance);
if (Overrides.NEVER_CRIT_OVERRIDE) {
isCritical = false;
@@ -2076,8 +2238,8 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
isCritical = false;
}
}
- const sourceAtk = new Utils.IntegerHolder(source.getBattleStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
- const targetDef = new Utils.IntegerHolder(this.getBattleStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
+ const sourceAtk = new Utils.IntegerHolder(source.getEffectiveStat(isPhysical ? Stat.ATK : Stat.SPATK, this, undefined, isCritical));
+ const targetDef = new Utils.IntegerHolder(this.getEffectiveStat(isPhysical ? Stat.DEF : Stat.SPDEF, source, move, isCritical));
const criticalMultiplier = new Utils.NumberHolder(isCritical ? 1.5 : 1);
applyAbAttrs(MultCritAbAttr, source, null, false, criticalMultiplier);
const screenMultiplier = new Utils.NumberHolder(1);
@@ -2488,24 +2650,23 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @param source {@linkcode Pokemon} the pokemon whose stats/Tags are to be passed on from, ie: the Pokemon using Baton Pass
*/
transferSummon(source: Pokemon): void {
- const battleStats = Utils.getEnumValues(BattleStat);
- for (const stat of battleStats) {
- this.summonData.battleStats[stat] = source.summonData.battleStats[stat];
+ // Copy all stat stages
+ for (const s of BATTLE_STATS) {
+ const sourceStage = source.getStatStage(s);
+ if ((this instanceof PlayerPokemon) && (sourceStage === 6)) {
+ this.scene.validateAchv(achvs.TRANSFER_MAX_STAT_STAGE);
+ }
+ this.setStatStage(s, sourceStage);
}
+
for (const tag of source.summonData.tags) {
-
- // bypass those can not be passed via Baton Pass
- const excludeTagTypes = new Set([BattlerTagType.DROWSY, BattlerTagType.INFATUATED, BattlerTagType.FIRE_BOOST]);
-
- if (excludeTagTypes.has(tag.tagType)) {
+ if (!tag.isBatonPassable) {
continue;
}
this.summonData.tags.push(tag);
}
- if (this instanceof PlayerPokemon && source.summonData.battleStats.find(bs => bs === 6)) {
- this.scene.validateAchv(achvs.TRANSFER_MAX_BATTLE_STAT);
- }
+
this.updateInfo();
}
@@ -2748,6 +2909,11 @@ 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)) {
+ return false;
+ }
+
switch (effect) {
case StatusEffect.POISON:
case StatusEffect.TOXIC:
@@ -3313,6 +3479,7 @@ export default interface Pokemon {
export class PlayerPokemon extends Pokemon {
public compatibleTms: Moves[];
+ public usedTms: Moves[];
constructor(scene: BattleScene, species: PokemonSpecies, level: integer, abilityIndex?: integer, formIndex?: integer, gender?: Gender, shiny?: boolean, variant?: Variant, ivs?: integer[], nature?: Nature, dataSource?: Pokemon | PokemonData) {
super(scene, 106, 148, species, level, abilityIndex, formIndex, gender, shiny, variant, ivs, nature, dataSource);
@@ -3336,6 +3503,7 @@ export class PlayerPokemon extends Pokemon {
}
}
this.generateCompatibleTms();
+ this.usedTms = [];
}
initBattleInfo(): void {
@@ -3594,6 +3762,9 @@ export class PlayerPokemon extends Pokemon {
newPokemon.moveset = this.moveset.slice();
newPokemon.moveset = this.copyMoveset();
newPokemon.luck = this.luck;
+ newPokemon.metLevel = this.metLevel;
+ newPokemon.metBiome = this.metBiome;
+ newPokemon.metSpecies = this.metSpecies;
newPokemon.fusionSpecies = this.fusionSpecies;
newPokemon.fusionFormIndex = this.fusionFormIndex;
newPokemon.fusionAbilityIndex = this.fusionAbilityIndex;
@@ -3673,16 +3844,17 @@ export class PlayerPokemon extends Pokemon {
this.scene.gameData.gameStats.pokemonFused++;
// Store the average HP% that each Pokemon has
- const newHpPercent = ((pokemon.hp / pokemon.stats[Stat.HP]) + (this.hp / this.stats[Stat.HP])) / 2;
+ const maxHp = this.getMaxHp();
+ const newHpPercent = ((pokemon.hp / pokemon.getMaxHp()) + (this.hp / maxHp)) / 2;
this.generateName();
this.calculateStats();
// Set this Pokemon's HP to the average % of both fusion components
- this.hp = Math.round(this.stats[Stat.HP] * newHpPercent);
+ this.hp = Math.round(maxHp * newHpPercent);
if (!this.isFainted()) {
// If this Pokemon hasn't fainted, make sure the HP wasn't set over the new maximum
- this.hp = Math.min(this.hp, this.stats[Stat.HP]);
+ this.hp = Math.min(this.hp, maxHp);
this.status = getRandomStatus(this.status, pokemon.status); // Get a random valid status between the two
} else if (!pokemon.isFainted()) {
// If this Pokemon fainted but the other hasn't, make sure the HP wasn't set to zero
@@ -3842,7 +4014,7 @@ export class EnemyPokemon extends Pokemon {
this.moveset = (formIndex !== undefined ? formIndex : this.formIndex)
? [
new PokemonMove(Moves.DYNAMAX_CANNON),
- new PokemonMove(Moves.SLUDGE_BOMB),
+ new PokemonMove(Moves.CROSS_POISON),
new PokemonMove(Moves.FLAMETHROWER),
new PokemonMove(Moves.RECOVER, 0, -4)
]
@@ -3852,6 +4024,9 @@ export class EnemyPokemon extends Pokemon {
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();
@@ -4129,7 +4304,7 @@ export class EnemyPokemon extends Pokemon {
//console.log('damage', damage, 'segment', segmentsBypassed + 1, 'segment size', segmentSize, 'damage needed', Math.round(segmentSize * Math.pow(2, segmentsBypassed + 1)));
}
- damage = hpRemainder + Math.round(segmentSize * segmentsBypassed);
+ damage = Utils.toDmgValue(this.hp - hpThreshold + segmentSize * segmentsBypassed);
clearedBossSegmentIndex = s - segmentsBypassed;
}
break;
@@ -4172,43 +4347,40 @@ export class EnemyPokemon extends Pokemon {
handleBossSegmentCleared(segmentIndex: integer): void {
while (segmentIndex - 1 < this.bossSegmentIndex) {
- let boostedStat = BattleStat.RAND;
+ // Filter out already maxed out stat stages and weigh the rest based on existing stats
+ const leftoverStats = EFFECTIVE_STATS.filter((s: EffectiveStat) => this.getStatStage(s) < 6);
+ const statWeights = leftoverStats.map((s: EffectiveStat) => this.getStat(s, false));
- const battleStats = Utils.getEnumValues(BattleStat).slice(0, -3);
- const statWeights = new Array().fill(battleStats.length).filter((bs: BattleStat) => this.summonData.battleStats[bs] < 6).map((bs: BattleStat) => this.getStat(bs + 1));
- const statThresholds: integer[] = [];
+ let boostedStat: EffectiveStat;
+ const statThresholds: number[] = [];
let totalWeight = 0;
- for (const bs of battleStats) {
- totalWeight += statWeights[bs];
+
+ for (const i in statWeights) {
+ totalWeight += statWeights[i];
statThresholds.push(totalWeight);
}
+ // Pick a random stat from the leftover stats to increase its stages
const randInt = Utils.randSeedInt(totalWeight);
-
- for (const bs of battleStats) {
- if (randInt < statThresholds[bs]) {
- boostedStat = bs;
+ for (const i in statThresholds) {
+ if (randInt < statThresholds[i]) {
+ boostedStat = leftoverStats[i];
break;
}
}
- let statLevels = 1;
+ let stages = 1;
- switch (segmentIndex) {
- case 1:
- if (this.bossSegments >= 3) {
- statLevels++;
- }
- break;
- case 2:
- if (this.bossSegments >= 5) {
- statLevels++;
- }
- break;
+ // increase the boost if the boss has at least 3 segments and we passed last shield
+ if (this.bossSegments >= 3 && this.bossSegmentIndex === 1) {
+ stages++;
+ }
+ // increase the boost if the boss has at least 5 segments and we passed the second to last shield
+ if (this.bossSegments >= 5 && this.bossSegmentIndex === 2) {
+ stages++;
}
- this.scene.unshiftPhase(new StatChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat ], statLevels, true, true));
-
+ this.scene.unshiftPhase(new StatStageChangePhase(this.scene, this.getBattlerIndex(), true, [ boostedStat! ], stages, true, true));
this.bossSegmentIndex--;
}
}
@@ -4265,7 +4437,7 @@ export interface TurnMove {
targets?: BattlerIndex[];
result: MoveResult;
virtual?: boolean;
- turn?: integer;
+ turn?: number;
}
export interface QueuedMove {
@@ -4277,17 +4449,17 @@ export interface QueuedMove {
export interface AttackMoveResult {
move: Moves;
result: DamageResult;
- damage: integer;
+ damage: number;
critical: boolean;
- sourceId: integer;
+ sourceId: number;
sourceBattlerIndex: BattlerIndex;
}
export class PokemonSummonData {
- public battleStats: integer[] = [ 0, 0, 0, 0, 0, 0, 0 ];
+ public statStages: number[] = [ 0, 0, 0, 0, 0, 0, 0 ];
public moveQueue: QueuedMove[] = [];
public disabledMove: Moves = Moves.NONE;
- public disabledTurns: integer = 0;
+ public disabledTurns: number = 0;
public tags: BattlerTag[] = [];
public abilitySuppressed: boolean = false;
public abilitiesApplied: Abilities[] = [];
@@ -4297,14 +4469,14 @@ export class PokemonSummonData {
public ability: Abilities = Abilities.NONE;
public gender: Gender;
public fusionGender: Gender;
- public stats: integer[];
+ public stats: number[] = [ 0, 0, 0, 0, 0, 0 ];
public moveset: (PokemonMove | null)[];
// If not initialized this value will not be populated from save data.
public types: Type[] = [];
}
export class PokemonBattleData {
- public hitCount: integer = 0;
+ public hitCount: number = 0;
public endured: boolean = false;
public berriesEaten: BerryType[] = [];
public abilitiesApplied: Abilities[] = [];
@@ -4313,21 +4485,23 @@ export class PokemonBattleData {
export class PokemonBattleSummonData {
/** The number of turns the pokemon has passed since entering the battle */
- public turnCount: integer = 1;
+ public turnCount: number = 1;
/** The list of moves the pokemon has used since entering the battle */
public moveHistory: TurnMove[] = [];
}
export class PokemonTurnData {
- public flinched: boolean;
- public acted: boolean;
- public hitCount: integer;
- public hitsLeft: integer;
- public damageDealt: integer = 0;
- public currDamageDealt: integer = 0;
- public damageTaken: integer = 0;
+ public flinched: boolean = false;
+ public acted: boolean = false;
+ public hitCount: number;
+ public hitsLeft: number;
+ public damageDealt: number = 0;
+ public currDamageDealt: number = 0;
+ public damageTaken: number = 0;
public attacksReceived: AttackMoveResult[] = [];
public order: number;
+ public statStagesIncreased: boolean = false;
+ public statStagesDecreased: boolean = false;
}
export enum AiType {
diff --git a/src/interfaces/locales.ts b/src/interfaces/locales.ts
index 5f7c52100c1..4405095e0fe 100644
--- a/src/interfaces/locales.ts
+++ b/src/interfaces/locales.ts
@@ -37,8 +37,7 @@ export interface ModifierTypeTranslationEntries {
ModifierType: { [key: string]: ModifierTypeTranslationEntry },
SpeciesBoosterItem: { [key: string]: ModifierTypeTranslationEntry },
AttackTypeBoosterItem: SimpleTranslationEntries,
- TempBattleStatBoosterItem: SimpleTranslationEntries,
- TempBattleStatBoosterStatName: SimpleTranslationEntries,
+ TempStatStageBoosterItem: SimpleTranslationEntries,
BaseStatBoosterItem: SimpleTranslationEntries,
EvolutionItem: SimpleTranslationEntries,
FormChangeItem: SimpleTranslationEntries,
diff --git a/src/loading-scene.ts b/src/loading-scene.ts
index f4aa12c56c6..f6bc41f744d 100644
--- a/src/loading-scene.ts
+++ b/src/loading-scene.ts
@@ -41,8 +41,6 @@ export class LoadingScene extends SceneBase {
this.loadImage("loading_bg", "arenas");
this.loadImage("logo", "");
- // this.loadImage("pride-update", "events");
- this.loadImage("august-variant-update", "events");
// Load menu images
this.loadAtlas("bg", "ui");
@@ -80,6 +78,7 @@ export class LoadingScene extends SceneBase {
this.loadAtlas("overlay_hp_boss", "ui");
this.loadImage("overlay_exp", "ui");
this.loadImage("icon_owned", "ui");
+ this.loadImage("icon_egg_move", "ui");
this.loadImage("ability_bar_left", "ui");
this.loadImage("bgm_bar", "ui");
this.loadImage("party_exp_bar", "ui");
@@ -100,6 +99,8 @@ export class LoadingScene extends SceneBase {
this.loadImage("ha_capsule", "ui", "ha_capsule.png");
this.loadImage("champion_ribbon", "ui", "champion_ribbon.png");
this.loadImage("icon_spliced", "ui");
+ this.loadImage("icon_lock", "ui", "icon_lock.png");
+ this.loadImage("icon_stop", "ui", "icon_stop.png");
this.loadImage("icon_tera", "ui");
this.loadImage("type_tera", "ui");
this.loadAtlas("type_bgs", "ui");
@@ -246,7 +247,12 @@ export class LoadingScene extends SceneBase {
} else {
this.loadAtlas("types", "");
}
-
+ const availableLangs = ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"];
+ if (lang && availableLangs.includes(lang)) {
+ this.loadImage("september-update-"+lang, "events");
+ } else {
+ this.loadImage("september-update-en", "events");
+ }
this.loadAtlas("statuses", "");
this.loadAtlas("categories", "");
@@ -267,6 +273,7 @@ export class LoadingScene extends SceneBase {
this.loadImage("gacha_knob", "egg");
this.loadImage("egg_list_bg", "ui");
+ this.loadImage("egg_summary_bg", "ui");
this.loadImage("end_m", "cg");
this.loadImage("end_f", "cg");
@@ -342,8 +349,8 @@ export class LoadingScene extends SceneBase {
this.loadLoadingScreen();
- initVouchers();
initAchievements();
+ initVouchers();
initStatsKeys();
initPokemonPrevolutions();
initBiomes();
diff --git a/src/locales/ca_ES/config.ts b/src/locales/ca_ES/config.ts
index 514c7fb63c7..4d8f6c9dc59 100644
--- a/src/locales/ca_ES/config.ts
+++ b/src/locales/ca_ES/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const caEsConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/ca_ES/dialogue-double-battle-female.json b/src/locales/ca_ES/dialogue-double-battle.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-double-battle-female.json
rename to src/locales/ca_ES/dialogue-double-battle.json
diff --git a/src/locales/ca_ES/dialogue-double-battle-male.json b/src/locales/ca_ES/dialogue-final-boss.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-double-battle-male.json
rename to src/locales/ca_ES/dialogue-final-boss.json
diff --git a/src/locales/ca_ES/dialogue-female.json b/src/locales/ca_ES/dialogue-misc.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-female.json
rename to src/locales/ca_ES/dialogue-misc.json
diff --git a/src/locales/ca_ES/dialogue-final-boss-female.json b/src/locales/ca_ES/dialogue.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-final-boss-female.json
rename to src/locales/ca_ES/dialogue.json
diff --git a/src/locales/de/achv.json b/src/locales/de/achv.json
index 0649bcf3169..21a1d89f9d6 100644
--- a/src/locales/de/achv.json
+++ b/src/locales/de/achv.json
@@ -89,7 +89,7 @@
"name": "Bänder-Meister",
"name_female": "Bänder-Meisterin"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Teamwork",
"description": "Nutze Staffette, während der Anwender mindestens eines Statuswertes maximiert hat."
},
@@ -269,5 +269,9 @@
"FRESH_START": {
"name": "Hussa, noch einmal von vorn!",
"description": "Schließe die 'Neuanfang' Herausforderung ab"
+ },
+ "INVERSE_BATTLE": {
+ "name": "Spieglein, Spieglein an der Wand",
+ "description": "Schließe die 'Umkehrkampf' Herausforderung ab"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/de/arena-tag.json b/src/locales/de/arena-tag.json
index 454effae60c..3bed4fefbd0 100644
--- a/src/locales/de/arena-tag.json
+++ b/src/locales/de/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "Der Rückenwind auf deiner Seite hat sich gelegt!",
"tailwindOnRemoveEnemy": "Der Rückenwind auf gegnerischer Seite hat sich gelegt!",
"happyHourOnAdd": "Goldene Zeiten sind angebrochen!",
- "happyHourOnRemove": "Die goldenen Zeiten sind vorbei!"
+ "happyHourOnRemove": "Die goldenen Zeiten sind vorbei!",
+ "safeguardOnAdd": "Das ganze Feld wird von einem Schleier umhüllt!",
+ "safeguardOnAddPlayer": "Das Team des Anwenders wird von einem Schleier umhüllt!",
+ "safeguardOnAddEnemy": "Das gegnerische Team wird von einem Schleier umhüllt!",
+ "safeguardOnRemove": "Der mystische Schleier, der das ganze Feld umgab, hat sich gelüftet!",
+ "safeguardOnRemovePlayer": "Der mystische Schleier, der dein Team umgab, hat sich gelüftet!",
+ "safeguardOnRemoveEnemy": "Der mystische Schleier, der das gegnerische Team umgab, hat sich gelüftet!"
}
\ No newline at end of file
diff --git a/src/locales/de/battle.json b/src/locales/de/battle.json
index 762b5848439..05205b001b6 100644
--- a/src/locales/de/battle.json
+++ b/src/locales/de/battle.json
@@ -94,5 +94,6 @@
"retryBattle": "Möchtest du vom Beginn des Kampfes neustarten?",
"unlockedSomething": "{{unlockedThing}} wurde freigeschaltet.",
"congratulations": "Glückwunsch!",
- "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!"
+ "beatModeFirstTime": "{{speciesName}} hat den {{gameMode}} Modus zum ersten Mal beendet! Du erhältst {{newModifier}}!",
+ "eggSkipPrompt": "Zur Ei-Zusammenfassung springen?"
}
\ No newline at end of file
diff --git a/src/locales/de/challenges.json b/src/locales/de/challenges.json
index 1b41a707a81..c8836c50549 100644
--- a/src/locales/de/challenges.json
+++ b/src/locales/de/challenges.json
@@ -1,10 +1,11 @@
{
+ "noneSelected": "Keine ausgewählt",
"title": "Herausforderungsmodifikatoren",
"illegalEvolution": "{{pokemon}} hat sich in ein Pokémon verwandelt, dass für diese Herausforderung nicht zulässig ist!",
"singleGeneration": {
"name": "Mono-Generation",
"desc": "Du kannst nur Pokémon aus der {{gen}} Generation verwenden.",
- "desc_default": "Du kannst nur Pokémon gewählten Generation verwenden.",
+ "desc_default": "Du kannst nur Pokémon aus der gewählten Generation verwenden.",
"gen_1": "ersten",
"gen_2": "zweiten",
"gen_3": "dritten",
@@ -25,5 +26,12 @@
"desc": "Du kannst nur die ursprünglichen Starter verwenden, genau so, als hättest du gerade erst mit Pokérogue begonnen.",
"value.0": "Aus",
"value.1": "An"
+ },
+ "inverseBattle": {
+ "name": "Umkehrkampf",
+ "shortName": "Umkehrkampf",
+ "desc": "Die Typen-Effektivität wird umgekehrt, und kein Typ ist gegen einen anderen Typ immun.\nDeaktiviert die Erfolge anderer Herausforderungen.",
+ "value.0": "Aus",
+ "value.1": "An"
}
}
\ No newline at end of file
diff --git a/src/locales/de/config.ts b/src/locales/de/config.ts
index afefd98a0cb..772bfb6d1d5 100644
--- a/src/locales/de/config.ts
+++ b/src/locales/de/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const deConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/de/dialogue-double-battle-male.json b/src/locales/de/dialogue-double-battle-male.json
deleted file mode 100644
index ec7cf375c0c..00000000000
--- a/src/locales/de/dialogue-double-battle-male.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "Blau: Hey Rot, lass uns ihnen zeigen, was wir drauf haben!\n$Rot: ...\n$Blau: Das ist die Macht von Alabastia!"
- },
- "victory": {
- "1": "Blau: Das war ein großartiger Kampf!\n$Rot: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "Rot: ...!\n$Blau: Er redet nicht viel...\n$Blau: Aber lass dich davon nicht täuschen! Er ist schließlich ein Champ!"
- },
- "victory": {
- "1": "Rot: ...!\n$Blau: Das nächste Mal gewinnen wir!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "Ben: Hehehe...Bist du überrascht?\n$Svenja: Wir sind zwei Arenaleiter auf einmal!\n$Ben: Wir sind Zwillinge!\n$Svenja: Wir müssen nicht reden um uns gegenseitig zu verstehen!\n$Ben: Die doppelte Kraft...\n$Svenja: Kannst du ihr standhalten?"
- },
- "victory": {
- "1": "Ben: Was? Unsere Kombination war perfekt!\n$Svenja: Sieht so aus als müssten wir wohl mehr tranieren..."
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "Svenja: Hihihi... Bist du überrascht?\n$Ben: Ja, wir sind wirklich zwei Arenaleiter auf einmal!\n$Svenja: Das ist mein Zwillingsbruder Ben!\n$Ben: Und das meine Zwillingsschwester Svenja!\n$Svenja: Wir sind die perfekte Kombo!"
- },
- "victory": {
- "1": "Svenja: Sind wir...\n$Ben: ...nicht so stark wie wir dachten?"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "Troy: Wassili, lass uns ihnen die Kraft von Champions zeigen!\n$Wassili: Wir zeigen dir die Kraft von Hoenn!\n$Troy: Los gehts!"
- },
- "victory": {
- "1": "Troy: Das war ein großartiger Kampf!\n$Wassili: Das nächste Mal gewinnen wir!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "Troy: Hast du irgendwelche seltenen Pokémon?\n$Wassili: Troy... Wir sind hier um zu kämpfen und nicht um mit unseren Pokémon zu prahlen...\n$Troy: Oh... Wenn das so ist... Lass uns anfangen!"
- },
- "victory": {
- "1": "Troy: Jetzt da wir mit Kämpfen fertig sind... Lass uns mit unsereren Pokémon prahlen!\n$Wassili: Troy..."
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "Lauro: Wir sind die stärksten Trainer aus Einall!\n$Lilia: Kämpfe gegen starke Trainer machen am meisten Spaß!"
- },
- "victory": {
- "1": "Lauro: Wow! Du bist super stark!\n$Lilia: Beim nächsten Mal schlagen wir dich!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "Lilia: Willkommen Herausforderer! Ich bin DER Champion von Einall!\n$Lauro: Lilia, bist du nicht etwas zu aufgeregt?"
- },
- "victory": {
- "1": "Lilia: Eine solche Niederlage ist nicht einfach zu verkraften...\n$Lauro: Aber wir wachsen an unseren Niederlagen und werden immer besser!"
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "Mary: Bruder, lass uns ihnen die Kraft von Spikeford zeigen!\n$Nezz: Wir bringen die Dunkelheit!"
- },
- "victory": {
- "1": "Mary: Du hast Licht in unsere Dunkelheit gebracht!\n$Piers: Es ist viel zu hell..."
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "Nezz: Bereit für ein Konzert?\n$Mary: Bruder...Sie sind hier um zu kämpfen, nicht um zu singen..."
- },
- "victory": {
- "1": "Nezz: Das war mal ein großartiges Konzert!\n$Marnie: Bruder..."
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/de/dialogue-double-battle-female.json b/src/locales/de/dialogue-double-battle.json
similarity index 100%
rename from src/locales/de/dialogue-double-battle-female.json
rename to src/locales/de/dialogue-double-battle.json
diff --git a/src/locales/de/dialogue-final-boss-male.json b/src/locales/de/dialogue-final-boss-male.json
deleted file mode 100644
index bffbd779be0..00000000000
--- a/src/locales/de/dialogue-final-boss-male.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "encounter": "Es scheint, als wäre es wieder mal an der Zeit.\nDu weißt, warum du hierher kommen musst, oder?\n$Dich hat es hierher gezogen, du warst bereits hier.\nUnzählige Male.\n$Obwohl, vielleicht doch nicht unzählig.\nUm genau zu sein, dies ist der {{cycleCount}}te Zyklus.\n$Du verlierst jeden Zyklus dein Gedächtnis. Trotzdem \nbleibt etwas, ein Teil deines ehemaligen Ichs, erhalten.\n$Bis jetzt hast du es noch nicht vollbracht zu siegen, aber dieses Mal spüre ich eine andere Präsenz in dir.\n\n$Du bist der Einzige hier, aber es kommt mir so vor als wäre da...jemand anderes.\n$Wirst du endlich beweisen, dass du ein würdiger Herausforder bist?\nDie Herausforderung auf die ich seit Jahrtausenden warte?\n$Lass uns beginnen.","firstStageWin": "Ahh verstehe. Diese Präsenz, die ich gespürt habe, ist wirklich real.\nEs scheint als müsste ich micht nicht länger zurück halten.\n$Enttäusche mich nicht.",
- "secondStageWin": "…Herrlich."
-}
\ No newline at end of file
diff --git a/src/locales/de/dialogue-final-boss-female.json b/src/locales/de/dialogue-final-boss.json
similarity index 100%
rename from src/locales/de/dialogue-final-boss-female.json
rename to src/locales/de/dialogue-final-boss.json
diff --git a/src/locales/de/dialogue-male.json b/src/locales/de/dialogue-male.json
deleted file mode 100644
index e5bcb81ce52..00000000000
--- a/src/locales/de/dialogue-male.json
+++ /dev/null
@@ -1,2691 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "Hey, willst du kämpfen?",
- "2": "Bist du auch ein neuer Trainer?",
- "3": "Hey, ich habe dich noch nie gesehen. Lass uns kämpfen!",
- "4": "Ich habe gerade verloren und suche nach neuen Pokémon.\nWarte! Du siehst schwach aus! Lass uns kämpfen!",
- "5": "Haben wir uns schon mal getroffen oder nicht? Ich erinnere mich nicht wirklich\n$Nun, ich denke, es ist trotzdem schön, dich zu treffen!",
- "6": "Okay, lass uns kämpfen!",
- "7": "Okay, hier komme ich! Ich zeige dir meine Kraft!",
- "8": "Fan fan fan... Ich zeige dir wie fantastisch meine Pokémon sind!",
- "9": "Es ist nicht nötig, Zeit mit Begrüßungen zu verschwenden.\nSobald du bereit bist geht es los!",
- "10": "Lass deine Deckung nicht fallen, sonst weinst du, wenn dich ein Kind besiegt.",
- "11": "Ich habe meine Pokémon mit großer Sorgfalt aufgezogen. Du darfst ihnen nicht wehtun!",
- "12": "Schön, dass du es geschafft hast! Von hier an wird es nicht einfacher.",
- "13": "Die Kämpfe gehen immer weiter! Willkommen in der Welt ohne Ende!"
- },
- "victory": {
- "1": "Wow! Du bist stark!",
- "2": "Ich hatte keine Chance, oder?",
- "3": "Wenn ich älter bin, werde ich dich besiegen!",
- "4": "Ugh. Ich habe keine Pokémon mehr.",
- "5": "Das kann nicht sein… DAS KANN NICHT SEIN! Wie konnte ich schon wieder verlieren…",
- "6": "Nein! Ich habe verloren!",
- "7": "Wow! Du bist unglaublich! Ich bin erstaunt und überrascht!",
- "8": "Kann es sein… Wie… Meine Pokémon und ich sind die stärksten, aber…",
- "9": "Das nächste Mal werde ich dich besiegen! Lass uns wieder kämpfen!",
- "10": "Man! Kannst du nicht sehen, dass ich nur ein Kind bin? Es war nicht fair von dir, so hart zu kämpfen!",
- "11": "Deine Pokémon sind unglaublich! Tauschst du mit mir?",
- "12": "Ich habe mich ein bisschen mitreißen lassen, worüber habe ich vorhin gesprochen?",
- "13": "Ahaha! Da ist es! Genau! Du bist schon jetzt in dieser Welt zu Hause!"
- }
- },
- "lass": {
- "encounter": {
- "1": "Lass uns kämpfen, wollen wir?",
- "2": "Du siehst wie ein neuer Trainer aus. Lass uns kämpfen!",
- "3": "Ich erkenne dich nicht. Wie wäre es mit einem Kampf?",
- "4": "Lass uns einen lustigen Pokémon-Kampf haben!",
- "5": "Ich zeige dir, wie man Pokémon wirklich einsetzt!",
- "6": "Ein ernsthafter Kampf beginnt mit einem ernsten Anfang! Bist du sicher, dass du bereit bist?",
- "7": "Du bist nur einmal jung. Und du hast nur eine Chance bei einem bestimmten Kampf.\n$Bald wirst du nur noch eine Erinnerung sein.",
- "8": "Du solltest es leicht mit mir angehen, OK? Aber ich kämpfe ernsthaft!",
- "9": "Die Schule ist langweilig. Ich habe nichts zu tun. Gähn. Ich kämpfe nur, um die Zeit totzuschlagen."
- },
- "victory": {
- "1": "Das war beeindruckend! Ich habe noch viel zu lernen.",
- "2": "Ich dachte nicht, dass du mich so schlagen würdest…",
- "3": "Ich hoffe, wir haben eines Tages ein Rematch.",
- "4": "Das war ziemlich erstaunlich! Du hast mich total erschöpft…",
- "5": "Du hast mir tatsächlich eine Lektion erteilt! Du bist ziemlich erstaunlich!",
- "6": "Ernsthaft, ich habe verloren. Das ist, wie, ernsthaft deprimierend, aber du warst ernsthaft cool.",
- "7": "Ich brauche keine Erinnerungen wie diese. Löschen der Erinnerung…",
- "8": "Hey! Ich habe dir gesagt, du sollst es leicht mit mir angehen!\n$Trotzdem bist du ziemlich cool, wenn du ernsthaft bist.",
- "9": "Ich werde langsam müde vom Kämpfen… Es muss etwas Neues zu tun geben…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "Gehorsame Pokémon, eigensinnige Pokémon… Pokémon haben einzigartige Eigenschaften.",
- "2": "Auch wenn meine Erziehung und mein Verhalten schlecht sind, habe ich meine Pokémon gut aufgezogen.",
- "3": "Hmm, disziplinierst du deine Pokémon? Zu viel Verwöhnen ist nicht gut."
- },
- "victory": {
- "1": "Es ist wichtig, die Eigenschaften jedes Pokémon zu pflegen und zu trainieren.",
- "2": "Im Gegensatz zu meinem teuflischen Selbst sind dies einige gute Pokémon.",
- "3": "Zu viel Lob kann sowohl Pokémon als auch Menschen verwöhnen."
- },
- "defeat": {
- "1": "Du solltest nicht wütend auf deine Pokémon werden, auch wenn du einen Kampf verlierst.",
- "2": "Richtig? Ziemlich gute Pokémon, oder? Ich bin dafür geeignet, Dinge großzuziehen.",
- "3": "Egal wie sehr du deine Pokémon liebst,\n$du musst sie trotzdem disziplinieren, wenn sie sich schlecht benehmen."
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "Pokémon verraten dich nie. Sie erwidern die ganze Liebe, die du ihnen gibst.",
- "2": "Soll ich dir einen Tipp geben, wie man gute Pokémon trainiert?",
- "3": "Ich habe diese sehr speziellen Pokémon mit einer speziellen Methode aufgezogen."
- },
- "victory": {
- "1": "Ugh… So sollte das nicht laufen. Habe ich die falsche Mischung verabreicht?",
- "2": "Wie konnte das meinen Pokémon passieren… Was fütterst du deine Pokémon?",
- "3": "Wenn ich verliere, sagt dir das, dass ich nur die Zeit totgeschlagen habe.\n$Es verletzt mein Ego überhaupt nicht."
- },
- "defeat": {
- "1": "Das beweist, dass meine Pokémon meine Liebe angenommen haben.",
- "2": "Der wahre Trick, um gute Pokémon zu trainieren, besteht darin, gute Pokémon zu fangen.",
- "3": "Pokémon werden stark oder schwach, je nachdem, wie du sie großziehst."
- }
- },
- "fisherman": {
- "encounter": {
- "1": "Aack! Du hast mich einen Biss verlieren lassen!\nWas wirst du dagegen tun?",
- "2": "Geh weg! Du erschreckst die Pokémon!",
- "3": "Mal sehen, ob du einen Sieg an Land ziehen kannst!"
- },
- "victory": {
- "1": "Vergiss es einfach.",
- "2": "Nächstes Mal werde ich den Triumph an Land ziehen!",
- "3": "Ich glaube, ich habe die Strömungen diesmal unterschätzt."
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "Woah! Ich habe einen großen Fang gemacht!",
- "2": "Die Leine ist drin, bereit, den Erfolg an Land zu ziehen!",
- "3": "Bereit, Wellen zu schlagen!"
- },
- "victory": {
- "1": "Ich komme mit einem stärkeren Haken zurück.",
- "2": "Ich werde das nächste Mal den Sieg an Land ziehen.",
- "3": "Ich schärfe nur meine Haken für das Comeback!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "Zeit, einzutauchen!",
- "2": "Lass uns die Wellen des Sieges reiten!",
- "3": "Bereit, einen Sprung ins Wasser zu machen!"
- },
- "victory": {
- "1": "Getränkt in Niederlage!",
- "2": "Eine Welle der Niederlage!",
- "3": "Zurück ans Ufer, schätze ich."
- }
- },
- "backpacker": {
- "encounter": {
- "1": "Packe deine Sachen, es geht los!",
- "2": "Mal sehen, ob du mithalten kannst!",
- "3": "Bereit machen, Herausforderer!",
- "4": "Ich habe 20 Jahre damit verbracht, mich selbst zu finden… Aber wo bin ich?"
- },
- "victory": {
- "1": "Diesmal bin ich gestolpert!",
- "2": "Oh, ich glaube, ich bin verloren.",
- "3": "Sackgasse!",
- "4": "Warte eine Sekunde! Hey! Weißt du nicht, wer ich bin?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "Du scheinst ziemlich zuversichtlich zu sein.",
- "2": "Deine Pokémon… Zeig sie mir…",
- "3": "Weil ich ein Ass-Trainer bin, denken die Leute, ich sei stark.",
- "4": "Weißt du, was es braucht, um ein Ass-Trainer zu sein?"
- },
- "victory": {
- "1": "Ja… Du hast gute Pokémon…",
- "2": "Was?! Aber ich bin ein Kampfgott!",
- "3": "Natürlich, du bist der Hauptcharakter!",
- "4": "OK! OK! Du könntest ein Ass-Trainer sein!"
- },
- "defeat": {
- "1": "Ich widme meinen Körper und meine Seele den Pokémon-Kämpfen!",
- "2": "Alles innerhalb meiner Erwartungen… Nichts Überraschendes…",
- "3": "Ich dachte, ich würde zu einem zerbrechlichen Menschen heranwachsen, \n$der aussieht, als würde er zerbrechen, wenn du ihn zu fest drückst.",
- "4": "Natürlich bin ich stark und verliere nicht. Es ist wichtig, dass ich anmutig gewinne."
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "Zeit, das Schlachtfeld mit Eleganz und Anmut zu betreten!"
- },
- "victory": {
- "1": "Meine Eleganz bleibt ungebrochen!"
- }
- },
- "twins": {
- "encounter": {
- "1": "Mach dich bereit, denn wenn wir zusammenarbeiten, gibt es doppelten Ärger!",
- "2": "Zwei Herzen, eine Strategie – mal sehen, ob du mit unserer Zwillingskraft mithalten kannst!",
- "3": "Hoffe, du bist bereit für doppelten Ärger, denn wir werden dir einheizen!"
- },
- "victory": {
- "1": "Wir haben vielleicht diese Runde verloren, aber unsere Bindung bleibt unzerbrechlich!",
- "2": "Unser Zwillingsgeist wird nicht lange getrübt bleiben.",
- "3": "Wir werden als dynamisches Duo stärker zurückkommen!"
- },
- "defeat": {
- "1": "Zwillingskraft herrscht vor!",
- "2": "Zwei Herzen, ein Triumph!",
- "3": "Doppelte Freude, doppelter Siegestanz!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "Mach dich bereit, meinen Staub zu schlucken!",
- "2": "Mach dich bereit, Herausforderer! Ich werde dich im Staub zurücklassen!",
- "3": "Volle Fahrt voraus, mal sehen, ob du mithalten kannst!"
- },
- "victory": {
- "1": "Die Speichen stehen still, aber die Entschlossenheit dreht weiter.",
- "2": "Abgehängt!",
- "3": "Der Weg zum Sieg hat viele Kurven und Wendungen, die es noch zu erkunden gilt."
- }
- },
- "black_belt": {
- "encounter": {
- "1": "Ich lobe deinen Mut, mich herauszufordern! Denn ich bin derjenige mit dem stärksten Tritt!",
- "2": "Oh, ich verstehe. Möchtest du in Stücke geschnitten werden? Oder bevorzugst du die Rolle des Punchingballs?"
- },
- "victory": {
- "1": "Oh. Die Pokémon haben gekämpft. Mein starker Tritt hat überhaupt nicht geholfen.",
- "2": "Hmmm… Wenn ich sowieso verlieren würde, wollte ich wenigstens total vermöbelt werden."
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "Du musst mich nicht beeindrucken. Du kannst gegen mich verlieren."
- },
- "victory": {
- "1": "Es ist schwer, sich zu verabschieden, aber uns läuft die Zeit davon…"
- }
- },
- "hiker": {
- "encounter": {
- "1": "Mein mittelalterlicher Bauch gibt mir so viel Gravitas wie die Berge, die ich besteige!",
- "2": "Ich habe diesen kräftigen Körper von meinen Eltern geerbt… Ich bin wie eine lebende Bergkette…"
- },
- "victory": {
- "1": "Zumindest kann ich nicht verlieren, wenn es um BMI geht!",
- "2": "Es ist nicht genug… Es ist nie genug. Mein schlechtes Cholesterin ist nicht hoch genug…"
- }
- },
- "ranger": {
- "encounter": {
- "1": "Wenn ich von der Natur umgeben bin, hören die meisten anderen Dinge auf, wichtig zu sein.",
- "2": "Wenn ich ohne die Natur in meinem Leben lebe, fühle ich mich wie ein Fisch ohne Wasser."
- },
- "victory": {
- "1": "Es spielt keine Rolle für die Weite der Natur, ob ich gewinne oder verliere…",
- "2": "So etwas ist ziemlich trivial im Vergleich zu den erdrückenden Gefühlen des Stadtlebens."
- },
- "defeat": {
- "1": "Ich habe den Kampf gewonnen. Aber der Sieg ist nichts im Vergleich zur Weite der Natur…",
- "2": "Ich bin sicher, das mein Sieg nur dank der Natur möglich war."
- }
- },
- "scientist": {
- "encounter": {
- "1": "Meine Forschung wird diese Welt zu Frieden und Freude führen."
- },
- "victory": {
- "1": "Ich bin ein Genie… Ich sollte nicht gegen jemanden wie dich verlieren…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "…Heehee. Ich bin zuversichtlich in meine Berechnungen und Analysen.",
- "2": "Ich sammle so viel Erfahrung wie möglich, weil ich eines Tages ein Arenaleiter sein möchte."
- },
- "victory": {
- "1": "Ohhhh… Berechnungen und Analysen sind kein Gegner für den Zufall…",
- "2": "Auch schwierige, anstrengende Erfahrungen haben ihren Zweck, denke ich."
- }
- },
- "artist": {
- "encounter": {
- "1": "Früher war ich beliebt, aber jetzt bin ich völlig veraltet."
- },
- "victory": {
- "1": "Mit der Zeit ändern sich auch die Werte. Das habe ich zu spät erkannt."
- }
- },
- "guitarist": {
- "encounter": {
- "1": "Mach dich bereit, den Rhythmus der Niederlage zu spüren, während ich meinen Weg zum Sieg spiele!"
- },
- "victory": {
- "1": "Für den Moment zum Schweigen gebracht, aber meine Melodie der Widerstandsfähigkeit wird weiterspielen."
- }
- },
- "worker": {
- "encounter": {
- "1": "Es stört mich, dass die Leute mich immer missverstehen. Ich bin garnicht so grob wie alle denken."
- },
- "victory": {
- "1": "Ich will wirklich nicht, dass meine Haut verbrennt, also möchte ich im Schatten arbeiten."
- }
- },
- "worker_female": {
- "encounter": {
- "1": "Es stört mich, dass die Leute mich immer missverstehen. Ich bin garnicht so grob wie alle denken."
- },
- "victory": {
- "1": "Ich will wirklich nicht, dass meine Haut verbrennt, also möchte ich im Schatten arbeiten."
- },
- "defeat": {
- "1": "Mein Körper und mein Geist sind nicht immer unbedingt synchron."
- }
- },
- "worker_double": {
- "encounter": {
- "1": "Ich zeige dir, dass wir dich brechen können. Wir haben auf dem Feld trainiert!"
- },
- "victory": {
- "1": "Wie seltsam… Wie konnte das passieren… Ich hätte nicht ausgemuskelt werden sollen."
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "Ich höre normalerweise nur klassische Musik, aber wenn ich verliere,\n$werde ich ein bisschen New Age ausprobieren!",
- "2": "Ich werde mit jeder Träne stärker, die ich weine."
- },
- "victory": {
- "1": "Ist das der Beginn des Zeitalters des Wassermanns? Ich bin bereit für die Veränderung.",
- "2": "Jetzt kann ich noch stärker werden. Ich wachse mit jedem Groll."
- },
- "defeat": {
- "1": "New Age bezieht sich einfach auf Komponisten der klassischen Musik des 20. Jahrhunderts, richtig?",
- "2": "Lass dich nicht von Traurigkeit oder Frustration aufhalten.\n$Du kannst deine Groll nutzen, um dich zu motivieren."
- }
- },
- "psychic": {
- "encounter": {
- "1": "Hallo! Konzentrier dich!"
- },
- "victory": {
- "1": "Eeeeek!"
- }
- },
- "officer": {
- "encounter": {
- "1": "Bereite dich vor, denn die Gerechtigkeit wird gleich vollstreckt!",
- "2": "Bereit, das Gesetz zu verteidigen und die Gerechtigkeit auf dem Schlachtfeld zu wahren!"
- },
- "victory": {
- "1": "Die Gerechtigkeit auf meinen Schultern fühlt sich schwerer an denn je…",
- "2": "Die Schatten der Niederlage schweben über dem Revier."
- }
- },
- "beauty": {
- "encounter": {
- "1": "Mein letzter Kampf überhaupt… So möchte ich, dass wir diesen Kampf sehen…"
- },
- "victory": {
- "1": "Es war schön… Lass uns irgendwann wieder einen letzten Kampf haben…"
- }
- },
- "baker": {
- "encounter": {
- "1": "Hoffe, du bist bereit, die Niederlage zu schmecken!"
- },
- "victory": {
- "1": "Ich werde ein Comeback backen."
- }
- },
- "biker": {
- "encounter": {
- "1": "Zeit, aufzudrehen und dich im Staub zurückzulassen!"
- },
- "victory": {
- "1": "Ich werde für das nächste Rennen tunen."
- }
- },
- "firebreather": {
- "encounter": {
- "1": "Meine Flammen werden dich verschlingen!",
- "2": "Meine Seele hat Feuer gefangen. Ich werde dir zeigen, wie heiß sie brennt!",
- "3": "Komm näher und sieh dir meine Flammen an!"
- },
- "victory": {
- "1": "Verbrannt bis zur Asche...",
- "2": "Yow! Das ist heiß!",
- "3": "Auuu! Ich habe mir die Nasenspitze verbrannt!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "Matrose, du gehst über Bord, wenn du verlierst!",
- "2": "Komm schon! Mein Stolz als Seemann steht auf dem Spiel!",
- "3": "Ahoj! Bist du seekrank?"
- },
- "victory": {
- "1": "Argh! Von einem Kind besiegt!",
- "2": "Dein Geist hat mich versenkt!",
- "3": "Ich glaube, ich bin der der seekrank ist..."
- }
- },
- "archer": {
- "encounter": {
- "1": "Bevor du weitergehst, lass uns sehen, wie du dich gegen uns, Team Rocket, schlägst!",
- "2": "Ich habe Berichte erhalten, dass deine Fähigkeiten nicht unbedeutend sind.\n$Mal sehen, ob sie wahr sind.",
- "3": "Ich bin Atlas, ein Vorstand von Team Rocket.\n$Und ich mache es den Feinden unserer Organisation nicht leicht."
- },
- "victory": {
- "1": "Was für ein Fehler!",
- "2": "Mit meinen aktuellen Fähigkeiten war ich der Aufgabe doch nicht gewachsen.",
- "3": "V-verzeih mir, Giovanni... Dass ich von einem einfachen Trainer besiegt wurde..."
- }
- },
- "ariana": {
- "encounter": {
- "1": "Halt! Wir können niemanden herumlaufen lassen. \n$Es ist schädlich für den Stolz von Team Rocket, verstehst du.",
- "2": "Ich weiß nicht und es ist mir egal, ob das, was ich tue, richtig oder falsch ist...\n$Ich vertraue einfach auf Giovanni und tue, was mir gesagt wird.",
- "3": "Dein Trip endet hier. Ich werde dich erledigen!"
- },
- "victory": {
- "1": "Tch, du bist wirklich stark. Es ist schade. \n$Wenn du Team Rocket beitreten würdest, könntest du ein Vorstand werden.",
- "2": "Ich... ich bin zerstört...",
- "3": "Aaaieeeee! Das kann nicht passieren! Ich habe hart gekämpft, aber trotzdem verloren..."
- }
- },
- "proton": {
- "encounter": {
- "1": "Was willst du? Wenn du unsere Arbeit unterbrichst, erwarte keine Gnade!",
- "2": "Was haben wir hier? Ich werde oft als der gruseligste und grausamste Typ bei Team Rocket bezeichnet…\n$Ich rate dir dringend, dich nicht in unsere Geschäfte einzumischen!",
- "3": "Ich bin Proton, ein Admin von Team Rocket. Ich bin hier, um deinem Einmischen ein Ende zu setzen!"
- },
- "victory": {
- "1": "Die Festung ist gefallen! Alle Mann zurückziehen!",
- "2": "Du hast diesmal gewonnen… Aber alles, was du getan hast, war, den Zorn von Team Rocket zu vergrößern…",
- "3": "Ich bin besiegt… Aber ich werde das nicht vergessen!"
- }
- },
- "petrel": {
- "encounter": {
- "1": "Muhahaha, wir haben auf dich gewartet. Ich? Du weißt nicht, wer ich bin? Ich bin Giovanni.\n$Der majestätische Giovanni höchstpersönlich! Wahahaha!\n$…Huh? Ich klinge überhaupt nicht wie Giovanni?\n$Ich sehe nicht einmal aus wie Giovanni?\n$Wie kommt das? Ich habe so hart daran gearbeitet, ihn nachzuahmen!",
- "2": "Ich bin Lambda, ein Admin von Team Rocket. Ich werde nicht zulassen, dass du unsere Pläne störst!",
- "3": "Rocket Vorstand Lambda wird sich um diesen Eindringling kümmern!"
- },
- "victory": {
- "1": "OK, OK. Ich sage dir, wo er ist.",
- "2": "Ich… Ich konnte nichts tun… Giovanni, bitte vergib mir…",
- "3": "Nein, ich kann das nicht auf mich sitzen lassen. Ich muss die anderen informieren…"
- }
- },
- "tabitha": {
- "encounter": {
- "1": "Hehehe! Du bist also bis hierher gekommen! Aber du bist zu spät!",
- "2": "Hehehe... Schon hier, oder? Wir haben dich unterschätzt! Aber das war's! \n$Ich bin eine Klasse über den Rüpeln, die du bisher gesehen hast. Ich halte dich nicht hin.\n$Ich werde dich zermalmen!",
- "3": "Ich werde dir eine kleine Kostprobe des Schmerzes geben! Ergebe dich!"
- },
- "victory": {
- "1": "Hehehe! Du hast mich vielleicht besiegt, aber du hast keine Chance gegen den Boss!\n$Wenn du jetzt aufgibst, musst du dich keiner ordentlichen Tracht Prügel stellen!",
- "2": "Hehehe... Also habe ich auch verloren...",
- "3": "Ahya! Wie konnte das passieren? Ein Vorstand wie ich von einem zufälligen Trainer besiegt..."
- }
- },
- "courtney": {
- "encounter": {
- "1": "Stellt euch...Mir NICHT...IN DEN WEEEG...!!",
- "2": "... Nun dann... Auslöschen...",
- "3": "...?! Du... Hm... ♪ Das trifft sich ausgezeichnet... ♪\n$Dann hole ich mir eben zuerst deine Pokémon... Her damit..."
- },
- "victory": {
- "1": "... ...Ändere... die Welt.",
- "2": "Wie erwartet. Unerwartet. Du. Ziel erfasst... abgeschlossen.\n$Beginne... Experiment. Du. Für immer. Aha... ♪",
- "3": "...Schon wieder? Das war unerwartet. ...Ich wusste es. Du... bist interessant! ...Haha. ♪"
- }
- },
- "shelly": {
- "encounter": {
- "1": "Ahahahaha! Du wirst dich in die Angelegenheiten von Team Aqua einmischen?\n$Du bist entweder absolut furchtlos, einfach unwissend oder beides!\n$Du bist so süß, dass es ekelhaft ist! Ich werde dich erledigen.",
- "2": "Was ist das? Wer ist dieser verwöhnte Gör?",
- "3": "Beruhige dich. Sei geduldig. Ich werde dich gleich zermalmen."
- },
- "victory": {
- "1": "Ahahahaha! Wir wurden unerwartet gestört! Uns bleiben keine Optionen.\n$Wir müssen uns zurückziehen. Aber das ist nicht das letzte Mal, dass du Team Aqua siehst!\n$Wir haben andere Pläne! Vergiss das nicht!",
- "2": "Ahhh?! War ich zu nachsichtig mit dir?!",
- "3": "Uh. Willst du mir sagen, dass du während des Kampfes noch besser geworden bist?\n$Du bist ein Gör mit einer glänzenden Zukunft…\n$Meine Pokémon und ich haben keine Kraft mehr zu kämpfen…\n$Geh weiter… Geh und werde von Adrian zerstört."
- }
- },
- "matt": {
- "encounter": {
- "1": "Hoohahaha! Was, hast du eine Schraube locker oder so?\n$Sieh dich an, kleiner Makuhita-ähnlicher Trainer!",
- "2": "Oho! Du! Du bist das lustige Kind!",
- "3": "Was machst du hier? Bist du uns gefolgt?"
- },
- "victory": {
- "1": "Bwaarharharharhar!! Ich hab zwar verloren, aber das hat Spaß gemacht!",
- "2": "Ich kann es fühlen! Ich kann es spüren, das ist klar! Die Stärke, die von dir ausgeht!\n$Mehr! Ich will noch mehr! Aber es sieht so aus, als hätten wir keine Zeit mehr...",
- "3": "Das war Spaß! Ich wusste, dass du mir eine gute Zeit bieten würdest!\n$Ich freue mich darauf, dich eines Tages wieder zu treffen!"
- }
- },
- "mars": {
- "encounter": {
- "1": "Ich bin Mars, eine der obersten Commander von Team Galaktik.",
- "2": "Die Vision von Team Galaktik für die Zukunft ist unbeirrt. Opposition wird gnadenlos zerschlagen!",
- "3": "Fühlst du dich nervös? Das solltest du!"
- },
- "victory": {
- "1": "Das kann nicht passieren! Wie habe ich verloren?!",
- "2": "Du hast etwas Können, das muss ich zugeben.",
- "3": "Besiegt... Das war ein teurer Fehler."
- }
- },
- "jupiter": {
- "encounter": {
- "1": "Jupiter, Commander von Team Galaktik, zu Diensten.",
- "2": "Widerstand ist zwecklos. Team Galaktik wird siegen!",
- "3": "Du zitterst... Schon Angst?"
- },
- "victory": {
- "1": "Unmöglich... Ich habe verloren?!",
- "2": "Beeindruckend, du hast Mut!",
- "3": "So zu verlieren... Wie peinlich."
- }
- },
- "saturn": {
- "encounter": {
- "1": "Ich bin Saturn, Commander von Team Galaktik.",
- "2": "Unsere Mission ist absolut. Jeder Widerstand wird vernichtet!",
- "3": "Ist das Angst, die ich in deinen Augen sehe?"
- },
- "victory": {
- "1": "Unmöglich... Von dir besiegt?!",
- "2": "Du hast dich als würdiger Gegner erwiesen.",
- "3": "Besiegt in der Niederlage... Das ist inakzeptabel."
- }
- },
- "zinzolin": {
- "encounter": {
- "1": "Du könntest eine Bedrohung für Team Plasma werden, also werden wir dich hier und jetzt eliminieren!",
- "2": "Oh, zum Heulen... Ich hatte nicht erwartet, in dieser eisigen Kälte kämpfen zu müssen!",
- "3": "Du bist ein beeindruckender Trainer, dass du es so weit geschafft hast. Aber hier endet es."
- },
- "victory": {
- "1": "G-Cis... Ich habe versagt...",
- "2": "Es ist bitterkalt. Ich zittere. Ich leide. Doch ich stehe immer noch siegreich da.",
- "3": "Hm. Du bist ein klügerer Trainer, als ich erwartet habe, aber nicht klug genug."
- }
- },
- "rood": {
- "encounter": {
- "1": "Du bist eine Bedrohung für Team Plasma. Wir können dich hier und jetzt nicht laufen lassen!",
- "2": "Oh, dieser eisige Wind... Ich hätte nie gedacht, dass ich hier kämpfen müsste!",
- "3": "Du bist ein bemerkenswerter Trainer, dass du es bis hierher geschafft hast. Aber hier wird es enden."
- },
- "victory": {
- "1": "G-Cis... Ich habe meine Mission nicht erfüllt...",
- "2": "Die Kälte ist durchdringend. Ich zittere. Ich leide. Doch ich habe gesiegt.",
- "3": "Hm. Du bist ein talentierter Trainer, aber leider nicht talentiert genug."
- }
- },
- "xerosic": {
- "encounter": {
- "1": "Ah ha ha! Es wäre mir ein Vergnügen. Komm schon, kleiner Trainer! Zeig mir, was du drauf hast!",
- "2": "Hm... Du bist mächtiger, als du aussiehst. Ich frage mich, wie viel Energie in dir steckt.",
- "3": "Ich habe auf dich gewartet! Ich muss ein wenig Forschung an dir betreiben! Komm, lass uns beginnen!"
- },
- "victory": {
- "1": "Ah, du bist ziemlich stark. Oh ja—sehr stark, in der Tat.",
- "2": "Ding-ding-ding! Du hast es geschafft! Dem Sieger gebührt die Beute!",
- "3": "Wunderbar! Erstaunlich! Du hast enorme Fähigkeiten und Mut!"
- }
- },
- "bryony": {
- "encounter": {
- "1": "Ich bin Begonia, und es wäre mir ein Vergnügen, gegen dich zu kämpfen. Zeig mir, was du drauf hast.",
- "2": "Beeindruckend... Du bist mächtiger, als du aussiehst. Zeig mir das wahre Ausmaß deiner Energie.",
- "3": "Ich habe deine Ankunft erwartet. Es ist Zeit für einen kleinen Test. Sollen wir beginnen?"
- },
- "victory": {
- "1": "Du bist ziemlich stark. Oh ja—sehr stark, in der Tat.",
- "2": "Ding-ding-ding! Du hast dich gut geschlagen. Der Sieg gehört dir.",
- "3": "Wunderbar! Bemerkenswert! Deine Fähigkeiten und dein Mut sind lobenswert."
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "Jetzt gibt es Ärger!…\n$und es kommt noch härter!\n$Wir wollen über die Erde regieren…\n$und naja du kennst den Rest…!",
- "2": "Wir führen gerade eine große Operation durch. Hast du vor uns zu stören?",
- "3": "Gib uns deine Pokémon, oder stelle dich dem Zorn von Team Rocket!",
- "4": "Team Rocket wird seinen Plan zur Vollendung bringen, Aus dem Weg!",
- "5": "Los, gib uns deine Pokémon. Wir brauchen sie für unseren Plan!"
- },
- "victory": {
- "1": "Das war mal wieder ein Schuss in den Ofen!",
- "2": "Dem Boss wird das aber nicht gefallen!",
- "3": "Ich habe es vermasselt!",
- "4": "Meine Kollegen werden das nicht tolerieren!",
- "5": "Team Rocket wird wiederkehren! Das sage ich Jessie und James!"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": "Keiner, der sich Team Magma in den Weg stellt, bekommt Gnade, nicht einmal Kinder!",
- "2": "Störe besser nicht unsere Pläne! Wir formen die Welt nach unseren Vorstellungen!",
- "3": "Du stehst uns im Weg! Team Magma hat keine Zeit für Störenfriede wie dich!",
- "4": "Bereite dich auf die Hölle vor, denn es wird bald sehr heiß!",
- "5": "Wir werden die Macht des Vulkans entfesseln! Es wird gewaltig sein! Mach dich bereit!"
- },
- "victory": {
- "1": "Wie kann das sein? Ich bin Teil des mächtigen Team Magma! Wir streben nach der Verbesserung der Welt...",
- "2": "Unglaublich, dass ich verloren habe! Mit meinen mächtigen Pokémon.",
- "3": "Das kann nicht sein! Ich hab doch viel mehr Erfahrung als du!",
- "4": "Verdammt... Ich hätte sofort in unser Versteck fliehen sollen...",
- "5": "Du hast mich besiegt... Der Boss wird mich dafür zur Rechenschaft ziehen."
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "Du willst dich also mit Team Aqua anlegen? Du traust dich ja was… Dich werfe ich über Bord!",
- "2": "Du hast ganz schön Mut, dich mit Team Aqua anzulegen!",
- "3": "Ich hoffe du hast einen Regenschirm dabei. Hier wird es jetzt nass!",
- "4": "Wir, Team Aqua, existieren zum Wohle aller!",
- "5": "Bereite dich darauf vor, von den Fluten meiner Pokémon weggespült zu werden!"
- },
- "victory": {
- "1": "Vielleicht sollte ich wohl lieber selber über die Planke gehen…",
- "2": "Arrgh, ich habe nicht damit gerechnet, von einer Landratte gestört zu werden!",
- "3": "Ich habe verloren?! Ich schätze, ich muss jetzt zurück zum Versteck schwimmen...",
- "4": "Oh Mann, was für eine Katastrophe... Der Boss wird wütend sein...",
- "5": "Du hast mich besiegt... Meinst du, der Boss wird mich dafür kielholen lassen?"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "Team Galaktik wird die Welt in eine bessere verwandeln! Und du wirst uns nicht aufhalten!",
- "2": "Erlebe die Macht unserer Technologie und die Zukunft, die wir uns vorstellen!",
- "3": "Im Namen von Team Galaktik werde ich jeden beseitigen, der uns im Weg steht!",
- "4": "Mach dich bereit zu verlieren!",
- "5": "Hoffentlich bist du bereit für eine kosmische Niederlage!"
- },
- "victory": {
- "1": "Zyrus wird uns für diese Niederlage bestrafen…",
- "2": "Dieser Rückschlag bedeutet nichts in Hinsicht unseres großen Plans.",
- "3": "Unsere Pläne sind größer als diese Niederlage.",
- "4": "Wie ist das möglich?!",
- "5": "Notiz an mich selbst: Pokémon-Kämpfe üben, so bald wie möglich."
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "Pokémon sollten frei sein! Team Plasma wird sie befreien!",
- "2": "Wenn ich gegen dich gewinne, lass deine Pokémon frei!",
- "3": "Wenn du Team Plasma im Weg stehst, werde ich mich um dich kümmern!",
- "4": "Team Plasma wird Pokémon von egoistischen Menschen wie dir befreien!",
- "5": "Lass dich von unserem Aussehen nicht täuschen. Unsere Kampffähigkeiten sind überragend!"
- },
- "victory": {
- "1": "Wie konnte ich verlieren? Ich dachte, ich würde die Welt retten...",
- "2": "Wie konnte ich nur verlieren...",
- "3": "...Dieses Pokémon ist zu schwach, ich werde stärkere beschaffen müssen!",
- "4": "Große Pläne stoßen immer auf Hindernisse.",
- "5": "Das ist ein schwerer Rückschlag für Team Plasma..."
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "Deine Pokémon haben keine Chance gegen die Überlegenheit von Team Flare.",
- "2": "Mach dich bereit, denn gleich wird es hier lichterloh brennen!",
- "3": "Team Flare wird die Welt von allen Makeln befreien!",
- "4": "Bereite dich auf die unvergleichliche Macht von Team Flare vor!",
- "5": "Unsere Mission steht über allem, sogar über der Mode!"
- },
- "victory": {
- "1": "Diese Niederlage wirft einen Schatten auf meine Zukunft.",
- "2": "Es scheint, dass ich meine Strategien überdenken muss. Zurück ans Reißbrett.",
- "3": "Unglaublich?! Ich habe verloren?!",
- "4": "Selbst in der Niederlage bleibt Team Flare unübertroffen in seiner Eleganz.",
- "5": "Du hast mich besiegt, aber Team Flare wird immer in Glanz und Stil erstrahlen."
- }
- },
- "aether_grunt": {
- "encounter": {
- "1": "Ich werde dich mit allem, was ich habe, bekämpfen. Ich werde dich auslöschen!",
- "2": "Mir ist egal, ob du ein simpler Trainer bist oder nicht.\n$Ich werde dich hochkant rauswerfen, wenn du uns bedrohst!",
- "3": "Mir wurde gesagt, Trainer abzuweisen, egal wer sie sind!",
- "4": "Ich zeige dir die Macht des Æther-Paradies",
- "5": "Jetzt da du die Wahre Natur des Æther-Paradies kennst, müssen wir dich leider beseitigen!"
- },
- "victory": {
- "1": "Hmph! Du scheinst ziemlich geschickt zu sein.",
- "2": "Was hat das zu bedeuten? Was hat das zu bedeuten!",
- "3": "Hey, du bist so stark, dass ich dich nicht abweisen kann!",
- "4": "Hmm... Es scheint, als hätte ich verloren.",
- "5": "Ich hätte das Blitzdings benutzen sollen..."
- }
- },
- "faba": {
- "encounter": {
- "1": "Ich bin Regionalleiter Fabian und ich werde dir zeigen, wie hart die Welt sein kann!",
- "2": "Die letzte Verteidigungslinie des Æther-Paradieses kämpft gegen einen simplen Trainer?",
- "3": "Ich Fabian, bin der Regionalleiter der Æther Foundation.\n$Der einzige auf der Welt, ich bin unersetzlich."
- },
- "victory": {
- "1": "Aiyee!",
- "2": "W-w-wie kann das sein?! Wie konnte dieser Trainer...",
- "3": "Das ist der Grund... warum ich andere Menschen nicht ausstehen kann."
- }
- },
- "skull_grunt": {
- "encounter": {
- "1": "Wir sind nicht böse, wir sind einfach nur nicht nett!",
- "2": "Willst du Stress, oder was? Das ist unsere Art, Hallo zu sagen! Tschüss, du Punk!",
- "3": "Wir sind nur ein paar Typen und Mädels mit großem Interesse an den Pokémon anderer Leute!",
- "4": "Wieso machst du einen auf hart, wenn wir schon hart wie Knochen sind, Homie?",
- "5": "Yo, platz hier nich’ rein, ♪ wie’n wildes Kleinstein! ♪ Wenn du meinst, dass Team Skull ♪\n$an nix denkt als Krawall, ♪ hast du leider ’nen Knall, ♪ denn das is’ nich’ der Fall! ♪\n$Wir woll’n hier nur gammeln ♪ und gechillt Staub ansammeln! ♪"
- },
- "victory": {
- "1": "Wie jetzt? Schon vorbei?",
- "2": "Woah, lass uns lieber die Kurve kratzen, yo! Kein Bock, hier meinen Schädel zu riskieren...",
- "3": "Wir brauchen deine schwachen Pokémon eh nicht!",
- "4": "Was? Deine Stärke spür ich bis in die Knochen...",
- "5": "Mein Homie und ich sind also weniger wert als Pokémon? Willste uns dissen, oder was?"
- }
- },
- "plumeria": {
- "encounter": {
- "1": "..Hmph. Du siehst nicht so aus, als wärst du etwas Besonderes.",
- "2": "Die blöden Rüpel brauchen viel zu lange, um mit euch gewöhnlichen Trainern fertig zu werden...",
- "3": "Lege dich mit irgendjemandem in Team Skull an, und ich zeige dir, wie ernst ich werden kann."
- },
- "victory": {
- "1": "Du bist ziemlich stark. Das muss ich zugeben.",
- "2": "Jetzt versteh ich, warum meine Rüpel so viel Zeit damit verschwenden...",
- "3": "Ich denke, ich muss diese Niederlage einfach hinnehmen."
- }
- },
- "macro_grunt": {
- "encounter": {
- "1": "Achtung hier ist Endstation für dich!",
- "2": "Du bist ein Trainer, oder? Wir von MC Wertpapiere wissen so etwas.\n$Ich fürchte, das gibt dir trotzdem nicht das Recht, sich in unsere Arbeit einzumischen.",
- "3": "Ich bin von MC Versicherungen! Hast du eine Lebensversicherung?"
- },
- "victory": {
- "1": "Ich habe keine andere Wahl, als respektvoll zurückzutreten.",
- "2": "Mein Erspartes aufzugeben bringt mich in die roten Zahlen...",
- "3": "Okay zurück an die Arbeit. Versicherungen verkauft sich nicht von alleine."
- }
- },
- "oleana": {
- "encounter": {
- "1": "Ich werde keine Störung von Präsident Roses Plänen zulassen!",
- "2": "Du hast es also durch die Mitarbeiter der Tochterunternehmen geschafft,\n$die ich beauftragt habe, um dich aufzuhalten. Ich hätte nichts anderes erwartet.",
- "3": "Für den Präsidenten! Ich werde nicht verlieren! \n$Mach dich bereit mit Macro Cosmos Airlines nach Hause zu fliegen!"
- },
- "victory": {
- "1": "Ich habe es nicht geschafft... Olivia... du bist wirklich eine hoffnungslose Frau.",
- "2": "Arghhh! Das ist unentschuldbar... Was habe ich mir dabei gedacht...\n$Jeder Trainer, der es so weit geschafft hat, muss ein harter Brocken sein...",
- "3": "Ich bin eine müde Olivia... Ob es Macro Cosmos Betten gibt?"
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "Ich bin beeindruckt, du hast es bis hierher geschafft!\n$Ich bin Giovanni, der Anführer von Team Rocket!\n$Wir regieren den Untergrund von Kanto!\n$Und wir lassen sicherlich nicht zu, dass ein Kind uns aufhält!"
- },
- "victory": {
- "1": "Ich ziehe mich zurück, aber ich werde zurückkehren! Team Rocket wird niemals besiegt werden!"
- },
- "defeat": {
- "1": "Merke dir meine Worte. Nicht in der Lage zu sein,\n$deine eigene Stärke zu messen, zeigt, dass du immer noch ein Kind bist."
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "Du schon wieder… Wie hast du mich gefunden? Team Rocket wird dich endlich aus der Welt schaffen!"
- },
- "victory": {
- "1": "Wie ist das möglich...? Der kostbare Traum von Team Rocket ist nicht mehr als eine Illusion geworden..."
- },
- "defeat": {
- "1": "Team Rocket wird niemals besiegt werden! Ich werde zurückkehren!"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "Die Welt ist nicht perfekt. Ich werde sie verbessern, indem ich sie neu erschaffe!\n$Wir brauchen mehr Landmassen um zu leben! Team Magma wird dieses Ziel mit aller Macht erreichen!"
- },
- "victory": {
- "1": "Ugh! Das entspricht nicht meinen Berechnungen! Wie konnte ich verlieren? Wir sehen uns wieder!"
- },
- "defeat": {
- "1": "Team Magma wird weiterhin die Welt verbessern!"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "Du bist das letzte Hindernis, das zwischen mir und meinen Zielen steht.\n$Mach dich bereit durch die Macht von Team Magma besiegt zu werden!"
- },
- "victory": {
- "1": "Das... Das kann nicht sein..."
- },
- "defeat": {
- "1": "Und jetzt werde ich diesen Planeten terraformen, um ihn ideal für die Menschheit zu machen."
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "Ich bin Adrian, der Anführer von Team Aqua! Wir werden die Welt mit Wasser überfluten!"
- },
- "victory": {
- "1": "Lass uns mal wieder treffen. Ich werde mir sicher sein, dass ich dieses Gesicht wiedererkenne."
- },
- "defeat": {
- "1": "Brilliant! Mein Team wird jetzt nicht zurückhalten!"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "Ich habe lange auf diesen Tag gewartet. Das ist die wahre Macht von Team Aqua!"
- },
- "victory": {
- "1": "So habe ich mir das nicht vorgestellt..."
- },
- "defeat": {
- "1": "Ich werde alles in dieser Welt in seinen ursprünglichen, reinen Zustand zurückversetzen!!"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "Du wurdest von leerer Gefühlsduselei hierher getrieben.\n$Ich werde dich bereuen lassen, auf dein Herz gehört zu haben!"
- },
- "victory": {
- "1": "Interessant. Und ziemlich eigenartig."
- },
- "defeat": {
- "1": "Ich werde meine neue Welt erschaffen..."
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "So sehen wir uns wieder. Es scheint, als wären unsere Schicksale miteinander verflochten.\n$Aber hier und jetzt werde ich diese Verbindung brechen!"
- },
- "victory": {
- "1": "Wie? Wie? WIE?!"
- },
- "defeat": {
- "1": "Bis bald."
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "Ich werde nicht zulassen, dass mich jemand aufhält! Egal wer es auch sein mag!"
- },
- "victory": {
- "1": "Wie kann das sein? Ich bin der Schöpfer von Team Plasma! Ich bin perfekt!"
- },
- "defeat": {
- "1": "Ich bin der perfekte Herrscher einer perfekten neuen Welt! Mwa ha ha!"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "Komm schon! Ich will dein Gesicht sehen, in dem Moment, in dem du alle Hoffnung verlierst!"
- },
- "victory": {
- "1": "Meine Berechnungen... Nein! Meine sorgfältigen Pläne! Die Welt sollte mir gehören!"
- },
- "defeat": {
- "1": "Kyurem! Verwende Absorptionsfusion!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "DU willst mich aufhalten? Dann zeig mir deine Stärke in einem Kampf!"
- },
- "victory": {
- "1": "Du bist hier, um mich aufzuhalten. Aber ich bitte dich zu warten.\n$Ich bin so kurz davor, meine Vision zu verwirklichen."
- },
- "defeat": {
- "1": "Pokémon... Sollten nicht mehr existieren."
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "Die Zukunft, die du willst, oder die Zukunft, die ich will...\n$Lass uns sehen, welche mehr zu existieren verdient, sollen wir?"
- },
- "victory": {
- "1": "Die Zukunft, die ich erschaffen wollte... Es ist vorbei..."
- },
- "defeat": {
- "1": "Narren ohne Vision werden weiterhin diese wunderschöne Welt verunreinigen."
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "Du wirst mein süßes Biest erschrecken! Wie kannst du nur? Ultra-Bestien sind so niedlich!\n$Es sieht so aus, als müsste ich dich zuerst zum Schweigen bringen."
- },
- "victory": {
- "1": "Wie kann eine Person nur so grausam sein?!"
- },
- "defeat": {
- "1": "Und jetzt, mein süßes Biest, komm zu Mama!"
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "Wieso musst du mich weiterhin belästigen?! Ich habe die Nase voll von dir.\n$Du machst mich krank! Genug mit diesem nutzlosen Gerede... \n$Mit der Kraft von Anego, von uns als UB-01 Schmarotzer klassifiziert,\n$werde ich dir zeigen, wie falsch du warst, hierher zu kommen!"
- },
- "victory": {
- "1": "Aaauuuggghhhhhhhhh!!!"
- },
- "defeat": {
- "1": "Alles, was ich will, ist mein kostbares Biest! Der Rest von euch ist mir egal!"
- }
- },
- "skull_boss_guzma_1": {
- "encounter": {
- "1": "Kein Erbarmen! Keine Gnade! Ich bin dein schlimmster Alptraum! \n$Oh yeah, ich bin der große, böse Bromley!"
- },
- "victory": {
- "1": "Irgendwann mach ich dich platt! Ich hab noch ein Ass im Ärmel. Du wirst schon sehen."
- },
- "defeat": {
- "1": "Du hast den langen Weg hierher DAFÜR aufgenommen? Pah!"
- }
- },
- "skull_boss_guzma_2": {
- "encounter": {
- "1": "Mir ist egal, wer du bist. Ich mach dich platt!! Das schreibt mir mein Ego vor. Ich bin Bromley!"
- },
- "victory": {
- "1": "Bromley!!! Was ist falsch mit dir?!"
- },
- "defeat": {
- "1": "Ihr seid wirklich selten dämlich."
- }
- },
- "macro_boss_rose_1": {
- "encounter": {
- "1": "Mein Name ist Rose. Ich bin der Präsident der Galar Pokémon-Liga und Geschäftsführer von Macro Cosmos\n$Ich habe eine Aufgabe, eine Berufung! Ich muss die Galar-Region mit unbegrenzter Energie versorgen,\n$damit sie sich bis in alle Ewigkeit in Frieden fortentwickeln kann!"
- },
- "victory": {
- "1": "Du versteht es einfach nicht...So können wir die Geschichte nicht verändern!"
- },
- "defeat": {
- "1": "Ohne deine Einmischung kann ich jetzt endlich weiterarbeiten!"
- }
- },
- "macro_boss_rose_2": {
- "encounter": {
- "1": "Ich bin fest entschlossen, das Energieproblem in der Galar-Region\n$und natürlich auf der ganzen Welt zu lösen.\n$Meine Erfahrungen und Erfolge, die Macro Cosmos zu einem Erfolg gemacht haben,\n$sind der Beweis, dass meine Methoden funktionieren.\n$Ich habe nicht vor, meine Meinung zu ändern, selbst wenn ich verliere."
- },
- "victory": {
- "1": "Ich hatte vergessen, wie großartig Pokémon-Kämpfe sind! Es ist so lange her, dass ich gekämpft habe...\n$Das war wirklich befriedigend, ich akzeptiere die Niederlage für diesen Kampf."
- },
- "defeat": {
- "1": "Ich nehme an, es muss den Anschein haben, dass ich etwas Schreckliches tue.\n$Ich erwarte nicht, dass du es verstehst. Aber ich muss der Galar-Region grenzenlose Energie\n$bereitstellen, um ewigen Wohlstand zu gewährleisten."
- }
- },
- "brock": {
- "encounter": {
- "1": "Meine Expertise in Bezug auf Gesteins-Pokémon wird dich besiegen! Komm schon!",
- "2": "Meine felsenfeste Entschlossenheit wird dich überwältigen!",
- "3": "Ich bin ein harter Fels, der nicht so leicht zu brechen ist!"
- },
- "victory": {
- "1": "Die Stärke deiner Pokémon hat meine steinharte Verteidigung überwunden!",
- "2": "Die Welt ist riesig! Ich bin froh, dass ich die Chance hatte, gegen dich zu kämpfen.",
- "3": "Perhaps I should go back to pursuing my dream as a Pokémon Breeder…"
- },
- "defeat": {
- "1": "Der beste Angriff ist eine gute Verteidigung!\nDas ist meine Art, Dinge zu tun!",
- "2": "Komm und studiere Felsen mit mir, um besser zu lernen wie man gegen sie kämpft!",
- "3": "Meine Reisen durch die Regionen zahlen sich aus!"
- }
- },
- "misty": {
- "encounter": {
- "1": "Meine Taktik ist ein Frontalangriff mit Wasser-Pokémon!",
- "2": "Hiya! Ich zeige dir die Stärke meiner Wasser-Pokémon!",
- "3": "Mein Traum war es, auf eine Reise zu gehen und gegen starke Trainer zu kämpfen… \n$Wirst du eine ausreichende Herausforderung sein?"
- },
- "victory": {
- "1": "Du bist wirklich stark… Ich gebe zu, du hast es drauf…",
- "2": "Du weißt, dass du nur Glück hattest, oder?",
- "3": "Wow, ich kann nicht glauben, dass du mich besiegt hast!"
- },
- "defeat": {
- "1": "War die mächtige Misty zu viel für dich?",
- "2": "Ich hoffe, du hast die eleganten Schwimmtechniken meiner Pokémon gesehen!",
- "3": "Deine Pokémon waren keine Herausforderung für meine geliebten Pokémon!"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "Meine Elektro-Pokémon haben mich im Krieg gerettet! Ich werde dir zeigen, wie!",
- "2": "Du wirst um Gnade winseln, wenn ich dich geschockt habe!",
- "3": "Ich werde dich genau so zappen, wie ich es mit all meinen Feinden im Kampf mache!"
- },
- "victory": {
- "1": "Whoa! Dein Team ist echt stark!",
- "2": "Aaargh, du bist stark! Selbst meine elektrischen Tricks haben gegen dich verloren.",
- "3": "Das war ein absolut schockierender Verlust!"
- },
- "defeat": {
- "1": "Oh ja! Wenn es um Elektro-Pokémon geht, bin ich weltweit die Nummer eins!",
- "2": "Hahaha! Das war ein elektrisierender Kampf!",
- "3": "Ein Pokémon-Kampf ist Krieg, und ich habe dir den Nahkampf gezeigt!"
- }
- },
- "erika": {
- "encounter": {
- "1": "Ah, das Wetter ist hier so schön…\nOh, ein Kampf? Nun gut.",
- "2": "Meine Pokémon-Kampffähigkeiten stehen in Konkurrenz zu meinen Blumenarrangierfähigkeiten.",
- "3": "Oh, ich hoffe, der angenehme Duft meiner Pokémon lässt mich nicht wieder einschlafen…",
- "4": "Blumen in einem Garten zu sehen ist so beruhigend."
- },
- "victory": {
- "1": "Oh! Ich gestehe meine Niederlage ein.",
- "2": "Dieser Kampf war so entspannend.",
- "3": "Ah, es scheint, dass ich verloren habe…",
- "4": "Na immerhin habe ich noch meine Blumen."
- },
- "defeat": {
- "1": "Ich hatte Angst, dass ich einschlafen würde…",
- "2": "Es scheint, als hätten meine Pflanzen-Pokémon dich überwältigt.",
- "3": "Dieser Kampf war eine so beruhigende Erfahrung.",
- "4": "Das war alles?"
- }
- },
- "janine": {
- "encounter": {
- "1": "Ich meistere die Kunst der giftigen Angriffe. Ich werde heute mit dir trainieren!",
- "2": "Vater vertraut darauf, dass ich mich behaupten kann. Ich werde ihm recht geben!",
- "3": "Meine Ninja-Techniken sind nur zweitrangig zu denen meines Vaters! Kannst du mithalten?"
- },
- "victory": {
- "1": "Selbst jetzt brauche ich noch Training… Ich verstehe.",
- "2": "Dein Kampfstil hat meinen überwältigt.",
- "3": "Ich werde mich wirklich anstrengen und meine Fähigkeiten verbessern."
- },
- "defeat": {
- "1": "Fufufu… das Gift hat dir all deine Kraft zum Kämpfen geraubt.",
- "2": "Ha! Du hattest keine Chance gegen meine überlegenen Ninja-Fähigkeiten!",
- "3": "Vaters Vertrauen in mich war nicht unbegründet."
- }
- },
- "sabrina": {
- "encounter": {
- "1": "Ich habe deine Ankunft in einer Vision gesehen!",
- "2": "Ich mag es nicht zu kämpfen, aber wenn du darauf bestehst, werde ich dir meine Kräfte zeigen!",
- "3": "Ich spüre große Ambitionen in dir. Ich werde sehen, ob sie begründet sind."
- },
- "victory": {
- "1": "Deine Kraft… Sie übertrifft bei weitem das, was ich vorausgesehen habe…",
- "2": "Ich habe es nicht geschafft, deine Stärke genau vorherzusagen.",
- "3": "Selbst mit meinen immensen psychischen Kräften kann ich niemanden spüren, der stärker ist als du."
- },
- "defeat": {
- "1": "Dieser Sieg… Genau so habe ich ihn in meinen Visionen gesehen!",
- "2": "Vielleicht war es jemand anderes, den ich spürte…",
- "3": "Verfeinere deine Fähigkeiten, bevor du unüberlegt in den Kampf stürzt.\n$Du weißt nie, was die Zukunft bereithält, wenn du es tust…"
- }
- },
- "blaine": {
- "encounter": {
- "1": "Hah! Ich hoffe, du hast Feuerheiler mitgebracht!",
- "2": "Meine feurigen Pokémon werden alle Herausforderer verbrennen!",
- "3": "Mach dich bereit, mit dem Feuer zu spielen!"
- },
- "victory": {
- "1": "Ich habe mich bis auf die Knochen verbrannt! Nicht einmal Asche bleibt!",
- "2": "Habe ich die Flammen nicht hoch genug geschürt?",
- "3": "Ich bin komplett ausgebrannt… Aber das lässt meine Motivation, mich zu verbessern, noch heißer brennen!"
- },
- "defeat": {
- "1": "Mein wütendes Inferno kann nicht gelöscht werden!",
- "2": "Meine Pokémon sind durch die Hitze dieses Sieges gestärkt worden!",
- "3": "Hah! Meine Leidenschaft brennt heller als deine!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "Ich, der Anführer von Team Rocket, werde dir eine Welt voller Schmerz bereiten!",
- "2": "Mein Training hier wird entscheidend sein, bevor ich mich wieder meinen alten Kollegen stelle.",
- "3": "Ich denke dass du nicht auf die Ausmaße des Scheiterns vorbereitet bist, die du gleich erleben wirst!"
- },
- "victory": {
- "1": "WAS! Ich, verlieren?! Es gibt nichts, was ich dir sagen möchte!",
- "2": "Hmm… Du wirst nie verstehen können, was ich zu erreichen versuche.",
- "3": "Diese Niederlage ist nur ein kleiner Rückschlag.\nTeam Rocket wird aus der Asche auferstehen."
- },
- "defeat": {
- "1": "Das du nicht in der Lage bist, deine eigene Stärke einzuschätzen, zeigt, dass du noch ein Kind bist.",
- "2": "Versuche nicht, dich wieder in meine Angelegenheiten einzumischen.",
- "3": "Ich hoffe, du verstehst, wie dumm es war, mich herauszufordern."
- }
- },
- "roxanne": {
- "encounter": {
- "1": "Wärs du so freundlich und würdest mir zeigen, wie du kämpfst?",
- "2": "Man lernt so viel, wenn man gegen viele Trainer kämpft.",
- "3": "Oh, du hast mich beim Strategie entwickeln erwischt. Möchtest du kämpfen?"
- },
- "victory": {
- "1": "Oh, es scheint, als hätte ich verloren.",
- "2": "Es scheint, als hätte ich noch so viel mehr zu lernen, wenn es um Kämpfe geht.",
- "3": "Ich werde mir zu Herzen nehmen, was ich heute gelernt habe."
- },
- "defeat": {
- "1": "Ich habe so viele Dinge aus unserem Kampf gelernt. Ich hoffe, du auch.",
- "2": "Ich freue mich darauf, wieder gegen dich zu kämpfen.\n$Ich hoffe, du wirst das, was du hier gelernt hast, anwenden.",
- "3": "Ich habe gewonnen, weil ich alles gelernt habe."
- }
- },
- "brawly": {
- "encounter": {
- "1": "Oh man, ein Herausforderer!\nLass uns sehen, was du kannst!",
- "2": "Du scheinst auf große Auftritte zu stehen.\nLass uns kämpfen",
- "3": "Zeit, einen Sturm zu entfachen!\nLos geht's!"
- },
- "victory": {
- "1": "Oh wow, du hast mich überrumpelt!",
- "2": "Du hast meinen Flow übernommen und mich besiegt!",
- "3": "Ich fühle mich als hätte ich mich in der Granithöhle verirrt!"
- },
- "defeat": {
- "1": "Haha, ich surfe die große Welle! Fordere mich irgendwann wieder heraus.",
- "2": "Surfe mal wieder mit mir!",
- "3": "Genau wie die Gezeiten kommen und gehen, hoffe ich, dass du zurückkommst, um mich herauszufordern."
- }
- },
- "wattson": {
- "encounter": {
- "1": "Zeit, geschockt zu werden! Wahahahaha!",
- "2": "Ich lass die Funken fliegen! Wahahahaha!",
- "3": "Ich hoffe, du hast Para-Heiler dabei! Wahahahaha!"
- },
- "victory": {
- "1": "Scheint als wäre ich entladen! Wahahahaha!",
- "2": "Du hast mich komplett geerdet! Wahahahaha!",
- "3": "Danke für den Nervenkitzel! Wahahahaha!"
- },
- "defeat": {
- "1": "Lade deine Batterien wieder auf und fordere mich irgendwann wieder heraus! Wahahahaha!",
- "2": "Ich hoffe du fandest unseren Kampf elektrisierend! Wahahahaha!",
- "3": "Bist du nicht geschockt, dass ich gewonnen habe? Wahahahaha!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "Nett dich zu kennenzulernen! Warte, nein… Ich werde dich zermalmen!",
- "2": "Ich bin noch nicht lange Arenaleiterin, aber ich werde dich grillen!",
- "3": "Es ist Zeit, dir die Kampftechniken zu zeigen, die mein Großvater mir beigebracht hat! Lass uns kämpfen!"
- },
- "victory": {
- "1": "Du erinnerst mich an meinen Großvater… Kein Wunder, dass ich verloren habe.",
- "2": "Strenge ich mich zu sehr an? Ich sollte mich entspannen, ich darf mich nicht zu sehr aufregen.",
- "3": "Zu verlieren wird meine Flamme nicht ersticken. Zeit, das Training wieder zu entfachen!"
- },
- "defeat": {
- "1": "Ich hoffe, ich habe meinen Großvater stolz gemacht… Lass uns irgendwann wieder kämpfen.",
- "2": "Ich… Ich kann nicht glauben, dass ich gewonnen habe! Meine Art zu kämpfen hat funktioniert!",
- "3": "Lass uns bald wieder heiße Moves austauschen!"
- }
- },
- "norman": {
- "encounter": {
- "1": "Ich bin überrascht, dass du es bis hierher geschafft hast. Lass uns kämpfen.",
- "2": "Ich werde alles in meiner Macht stehende tun, um als Arenaleiter zu gewinnen. Los geht's!",
- "3": "Du solltest alles geben! Lasst uns kämpfen!"
- },
- "victory": {
- "1": "Ich habe gegen dich verloren…? Das ist eine Überraschung.",
- "2": "War der Umzug nach Hoenn die richtige Entscheidung? Ich bin mir nicht sicher.",
- "3": "Ich kann es nicht fasen. Das war ein großartiger Kampf."
- },
- "defeat": {
- "1": "Wir haben beide unser Bestes gegeben. Ich hoffe, wir können bald wieder kämpfen.",
- "2": "Du solltest versuchen, mein Kind herauszufordern. Du könntest etwas lernen!",
- "3": "Danke für den tollen Kampf. Viel Glück beim nächsten Mal."
- }
- },
- "winona": {
- "encounter": {
- "1": "Ich bin durch die Lüfte geflogen und habe nach Beute gesucht… und du bist mein Ziel!",
- "2": "Egal, wie unser Kampf ausgeht, meine Flug-Pokémon und ich werden mit Anmut triumphieren. Auf in den Kampf!",
- "3": "Ich hoffe, du hast keine Höhenangst. Lasst uns aufsteigen!"
- },
- "victory": {
- "1": "Du bist der erste Trainer, den ich gesehen habe, der mehr Anmut hat als ich. Ausgezeichnet",
- "2": "Meine Flug-Pokémon sind abgestürzt! Na gut.",
- "3": "Auch wenn ich gefallen sein mag, meine Pokémon werden weiter fliegen!"
- },
- "defeat": {
- "1": "Meine Flug-Pokémon und ich werden für immer elegant tanzen!",
- "2": "Ich hoffe du hast die Show genossen. Unser anmutiger Tanz ist beendet.",
- "3": "Wirst du zurückkommen und unsere elegante Choreographie noch einmal sehen?"
- }
- },
- "tate": {
- "encounter": {
- "1": "Hehehe… Bist du überrascht, mich ohne meine Schwester zu sehen?",
- "2": "Ich kann sehen, was du denkst… Du willst kämpfen!",
- "3": "Wie kannst du jemanden besiegen der deine Gedanken lesen kann?"
- },
- "victory": {
- "1": "Ich kann es nicht ändern… Ich vermisse Svenja…",
- "2": "Die Bande zwischen dir und deinen Pokémon ist stärker als meine.",
- "3": "Zusammen mit Svenja wären wir unschlagbar gewesen. Wir können gegenseitig unsere Sätze beenden!"
- },
- "defeat": {
- "1": "Meine Pokémon und ich sind siegreich.",
- "2": "Wenn du mich nicht besiegen kannst, wirst du auch niemals Svenja besiegen können.",
- "3": "All das verdanke ich meinem strengen Training mit Svenja. Meine Pokémon und ich sind eins."
- }
- },
- "liza": {
- "encounter": {
- "1": "Hihihi… Bist du überrascht, mich ohne meinen Bruder zu sehen?",
- "2": "Ich kann sehen, wonach du verlangst… Du willst kämpfen, oder?",
- "3": "Wie kannst du jemanden besiegen, der eins mit seinen Pokémon ist?"
- },
- "victory": {
- "1": "Ich kann es nicht ändern… Ich vermisse Ben…",
- "2": "Das Band zwischen dir und deinen Pokémon ist stärker als meins.",
- "3": "Zusammen mit Ben wären wir unschlagbar gewesen. Wir können gegenseitig unsere Sätze beenden!"
- },
- "defeat": {
- "1": "Meine Pokémon und ich sind siegreich.",
- "2": "Wenn du mich nicht besiegen kannst, wirst du auch niemals Ben besiegen können.",
- "3": "All das verdanke ich meinem strengen Training mit Ben. Meine Pokémon und ich sind eins."
- }
- },
- "juan": {
- "encounter": {
- "1": "Jetzt ist nicht die Zeit, schüchtern zu sein. Lass uns kämpfen!",
- "2": "Ahahaha, Du wirst Zeuge meiner Kunstfertigkeit mit Wasser-Pokémon!",
- "3": "Ein Taifun nähert sich! Wirst du mich testen können?",
- "4": "Bitte, du wirst Zeuge unserer Kunstfertigkeit.\n$Eine großartige Illusion aus Wasser, die von meinen Pokémon und mir geschaffen wurde!"
- },
- "victory": {
- "1": "Du bist ein Genie, das Wasilli herausfordern kann!",
- "2": "Ich habe mich auf Eleganz konzentriert, während du trainiert hast.\n$Es kein Wunder, dass du gewonnen hast.",
- "3": "Ahahaha! Nun gut, dieses Mal hast du gewonnen.",
- "4": "Ich spüre den Glanz deines Könnens, der alles überwinden wird."
- },
- "defeat": {
- "1": "Meine Pokémon und ich haben eine Illusion aus Wasser geschaffen und sind siegreich hervorgegangen.",
- "2": "Ahahaha, Ich habe gewonnen, und du hast verloren.",
- "3": "Soll ich dir mein Outfit leihen? Es könnte dir beim Kampf helfen! Ahahaha, ich scherze!",
- "4": "Ich bin der Gewinner! Das heißt, du hast verloren."
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "Aufgepasst! Wellenbrecher Marinus… ist… da!",
- "2": "Brechende Wellen! Ich bin Wellenbrecher Marinus!",
- "3": "Ich bin die Flutwelle der Macht, die dich wegspült!"
- },
- "victory": {
- "1": "Das bringt ein Grinsen in mein Gesicht! Guhahaha! Das war ein Spaß!",
- "2": "Hunwah! Es ist vorbei! Wie soll ich das sagen… Ich will mehr! Ich wollte viel mehr kämpfen!",
- "3": "WAAAS?!"
- },
- "defeat": {
- "1": "Yeeeeah! So muss das sein!",
- "2": "Ich habe gewonnen, aber ich will mehr! Ich wollte viel mehr kämpfen!",
- "3": "Bis bald! Ich freue mich auf den nächsten Kampf!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "Ich werde dir die wahre Kraft der prächtigen Flug-Pokémon zeigen!",
- "2": "Winde, bleibt bei mir!",
- "3": "Vater! Ich hoffe, du siehst mir beim Kampf von oben zu!"
- },
- "victory": {
- "1": "Ich verstehe… Ich werde mich anmutig zurückziehen.",
- "2": "Eine Niederlage ist eine Niederlage. Du bist wirklich stark.",
- "3": "…Verdammt! Ich habe verloren!"
- },
- "defeat": {
- "1": "Vater! Ich habe mit deinen geliebten Flug-Pokémon gewonnen…",
- "2": "Flug-Pokémon sind die Besten!",
- "3": "Ich habe das Gefühl, dass ich meinem Vater näher komme!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "Egal, welchen Plan dein raffinierter Verstand auch schmiedet,\n$mein Partner und ich werden ihn mit Sicherheit zu Fall bringen.",
- "2": "Ich bin nicht hier, um zu plaudern. Ich bin hier, um zu gewinnen!",
- "3": "Das ist ein kleines Geschenk von meinen Pokémon… Ich hoffe, du kannst es annehmen!"
- },
- "victory": {
- "1": "Du und deine Pokémon sind einfach zu stark…",
- "2": "Wie…? Wie kann das sein?",
- "3": "Ich wurde total weggespült!"
- },
- "defeat": {
- "1": "Die wütenede Welle schlägt wieder zu!",
- "2": "Es ist Zeit, die Welle des Sieges zu reiten!",
- "3": "Ehehe!"
- }
- },
- "melony": {
- "encounter": {
- "1": "Ich halte mich nicht zurück!",
- "2": "Okay, ich denke, wir sollten anfangen.",
- "3": "Ich werde dich einfrieren!"
- },
- "victory": {
- "1": "Du… Du bist ziemlich gut, oder?",
- "2": "Wenn du Mac triffst, haue ihn für mich um, ja?",
- "3": "Ich denke, du hast 'das Eis brechen' ein wenig zu wörtlich genommen…"
- },
- "defeat": {
- "1": "Siehst du jetzt, wie ernst Kämpfe sein können?",
- "2": "Hee! Es sieht so aus, als hätte ich wieder gewonnen!",
- "3": "Hältst du dich zurück?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "Du siehst stark aus! Los geht's!",
- "2": "Ich bin stark wie das weite Meer. Du wirst weggespült, das ist sicher.",
- "3": "Oh ho, ich treffe auf dich! Das ist abgefahren."
- },
- "victory": {
- "1": "Du hast total gerockt! Du ziehst einige krasse Pokémon groß. Du hast das Trainer-Ding drauf!",
- "2": "Du siehst nicht nur stark aus, du bist auch stark! Eh, ich wurde auch weggespült!",
- "3": "Du bist stark wie eine spektakuläre Welle!"
- },
- "defeat": {
- "1": "Du bist stark, aber nicht stark genug, um das Meer zu beeinflussen, 'OK!",
- "2": "Hee! Sieht so aus, als hätte ich wieder gewonnen!",
- "3": "Süßer, süßer Sieg!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "Entschuldigung. Du bist ein Herausforderer, oder?\nIch bin Anissa, die Geist-Pokémon-Nutzerin\n$der Top Vier. Ich werde dich in die Welt der Bücher entführen.",
- "2": "Ich liebe es, über Trainer und deren Pokémon zu schreiben.\n$Könnte ich dich als Inspiration verwenden?",
- "3": "Jeder, der mit Pokémon arbeitet, hat eine Geschichte zu erzählen. Welche Geschichte wird erzählt?"
- },
- "victory": {
- "1": "Wow. Ich bin sprachlos!",
- "2": "E-entschuldigung! Zuerst muss ich mich bei meinen Pokémon entschuldigen…\n$Es tut mir wirklich leid, dass ihr wegen mir eine schlechte Erfahrung gemacht habt.",
- "3": "Selbst in Anbetracht dessen, bin ich immer noch eine der Top Vier!"
- },
- "defeat": {
- "1": "Eheh.",
- "2": "Das war exzellentes Material für meinen nächsten Roman!",
- "3": "Und wenn sie nicht gestorben sind, dann leben sie noch heute…"
- }
- },
- "marshal": {
- "encounter": {
- "1": "Mein Mentor, Lauro, sieht Potential in dir. Ich werde dich testen,\n$dich an die Grenzen deiner Stärke bringen. Kiai!",
- "2": "Ein Sieg, ein entscheidender Sieg, das ist mein Ziel! Herausforderer, hier komme ich!",
- "3": "Ich selber suche die Stärke eines Kämpfers zu entwickeln und jede Schwäche in mir zu brechen!"
- },
- "victory": {
- "1": "Puh! Gut gemacht!",
- "2": "Während deine Kämpfe weitergehen, strebe nach noch größeren Höhen!",
- "3": "Die Stärke, die du und deine Pokémon gezeigt haben, hat mich tief beeindruckt..."
- },
- "defeat": {
- "1": "Hmm.",
- "2": "Das war ein guter Kampf.",
- "3": "Haaah! Haaah! Haiyaaaah!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "Du erinnerst mich an einen alten Freund. Das macht mich gespannt auf diesen Pokémon-Kampf!",
- "2": "Pokémon-Kämpfe haben keinen Sinn, wenn man nicht darüber nachdenkt, warum man kämpft.\n$Oder besser gesagt, es macht das Kämpfen mit Pokémon sinnlos.",
- "3": "Ich heiße Cheren! Ich bin ein Arenaleiter und Lehrer! Freut mich, dich kennenzulernen."
- },
- "victory": {
- "1": "Danke! Ich habe gesehen, was mir gefehlt hat.",
- "2": "Danke! Ich habe das Gefühl, ein Stück meines Ideals entdeckt zu haben.",
- "3": "Hmm… Das ist problematisch."
- },
- "defeat": {
- "1": "Als Arenaleiter will ich eine Hürde für dich sein, die du überwinden musst.",
- "2": "In Ordnung!",
- "3": "Ich bin so weit gekommen, weil Pokémon an meiner Seite waren.\n$Vielleicht sollten wir darüber nachdenken, warum Pokémon uns helfen,\n$nicht als Pokémon und Trainer, sondern als Beziehung zwischen Lebewesen."
- }
- },
- "chili": {
- "encounter": {
- "1": "Jaaaa! Zeit, mit dem Feuer zu spielen! Ich bin der Stärkste von uns Brüdern!",
- "2": "Ta-da! Der Feuer-Typ-Kämpfer Maik --das bin ich-- wird dein Gegner sein!",
- "3": "Ich werde dir zeigen, was ich und meine feurigen Pokémon draufhaben!"
- },
- "victory": {
- "1": "Du hast mich besiegt. Ich bin... ausgebrannt...",
- "2": "Whoa ho! Du brennst vor Energie!",
- "3": "Autsch! Du hast mich erwischt!"
- },
- "defeat": {
- "1": "Ich brenne! Spiel mit mir, und du wirst dich verbrennen!",
- "2": "Wenn du mit Feuer spielst, wirst du verbrannt!",
- "3": "Ich meine, komm schon, dein Gegner war ich! Du hattest keine Chance!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "Nichts Persönliches... Keine harten Gefühle... Ich und meine Pflanzen-Pokémon werden...\n$Ähm... Wir werden kämpfen, egal was passiert.",
- "2": "Also, ähm, wenn es für dich in Ordnung ist, werde ich, ähm, alles geben, um, äh, dein Gegner zu sein.",
- "3": "OK… Also, ähm, ich bin Benny, ich mag Pflanzen-Pokémon."
- },
- "victory": {
- "1": "Ähm… Ist es jetzt vorbei?",
- "2": "…Was für eine Überraschung. Du bist sehr stark, nicht wahr? \n$Ich glaube, meine Brüder hätten dich auch nicht besiegen können…",
- "3": "…Hmm. Sieht aus, als wäre mein Timing, ähm, schlecht gewesen?"
- },
- "defeat": {
- "1": "Huh? Habe ich gewonnen?",
- "2": "Ich denke... Ich habe wohl gewonnen, weil ich mit meinen Brüdern Maik und Colin traniert habe,\n$und wir so alle stärker geworden sind.",
- "3": "Es... es war ein ziemlich aufregendes Erlebnis..."
- }
- },
- "roark": {
- "encounter": {
- "1": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!",
- "2": "Los geht's! Dies sind meine Gesteins-Pokémon, mein ganzer Stolz!",
- "3": "Gesteins-Pokémon sind einfach die besten!",
- "4": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!"
- },
- "victory": {
- "1": "W-was? Das kann nicht sein! Meine total tranierten Pokémon!",
- "2": "…Wir haben die Kontrolle verloren. Beim nächsten Mal fordere ich dich\n$zu einem Fossilien-Ausgrabungswettbewerb heraus.",
- "3": "Mit deinem Können ist es nur natürlich, dass du gewinnst.",
- "4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?",
- "5": "Ich habe es vermasselt."
- },
- "defeat": {
- "1": "Siehst du? Ich bin stolz auf meinen steinigen Kampfstil!",
- "2": "Danke! Der Kampf hat mir Vertrauen gegeben, dass ich vielleicht meinen Vater besiegen kann!",
- "3": "Ich fühle mich, als hätte ich gerade einen wirklich hartnäckigen Felsen durchbrochen!"
- }
- },
- "morty": {
- "encounter": {
- "1": "Mit ein bisschen mehr könnte ich eine Zukunft sehen, in der ich das legendäre Pokémon treffe.\n$Du wirst mir helfen, dieses Level zu erreichen!",
- "2": "Es heißt, dass ein regenbogenfarbenes Pokémon vor einem wirklich starken Trainer erscheinen wird.\n$Ich habe an diese Geschichte geglaubt, deshalb habe ich mein ganzes Leben lang heimlich trainiert.\n$Als Ergebnis kann ich jetzt Dinge sehen, die andere nicht sehen.\n$Ich sehe einen Schatten der Person, die das Pokémon erscheinen lassen wird.\n$Ich glaube, diese Person bin ich! Du wirst mir helfen, dieses Level zu erreichen!",
- "3": "Ob du es glaubst oder nicht, mystische Kräfte existieren.",
- "4": "Du kannst die Früchte meines Trainings bezeugen.",
- "5": "Du musst deine Seele mit der eines Pokémon vereinen. Kannst du das?",
- "6": "Sag mal, willst du an meinem Training teilnehmen?"
- },
- "victory": {
- "1": "Ich bin noch nicht gut genug...",
- "2": "Ich sehe... Deine Reise hat dich an weit entfernte Orte geführt und du hast viel mehr gesehen als ich.\n$Ich beneide dich darum...",
- "3": "Wie ist das möglich...",
- "4": "Ich glaube nicht, dass unser Potenzial so unterschiedlich ist.\n$Aber du scheinst etwas mehr zu haben... Sei es drum.",
- "5": "Ich brauche wohl mehr Training.",
- "6": "Das ist schade."
- },
- "defeat": {
- "1": "Ich habe... einen weiteren Schritt nach vorne gemacht.",
- "2": "Fufufu...",
- "3": "W-was?! Das kann nicht sein! Selbst das war nicht genug?",
- "4": "Ich fühle mich, als hätte ich gerade einen wirklich hartnäckigen Felsen durchbrochen!",
- "5": "Ahahahah!",
- "6": "Ich wusste, dass ich gewinnen würde!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "Ich will gewinnen, also werde ich genau das tun!",
- "2": "Ich kämpfe, weil ich kämpfen will! Und weißt du was? So sollte es sein!"
- },
- "victory": {
- "1": "Ich wollte gewinnen... aber ich habe verloren!",
- "2": "Ich habe verloren... weil ich nicht gewinnen konnte!"
- },
- "defeat": {
- "1": "Hey, warte mal. Habe ich gerade gewonnen? Ich glaube, ich habe gewonnen! Das ist befriedigend!",
- "2": "Wooo! Das war unglaublich!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "Ich möchte jemandem helfen. Daher kann ich es mir nicht leisten, zu verlieren.\n$… Unser Kampf beginnt jetzt."
- },
- "victory": {
- "1": "Ich bin... nicht genug, wie ich sehe."
- },
- "defeat": {
- "1": "Der Sieg gehört mir. Gut gekämpft."
- }
- },
- "lacey": {
- "encounter": {
- "1": "Ich werde dir mit meinem gewohnten Team, als Mitglied der Top Vier gegenüberstehen."
- },
- "victory": {
- "1": "Das war ein großartiger Kampf!"
- },
- "defeat": {
- "1": "Geben wir deinem Pokémon einen kräftigen Applaus für ihre Bemühungen!"
- }
- },
- "drayton": {
- "encounter": {
- "1": "Mann, ich liebe Stühle. Liebst du nicht auch Stühle? Was für Lebensretter.\n$Ich verstehe nicht, warum nicht jeder einfach die ganze Zeit sitzt. Stehen ist anstrengend!"
- },
- "victory": {
- "1": "Ich hätte damit rechnen sollen!"
- },
- "defeat": {
- "1": "Heh heh! Macht nichts, ich habe hier nur einen Sieg eingefahren.\n$Ich verstehe, wenn du sauer bist, aber geh nicht völlig auf mich los, okay?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "Hast du den Garten-Spielplatz genossen, den ich mit all diesen kräftigen Pflanzen angelegt habe?\n$Ihre Stärke ist ein Zeichen meiner Stärke als Gärtner und Arenaleiter! \n$Bist du sicher, dass du bereit bist, dich dem zu stellen?"
- },
- "victory": {
- "1": "Du glaubst an deine Pokémon... Und sie glauben an dich... Es war ein feiner Kampf, Sprössling."
- },
- "defeat": {
- "1": "Hohoho... In der Tat. Schwache kleine Grashalme brechen selbst durch Beton."
- }
- },
- "viola": {
- "encounter": {
- "1": "Ob es die Tränen der Frustration nach einer Niederlage sind\n$oder das Aufblühen der Freude nach einem Sieg...\n$Beides sind großartige Motive für meine Kamera! Fantastisch! Das wird einfach fantastisch!\n$Jetzt komm auf mich zu!",
- "2": "Mein Objektiv ist immer auf den Sieg fokussiert - ich lasse mir diesen Moment nicht entgehen!"
- },
- "victory": {
- "1": "Du und deine Pokémon haben mir eine ganz neue Tiefenschärfe gezeigt! Einfach fantastisch!",
- "2": "Die Welt, die du durch ein Objektiv siehst, und die Welt,\n$die du mit einem Pokémon an deiner Seite siehst...\n$Die gleiche Welt kann völlig anders aussehen, je nach Blickwinkel."
- },
- "defeat": {
- "1": "Das Foto vom Moment meines Sieges wird ein echter Gewinner sein!",
- "2": "Ja! Ich habe einige großartige Fotos gemacht!"
- }
- },
- "candice": {
- "encounter": {
- "1": "Du willst Frida herausfordern? Klar! Ich habe auf jemanden Starken gewartet!\n$Aber ich sollte dir sagen, ich bin stark, weil ich weiß, wie man sich konzentriert.",
- "2": "Pokémon, Mode, Romantik... Es geht alles um Konzentration!\n$Ich werde dir zeigen, was ich meine. Mach dich bereit zu verlieren!"
- },
- "victory": {
- "1": "Ich muss sagen, ich bin von dir angetan! Vielleicht bewundere ich dich sogar ein bisschen.",
- "2": "Wow! Du bist großartig! Du hast meinen Respekt verdient!\n$Ich denke, dein Fokus und Wille haben uns völlig umgehauen."
- },
- "defeat": {
- "1": "Ich habe deinen Siegeswillen gespürt, aber ich verliere nicht!",
- "2": "Siehst du? Fridas Fokus! Der Fokus meiner Pokémon ist auch großartig!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "Du hast eine Sieger-Aura. Also, das wird Spaß machen. Lass uns kämpfen!"
- },
- "victory": {
- "1": "Unglaublich! Du bist sehr gut, nicht wahr?"
- },
- "defeat": {
- "1": "Ja! Meine Pokémon und ich sind perfekt abgestimmt!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "Okay! Lass mich gegen dich antreten!"
- },
- "victory": {
- "1": "Kämpfen ist eine tiefe und komplexe Angelegenheit..."
- },
- "defeat": {
- "1": "Ein Sieg über ein Mitglied der Top Vier ist nicht leicht zu erringen."
- }
- },
- "cress": {
- "encounter": {
- "1": "Das ist korrekt! Ich und meine geschätzten Wasser-Pokémon werden deine Gegner im Kampf sein!"
- },
- "victory": {
- "1": "Verlieren? Ich? Das glaube ich nicht."
- },
- "defeat": {
- "1": "Das ist das passende Ergebnis, wenn ich dein Gegner bin."
- }
- },
- "allister": {
- "encounter": {
- "1": "'N-Nio.\nH-hier… g-geht's los…"
- },
- "victory": {
- "1": "Ich hätte beinahe meine Maske vor Schock verloren... Das war...\n$Wow. Ich sehe dein Können, wie es wirklich ist."
- },
- "defeat": {
- "1": "D-das war klasse!"
- }
- },
- "clay": {
- "encounter": {
- "1": "Harrumph! Du hast mich warten lassen, oder? Gut, jetzt will ich sehen, was du drauf hast!"
- },
- "victory": {
- "1": "Mann oh Mann... Es fühlt sich gut an, alles zu geben und trotzdem besiegt zu werden!"
- },
- "defeat": {
- "1": "Was wichtig ist, ist wie du auf eine Niederlage reagierst.\n$Deshalb sind Leute, die Niederlagen als Ansporn nutzen, um besser zu werden, stark."
- }
- },
- "kofu": {
- "encounter": {
- "1": "Ich werde dir ein ganzes Menü aus Wasser-Pokémon servieren! Aber versuch nicht, sie zu essen!"
- },
- "victory": {
- "1": "Vaultin' Veluza! Du bist ein lebhafter Mensch, nicht wahr!\n$Ein bisschen ZU lebhaft, wenn ich das so sagen darf!"
- },
- "defeat": {
- "1": "Komm bald wieder zu mir, hörst du?"
- }
- },
- "tulip": {
- "encounter": {
- "1": "Erlaube mir, meine Fähigkeiten einzusetzen, um deine niedlichen kleinen Pokémon noch schöner zu machen!"
- },
- "victory": {
- "1": "Deine Stärke hat eine Magie, die nicht wegzuwaschen ist."
- },
- "defeat": {
- "1": "Weißt du, in meinem Beruf verschwinden Menschen,\n$die in einem Bereich kein Talent haben, oft schnell und werden nie wieder gesehen."
- }
- },
- "sidney": {
- "encounter": {
- "1": "Mir gefällt der Blick, den du mir zuwirfst. Ich denke, du wirst mir einen guten Kampf liefern.\n$Das ist gut! Sieht wirklich gut aus! In Ordnung!\n$Du und ich, lass uns einen Kampf genießen, der nur hier stattfinden kann!"
- },
- "victory": {
- "1": "Nun, wie gefällt dir das? Ich habe verloren! Eh, es hat Spaß gemacht, also ist es egal."
- },
- "defeat": {
- "1": "Wir sind hier nicht nachtragend, okay?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "Während meines Trainings habe ich die Fähigkeit erlangt, mit Geister-Pokémon zu kommunizieren.\n$Ja, die Bindung, die ich zu Pokémon entwickelt habe, ist extrem stark.\n$Also komm, versuche nur, meinen Pokémon Schaden zuzufügen!"
- },
- "victory": {
- "1": "Oh, Mist. Ich habe verloren."
- },
- "defeat": {
- "1": "Ich freue mich darauf, dich irgendwann wieder zu bekämpfen!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "Alles, was ich gesehen habe, sind Herausforderungen von schwachen Trainern und ihren Pokémon.\n$Und du? Es würde mich überaus freuen, wenn ich gegen dich alles geben könnte!"
- },
- "victory": {
- "1": "Du und deine Pokémon… Wie heiß eure Geister brennen!\n$Die alles verzehrende Hitze überwältigt.\n$Es ist kein Wunder, dass meine eisigen Fähigkeiten dir nichts anhaben konnten."
- },
- "defeat": {
- "1": "Ein leidenschaftlicher Kampf, in der Tat."
- }
- },
- "drake": {
- "encounter": {
- "1": "Um mit Pokémon als Partner zu kämpfen, weißt du, was dafür nötig ist? Weißt du, was gebraucht wird?\n$Wenn nicht, wirst du nie gegen mich gewinnen!"
- },
- "victory": {
- "1": "Hervorragend, muss ich sagen."
- },
- "defeat": {
- "1": "Ich habe alles für diesen Kampf gegeben!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "Da ist etwas an dir… Eine Veränderung in deinem Auftreten.\n$Ich denke, ich spüre das bei dir. Zeig es mir. Zeig mir die Kraft, die du mit deinen Pokémon hast.\n$Und ich werde dir im Gegenzug eine Vorstellung von\n$Illusionen im Wasser von mir und meinen Pokémon präsentieren!"
- },
- "victory": {
- "1": "Bravo. Ich erkenne jetzt deine Authentizität und Großartigkeit als Pokémon-Trainer.\n$Ich freue mich sehr, dich und deine Pokémon kennengelernt zu haben. Du hast dich als würdig erwiesen."
- },
- "defeat": {
- "1": "Eine große Illusion!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "Niemand kann mich bei eisigen Pokémon übertreffen! Gefrierende Angriffe sind mächtig!\n$Deine Pokémon werden mir ausgeliefert sein, wenn sie erst einmal eingefroren sind! Hahaha!\n$Bist du bereit?"
- },
- "victory": {
- "1": "Wie kannst du es wagen!"
- },
- "defeat": {
- "1": "Es gibt nichts, was du tun kannst, wenn du erst einmal eingefroren bist."
- }
- },
- "will": {
- "encounter": {
- "1": "Ich habe auf der ganzen Welt trainiert und meine Psycho-Pokémon stark gemacht.\n$Ich kann nur besser werden! Verlieren ist keine Option!"
- },
- "victory": {
- "1": "Ich... ich kann es nicht... glauben..."
- },
- "defeat": {
- "1": "Das war knapp. Ich frage mich, was dir fehlt."
- }
- },
- "malva": {
- "encounter": {
- "1": "Ich fühle mich, als könnte mein Herz in Flammen aufgehen.\n$Ich brenne vor Hass auf dich, Wicht!"
- },
- "victory": {
- "1": "Was für Neuigkeiten... Ein neuer Herausforderer hat Pachira besiegt!"
- },
- "defeat": {
- "1": "Ich bin begeistert! Ja, begeistert, dass ich dich unter meinen Fußsohlen zerquetschen konnte."
- }
- },
- "hala": {
- "encounter": {
- "1": "Der alte Hala ist hier, um dich zum Schreien zu bringen!"
- },
- "victory": {
- "1": "Ich konnte die Kraft spüren, die du auf deiner Reise gewonnen hast."
- },
- "defeat": {
- "1": "Haha! Was für ein erfreulicher Kampf!"
- }
- },
- "molayne": {
- "encounter": {
- "1": "Ich habe die Kapitänsposition meinem Cousin Chrys gegeben,\n$aber ich bin zuversichtlich in meine Fähigkeiten.\n$Meine Stärke ist wie die einer Supernova!"
- },
- "victory": {
- "1": "Ich habe sicherlich einen interessanten Trainer zum Kämpfen gefunden!"
- },
- "defeat": {
- "1": "Ahaha. Was für ein interessanter Kampf."
- }
- },
- "rika": {
- "encounter": {
- "1": "Ich würde sagen, ich werde es dir leicht machen, aber... das wäre gelogen! Denke schnell!"
- },
- "victory": {
- "1": "Nicht schlecht, wirklich!"
- },
- "defeat": {
- "1": "Nahahaha! Du bist wirklich etwas Besonderes!"
- }
- },
- "bruno": {
- "encounter": {
- "1": "Wir werden dich mit unserer überlegenen Kraft niederschmettern! Hoo hah!"
- },
- "victory": {
- "1": "Warum? Wie konnte ich verlieren?"
- },
- "defeat": {
- "1": "Du kannst mich herausfordern, so oft du willst, aber das Ergebnis wird sich nie ändern!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "Ich bin Kai, der Arenaleiter von Azalea City. Ich bin ein großer Fan von Käfer-Pokémon."
- },
- "victory": {
- "1": "Wow, erstaunlich! Du bist ein Experte für Pokémon!\n$Meine Forschung ist noch nicht abgeschlossen. OK, du gewinnst."
- },
- "defeat": {
- "1": "Danke! Dank unseres Kampfes konnte ich auch Fortschritte in meiner Forschung machen!"
- }
- },
- "koga": {
- "encounter": {
- "1": "Fwahahahaha! Pokémon sind nicht nur rohe Gewalt - das wirst du bald genug sehen!"
- },
- "victory": {
- "1": "Ah! Du hast deinen Wert bewiesen!"
- },
- "defeat": {
- "1": "Hast du gelernt, die Techniken der Ninja zu fürchten?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "Nun, würdest du dieser alten Dame zeigen, wie viel du gelernt hast?"
- },
- "victory": {
- "1": "Nun! Liebes Kind, ich muss sagen, das war sehr beeindruckend.\n$Deine Pokémon haben an dich geglaubt und ihr Bestes gegeben, um dir den Sieg zu sichern.\n$Obwohl ich verloren habe, finde ich mich mit einem dummen Grinsen wieder!"
- },
- "defeat": {
- "1": "Hahahahah! Sieht so aus, als hätte diese alte Dame gewonnen!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "Nun denn, Herausforderer, ich werde erforschen,\n$wie du mit den Pokémon kämpfst, die du so liebevoll aufgezogen hast!"
- },
- "victory": {
- "1": "Meine Theorie über dich war korrekt. Du bist mehr als nur talentiert... \n$Du bist motiviert! Ich salutier' dir!"
- },
- "defeat": {
- "1": "Ah ha ha! Wenn du verlierst, analysiere warum und nutze dieses Wissen im nächsten Kampf!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "Solange ich lebe, werde ich danach streben, die ultimative Küche...\n$und die stärksten Gegner im Kampf zu finden!"
- },
- "victory": {
- "1": "Ich werde die Erinnerung an dich und deine Pokémon für immer in meinem Herzen bewahren."
- },
- "defeat": {
- "1": "Unser Pokémon-Kampf war wie Nahrung für meine Seele. Er wird mich weiter antreiben.\n$So werde ich dir meinen Respekt erweisen, dass du alles im Kampf gegeben hast!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "Mach dich bereit! Ich werde dir den Verstand aus dem Kopf schlagen!"
- },
- "victory": {
- "1": "Wahnsinn! Deine Vernunft ist schon giftiger als meine!"
- },
- "defeat": {
- "1": "Hey, komm schon! Sei ernst! Du musst mehr geben!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "Hier ist keine Einführung nötig. Zeit, gegen mich, Mayla, zu kämpfen!"
- },
- "victory": {
- "1": "Wirklich lieblich... Sowohl du als auch deine Pokémon..."
- },
- "defeat": {
- "1": "Mmm-hmm."
- }
- },
- "poppy": {
- "encounter": {
- "1": "Oooh! Willst du einen Pokémon-Kampf mit mir führen?"
- },
- "victory": {
- "1": "Uagh?! Mmmuuuggghhh..."
- },
- "defeat": {
- "1": "Jaaa! Ich hab's geschafft! Ich hab dich besiegt! Du kannst kommen für... Für... Einen Revanchekampf?\n$Komm jederzeit für einen Revanchekampf!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "Pokémon sind zum Kämpfen da! Ich zeige dir, wie ein echter Trainer kämpft!"
- },
- "victory": {
- "1": "Oh mein Gott! Du bist etwas Besonderes, Kind!"
- },
- "defeat": {
- "1": "Bahaha. So wird ein richtiger Kampf geführt!"
- }
- },
- "flint": {
- "encounter": {
- "1": "Hoffentlich bist du aufgewärmt, denn hier kommt der Urknall!"
- },
- "victory": {
- "1": "Unglaublich! Deine Moves sind so heiß, dass meine im Vergleich lauwarm wirken!"
- },
- "defeat": {
- "1": "Huh? War das alles? Ich denke, du brauchst etwas mehr Leidenschaft."
- }
- },
- "grimsley": {
- "encounter": {
- "1": "Der Gewinner nimmt alles, und es bleibt nichts für den Verlierer."
- },
- "victory": {
- "1": "Wenn man verliert, verliert man alles... Das nächste, wonach ich suche, wird auch der Sieg sein!"
- },
- "defeat": {
- "1": "Wenn jemand gewinnt, verliert derjenige, der gegen diese Person gekämpft hat."
- }
- },
- "caitlin": {
- "encounter": {
- "1": "Ich bin es, die erschien, als die Blume sich öffnete. Du, der du gewartet hast…\n$Du siehst aus wie ein Pokémon-Trainer mit verfeinerter Stärke und vertiefter Freundlichkeit.\n$Was ich in meinem Gegner suche, ist überlegene Stärke…\n$Bitte entfessle deine Kraft in vollem Umfang!"
- },
- "victory": {
- "1": "Meine Pokémon und ich haben so viel gelernt! Ich danke dir."
- },
- "defeat": {
- "1": "Ich strebe danach, mit Eleganz und Anmut zu siegen."
- }
- },
- "diantha": {
- "encounter": {
- "1": "Gegen dich und deine Pokémon zu kämpfen, die alle voller Hoffnung für die Zukunft sind...\n$Ehrlich gesagt, es erfüllt mich mit der Energie, die ich brauche, um jeden neuen Tag anzugehen!\n$Wirklich!"
- },
- "victory": {
- "1": "Den edlen Geist von dir und deinen Pokémon im Kampf zu erleben, hat mein Herz wirklich berührt..."
- },
- "defeat": {
- "1": "Oh, fantastisch! Was denkst du? Mein Team war ziemlich cool, oder?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "Guten Tag, junger Herausforderer! Wahrlich, ich bin die berühmte Klinge aus gehärtetem Stahl,\n$Herzog Thymelot! Lasst den Kampf beginnen! En garde!"
- },
- "victory": {
- "1": "Ruhmreich! Das Vertrauen, das du mit deinen ehrenvollen Pokémon teilst, übertrifft sogar meines!"
- },
- "defeat": {
- "1": "Was für eine Magie ist das? Mein Herz, es hämmert unaufhörlich in meiner Brust!\n$Gegen einen so würdigen Gegner zu gewinnen, verleiht meiner Seele Flügel - so fliege ich!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "Kämpfen macht einfach Spaß! Komm schon, ich schaffe das!"
- },
- "victory": {
- "1": "Ich bin... sprachlos! Wie hast du das gemacht?!"
- },
- "defeat": {
- "1": "Ehaha! Was für ein erstaunlicher Sieg!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "Hallo... Ich bin's, Aoki.\n$Ich bin auch Mitglied der Top Vier, ja... Leider für mich."
- },
- "victory": {
- "1": "Nun, das hat uns den Wind aus den Segeln genommen..."
- },
- "defeat": {
- "1": "Es ist Zeit für ein Treffen mit dem Boss."
- }
- },
- "lance": {
- "encounter": {
- "1": "Ich habe auf dich gewartet. Erlaube mir, deine Fähigkeiten zu testen.",
- "2": "Ich dachte, du würdest es so weit schaffen. Lass uns anfangen."
- },
- "victory": {
- "1": "Du hast mich besiegt. Du bist großartig!",
- "2": "Ich hätte nie erwartet, dass ein anderer Trainer mich schlägt... Ich bin überrascht."
- },
- "defeat": {
- "1": "Das war knapp. Willst du es nochmal versuchen?",
- "2": "Es ist nicht so, dass du schwach bist. Lass dich davon nicht stören."
- }
- },
- "karen": {
- "encounter": {
- "1": "Ich bin Melanie. Möchtest du einen Kampf mit meinen Unlicht-Pokémon?",
- "2": "Ich bin anders als die, die du bereits getroffen hast.",
- "3": "Du hast ein charmantes Team zusammengestellt. Unser Kampf wird sicher gut."
- },
- "victory": {
- "1": "Nein! Ich kann nicht gewinnen. Wie bist du so stark geworden?",
- "2": "Ich werde nicht von meinem gewählten Weg abweichen.",
- "3": "Der Champion freut sich darauf, dich kennenzulernen."
- },
- "defeat": {
- "1": "Das habe ich erwartet.",
- "2": "Nun, das war relativ unterhaltsam.",
- "3": "Komm mich jederzeit besuchen."
- }
- },
- "milo": {
- "encounter": {
- "1": "Es scheint, als würdest du Pokémon wirklich gut verstehen.\n$Das wird ein harter Kampf!\n$Ich muss mein Pokémon Dynamaximieren, wenn ich gewinnen will!"
- },
- "victory": {
- "1": "Die Kraft des Grases ist verwelkt... Was für ein unglaublicher Herausforderer!"
- },
- "defeat": {
- "1": "Das wird dich wirklich schockieren und in Ehrfurcht versetzen."
- }
- },
- "lucian": {
- "encounter": {
- "1": "Einen Moment, bitte. Das Buch, das ich lese, hat fast seinen spannenden Höhepunkt erreicht...\n$Der Held hat ein mystisches Schwert erlangt und steht vor seiner letzten Prüfung... Ah, egal.\n$Da du es so weit geschafft hast, lege ich das beiseite und kämpfe gegen dich.\n$Lass mich sehen, ob du genauso viel Ruhm erlangen wirst wie der Held meines Buches!"
- },
- "victory": {
- "1": "Ich sehe... Es scheint, als hättest du mich schachmatt gesetzt."
- },
- "defeat": {
- "1": "Ich habe einen Ruf zu wahren."
- }
- },
- "drasna": {
- "encounter": {
- "1": "Du musst ein starker Trainer sein. Ja, ganz stark...\n$Das sind wunderbare Neuigkeiten! Gegen Gegner wie dich und dein Team zu kämpfen,\n$lässt meine Pokémon wie Unkraut wachsen!"
- },
- "victory": {
- "1": "Oh, meine Güte. Das war wirklich ein schneller Kampf... Ich hoffe, du kommst bald wieder!"
- },
- "defeat": {
- "1": "Wie kann das sein?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "Also, da bist du… Warum sehen wir nicht, wen die Winde heute begünstigen, dich… oder mich?"
- },
- "victory": {
- "1": "Es frustriert mich als Mitglied der Top Vier, aber es scheint, dass deine Stärke echt ist."
- },
- "defeat": {
- "1": "Das war ein Ass!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "Bereite dich darauf vor, aus erster Hand zu erfahren,\n$wie sich der feurige Atem eines erbitterten Kampfes anfühlt!"
- },
- "victory": {
- "1": "Das Glück hat mir dieses Mal gelächelt, aber...\n$Angesichts des Verlaufs des Kampfes, wer weiß, ob ich das nächste Mal so viel Glück haben werde."
- },
- "defeat": {
- "1": "Das war ein Ass!"
- }
- },
- "blue": {
- "encounter": {
- "1": "Du musst ziemlich gut sein, um so weit zu kommen."
- },
- "victory": {
- "1": "Ich habe nur gegen ihn und jetzt gegen dich verloren… Ihn? Haha..."
- },
- "defeat": {
- "1": "Siehst du? Meine Stärke hat mich hierher gebracht."
- }
- },
- "piers": {
- "encounter": {
- "1": "Mach dich bereit für einen Moshpit mit mir und meiner Truppe! Spikeford, es ist Zeit zu rocken!"
- },
- "victory": {
- "1": "Ich und mein Team haben unser Bestes gegeben. Lass uns irgendwann wieder zu einem Kampf treffen..."
- },
- "defeat": {
- "1": "Meine Kehle ist heiser vom Schreien... Aber das war ein aufregender Kampf!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "Oh... Deine Pokémon sind beeindruckend. Ich denke, ich werde das genießen."
- },
- "victory": {
- "1": "Du bist wirklich stark. Ich muss mich auch viel mehr anstrengen."
- },
- "defeat": {
- "1": "Ich habe nie erwartet zu gewinnen."
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "Ich bin immer noch der Champion. Ich werde nichts zurückhalten."
- },
- "victory": {
- "1": "Dies ist das Aufkommen eines neuen Champions."
- },
- "defeat": {
- "1": "Ich habe meinen Titel erfolgreich verteidigt."
- }
- },
- "steven": {
- "encounter": {
- "1": "Erzähl mir... Was hast du auf deiner Reise mit deinen Pokémon gesehen?\n$Was hast du gefühlt, als du so viele andere Trainer getroffen hast?\n$Durch dieses reiche Land zu reisen... Hat es etwas in dir geweckt?\n$Ich möchte, dass du mir alles zeigst, was du gelernt hast.\n$Meine Pokémon und ich werden dir im Gegenzug mit allem antworten, was wir wissen!"
- },
- "victory": {
- "1": "Also falle ich, der Champion, in der Niederlage..."
- },
- "defeat": {
- "1": "Das war gut verbrachte Zeit! Danke!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "Ich, Cynthia, akzeptiere deine Herausforderung! Es wird keine Pause von mir geben!"
- },
- "victory": {
- "1": "Egal wie viel Spaß der Kampf macht, er wird irgendwann enden..."
- },
- "defeat": {
- "1": "Selbst wenn du verlierst, verliere niemals deine Liebe zu Pokémon."
- }
- },
- "iris": {
- "encounter": {
- "1": "Weißt du was? Ich freue mich wirklich darauf, ernsthafte Kämpfe mit starken Trainern zu führen!\n$Ich meine, komm schon! Die Trainer, die es hierher schaffen, sind Trainer,\n$die den Sieg mit jeder Faser ihres Seins anstreben!\n$Und sie kämpfen Seite an Seite mit Pokémon, die unzählige schwierige Kämpfe durchgemacht haben!\n$Wenn ich mit solchen Leuten kämpfe, werde nicht nur ich stärker, sondern auch meine Pokémon!\n$Und wir werden uns noch besser kennenlernen! OK! Mach dich bereit!\n$Ich bin Iris, die Champion der Pokémon-Liga, und ich werde dich besiegen!"
- },
- "victory": {
- "1": "Aghhhh... Ich habe mein Bestes gegeben, aber wir haben verloren..."
- },
- "defeat": {
- "1": "Juhu! Wir haben gewonnen!"
- }
- },
- "hau": {
- "encounter": {
- "1": "Ich frage mich, ob ein Trainer anders kämpft,\n$je nachdem, ob er aus einer warmen oder einer kalten Region stammt.\n$Lass es uns testen!"
- },
- "victory": {
- "1": "Das war großartig! Ich denke, ich verstehe dein Vibe jetzt ein bisschen besser!"
- },
- "defeat": {
- "1": "Ma-an, das war eine Art Kampf!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "Ich habe mich entschieden, erneut meinen Hut in den Ring zu werfen.\n$Komm jetzt... Zeig mir die Früchte deines Trainings."
- },
- "victory": {
- "1": "Ich freue mich auf Neuigkeiten über all deine Erfolge!"
- },
- "defeat": {
- "1": "Was ist los? Das ist doch nicht alles, oder?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "Yesss! Ich bin so aufgeregt! Zeit, dass wir uns austoben!"
- },
- "victory": {
- "1": "Na gut, das ist ärgerlich, aber ich hatte trotzdem Spaß! Ich werde dich nächstes Mal erwischen!"
- },
- "defeat": {
- "1": "Das war ein großartiger Kampf! Definitiv fruchtbar."
- }
- },
- "leon": {
- "encounter": {
- "1": "Wir werden eine absolut großartige Zeit haben!"
- },
- "victory": {
- "1": "Meine Zeit als Champion ist vorbei...\n$Aber was für eine großartige Zeit war das!\n$Danke für den großartigsten Kampf, den ich je hatte!"
- },
- "defeat": {
- "1": "Das war eine absolut großartige Zeit!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "Hey! Findest du nicht auch, dass Pokémon total süß sind?"
- },
- "victory": {
- "1": "Waaah! Waaah! Du bist so gemein!"
- },
- "defeat": {
- "1": "Und das war's!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "Ha! Du willst mich herausfordern? Bist du mutig oder einfach nur unwissend?"
- },
- "victory": {
- "1": "Du bist stark! Würdest du mich bitte zu deinem Schüler machen?"
- },
- "defeat": {
- "1": "Da. Merkst du, wie viel mächtiger ich bin als du?"
- }
- },
- "katy": {
- "encounter": {
- "1": "Lass deine Wachsamkeit nicht nach, es sei denn, du willst von den Füßen gerissen werden!"
- },
- "victory": {
- "1": "Alle meine süßen kleinen Pokémon fielen wie Fliegen!"
- },
- "defeat": {
- "1": "Iss auf, mein süßes kleines Vivillon!"
- }
- },
- "pryce": {
- "encounter": {
- "1": "Jugend allein garantiert keinen Sieg! Erfahrung ist, was zählt."
- },
- "victory": {
- "1": "Hervorragend! Das war perfekt. Versuche nicht zu vergessen, was du jetzt fühlst."
- },
- "defeat": {
- "1": "Genau wie ich es mir vorgestellt habe."
- }
- },
- "clair": {
- "encounter": {
- "1": "Weißt du, wer ich bin? Und du wagst es trotzdem, mich herauszufordern?"
- },
- "victory": {
- "1": "Ich frage mich, wie weit du mit deinem Können kommen wirst. Das sollte faszinierend sein."
- },
- "defeat": {
- "1": "Das war's."
- }
- },
- "maylene": {
- "encounter": {
- "1": "Ich bin gekommen, um dich jetzt herauszufordern, und ich werde nichts zurückhalten.\n$Bitte bereite dich auf den Kampf vor!"
- },
- "victory": {
- "1": "Ich gestehe die Niederlage ein..."
- },
- "defeat": {
- "1": "Das war großartig."
- }
- },
- "fantina": {
- "encounter": {
- "1": "Du wirst mich herausfordern, ja? Aber ich werde gewinnen.\n$Das tut der Arenaleiter von Herzhofen, non?"
- },
- "victory": {
- "1": "Du bist so fantastisch stark. Ich weiß, warum ich verloren habe."
- },
- "defeat": {
- "1": "Ich bin so, so, sehr glücklich!"
- }
- },
- "byron": {
- "encounter": {
- "1": "Trainer! Du bist jung, genau wie mein Sohn, Veit. \n$Mit mehr jungen Trainern, die das Kommando übernehmen, ist die Zukunft der Pokémon hell! \n$Also, als Hürde für junge Leute nehme ich deine Herausforderung an!"
- },
- "victory": {
- "1": "Hmm! Meine robusten Pokémon - besiegt!"
- },
- "defeat": {
- "1": "Gwahahaha! Wie waren meine robusten Pokémon?!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "Ein alter Brauch entscheidet über das Schicksal. Der Kampf beginnt!"
- },
- "victory": {
- "1": "Schaffe deinen eigenen Weg. Lass dir nichts in den Weg stellen. Dein Schicksal, deine Zukunft."
- },
- "defeat": {
- "1": "Unser Weg ist jetzt klar."
- }
- },
- "volkner": {
- "encounter": {
- "1": "Da du so weit gekommen bist, musst du ziemlich stark sein…\n$Ich hoffe, du bist der Trainer, der mich daran erinnert, wie viel Spaß es macht zu kämpfen!"
- },
- "victory": {
- "1": "Du hast mich besiegt…\n$Dein Verlangen und die edle Art, wie deine Pokémon für dich gekämpft haben…\n$Ich habe mich sogar während unseres Kampfes begeistert gefühlt. Das war ein sehr guter Kampf."
- },
- "defeat": {
- "1": "Es war überhaupt nicht schockierend…\n$Das ist nicht das, was ich wollte!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "M'hm… Wenn ich diesen Kampf gewinne, habe ich das Gefühl,\n$dass ich ein Bild malen kann, das es so noch nie gegeben hat.\n$OK! Ich höre meine Kampf-Muse laut und deutlich. Lass uns gleich loslegen!",
- "2": "Natürlich bin ich wirklich stolz auf all meine Pokémon! \n$Nun, dann... Lass uns gleich loslegen!"
- },
- "victory": {
- "1": "Ist es vorbei? Hat mich meine Muse verlassen?",
- "2": "Hmm… Es ist vorbei! Du bist unglaublich!"
- },
- "defeat": {
- "1": "Wow… Irgendwie ist es doch schön, nicht wahr?",
- "2": "Manchmal höre ich Leute sagen, es war ein hässlicher Sieg. \n$Ich denke, wenn du dein Bestes gibst, ist jeder Sieg schön."
- }
- },
- "elesa": {
- "encounter": {
- "1": "C'est fini! Wenn ich mir dessen sicher bin,\n$fühle ich einen elektrischen Stoß durch meinen Körper laufen!\n$Ich möchte dieses Gefühl erleben, also werden meine geliebten Pokémon\n$jetzt deinen Kopf zum Drehen bringen!"
- },
- "victory": {
- "1": "Ich wollte deinen Kopf zum Drehen bringen, aber du hast mich schockiert."
- },
- "defeat": {
- "1": "Das war irgendwie unbefriedigend… Wirst du nächstes Mal alles geben?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "Es ist endlich Zeit für ein Duell! Das bedeutet den Pokémon-Kampf,\n$der entscheidet, wer an der Spitze steht, richtig? \n$Ich liebe es, auf dem Gipfel zu stehen! Weil man von hohen Orten aus für immer und ewig sehen kann! \n$Also, wie wäre es, wenn wir beide Spaß haben?"
- },
- "victory": {
- "1": "Dein Gegner im Kampf zu sein, ist eine neue Kraftquelle für mich. Danke!"
- },
- "defeat": {
- "1": "Gewinnen oder verlieren, man lernt immer etwas aus einem Kampf, richtig?"
- }
- },
- "brycen": {
- "encounter": {
- "1": "Es gibt auch Stärke darin, mit anderen Menschen und Pokémon zusammen zu sein. \n$Ihre Unterstützung zu erhalten, macht dich stärker. Ich werde dir diese Kraft zeigen!"
- },
- "victory": {
- "1": "Die wunderbare Kombination aus dir und deinen Pokémon! Was für eine schöne Freundschaft!"
- },
- "defeat": {
- "1": "Extreme Bedingungen testen und trainieren dich wirklich!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "Was ich finden möchte, ist ein junger Trainer, der mir eine helle Zukunft zeigen kann.\n$Lass uns mit allem kämpfen, was wir haben: dein Können, meine Erfahrung und die Liebe,\n$mit der wir unsere Pokémon großgezogen haben!"
- },
- "victory": {
- "1": "Dieses intensive Gefühl, das mich nach einer Niederlage überkommt…\n$Ich weiß nicht, wie ich es beschreiben soll."
- },
- "defeat": {
- "1": "Harrumph! Ich weiß, dass deine Fähigkeit größer ist als das!"
- }
- },
- "grant": {
- "encounter": {
- "1": "Es gibt nur eine Sache, die ich mir wünsche. \n$Dass wir, indem wir einander übertreffen, einen Weg zu noch größeren Höhen finden."
- },
- "victory": {
- "1": "Du bist eine Mauer, die ich nicht überwinden kann!"
- },
- "defeat": {
- "1": "Gib nicht auf.\n$Das ist wirklich alles, was es dazu gibt.\n$Die wichtigsten Lektionen im Leben sind einfach."
- }
- },
- "korrina": {
- "encounter": {
- "1": "Zeit für Lady Connies großen Auftritt!"
- },
- "victory": {
- "1": "Es ist dein Wesen, das es deinen Pokémon ermöglicht, sich zu entwickeln!"
- },
- "defeat": {
- "1": "Was für ein explosiver Kampf!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "Oh! Ich bin froh, dass wir uns getroffen haben!"
- },
- "victory": {
- "1": "Deine Leidenschaft für den Kampf inspiriert mich!"
- },
- "defeat": {
- "1": "Es sieht so aus, als würde meine Trainer-Wachstumsmaschine, Mach 2, wirklich funktionieren!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "Oh, wenn das nicht ein junger Trainer ist… Es ist schön, dich so zu treffen.\n$Dann nehme ich an, du hast dir das Recht auf einen Kampf verdient, als Belohnung für deine Bemühungen.\n$Die schwer fassbare Fee mag zart wie eine Brise und empfindlich wie eine Blüte erscheinen,\n$aber sie ist stark."
- },
- "victory": {
- "1": "Ich hoffe, dass du morgen Dinge finden wirst, über die du lächeln kannst…"
- },
- "defeat": {
- "1": "Oh mein Gott, wie schade…"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "Weißt du was? Wir reden alle groß über das, was man vom Kämpfen und von Bindungen lernt und all das…\n$Aber eigentlich mache ich es nur, weil es Spaß macht. \n$Wen kümmert das Prahlen? Lass uns kämpfen!"
- },
- "victory": {
- "1": "Hervorragend! Ich bin so hart wie ein Eisberg, aber du hast mich komplett durchschlagen!"
- },
- "defeat": {
- "1": "Kämpfe mit mir, und das passiert!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "Jeder Trainer und jedes Pokémon trainiert hart, um den Sieg zu erringen.\n$Aber das bedeutet, dass auch dein Gegner hart arbeitet, um zu gewinnen.\n$Am Ende wird das Match von der Seite entschieden, die ihr wahres Potenzial entfesseln kann."
- },
- "victory": {
- "1": "Ich bin froh, dass ich heute gegen dich kämpfen konnte!"
- },
- "defeat": {
- "1": "Das ist eine großartige Möglichkeit für mich, mein eigenes Wachstum zu spüren!"
- }
- },
- "bea": {
- "encounter": {
- "1": "Hast du einen unerschütterlichen Geist, der sich nicht bewegt, egal wie du angegriffen wirst? \n$Ich denke, ich werde das einfach mal testen, oder?"
- },
- "victory": {
- "1": "Ich habe den Kampfgeist deiner Pokémon gespürt, als du sie in den Kampf geführt hast."
- },
- "defeat": {
- "1": "Das war die beste Art von Match, die man sich je wünschen kann."
- }
- },
- "opal": {
- "encounter": {
- "1": "Lass mich sehen, wie du und dein Partner-Pokémon euch verhalten!"
- },
- "victory": {
- "1": "Dein Rosa fehlt noch, aber du bist ein ausgezeichneter Trainer mit ausgezeichneten Pokémon."
- },
- "defeat": {
- "1": "Schade für dich, denke ich."
- }
- },
- "bede": {
- "encounter": {
- "1": "Ich nehme an, ich sollte zweifelsfrei beweisen, wie erbärmlich du bist und wie stark ich bin."
- },
- "victory": {
- "1": "Ich verstehe... Nun, das ist in Ordnung. Ich habe mich sowieso nicht wirklich angestrengt."
- },
- "defeat": {
- "1": "Nicht schlecht, muss ich sagen."
- }
- },
- "gordie": {
- "encounter": {
- "1": "Also, lass uns das hinter uns bringen."
- },
- "victory": {
- "1": "Ich möchte einfach in ein Loch kriechen... Nun, ich denke, es wäre eher wie ein Sturz von hier."
- },
- "defeat": {
- "1": "Kämpfe wie immer, der Sieg wird folgen!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "Die Wahrheit ist, am Ende des Tages... Ich möchte wirklich nur Champion für mich selbst werden!\n$Also nimm es nicht persönlich, wenn ich dir den Hintern versohle!"
- },
- "victory": {
- "1": "OK, ich habe verloren... Aber ich habe viele gute Seiten von dir und deinen Pokémon gesehen!"
- },
- "defeat": {
- "1": "Ich hoffe, du hast unsere Kampfstrategien genossen."
- }
- },
- "raihan": {
- "encounter": {
- "1": "Ich werde den Champion besiegen, das ganze Turnier gewinnen und der Welt beweisen,\n$wie stark der großartige Roy wirklich ist!"
- },
- "victory": {
- "1": "Ich sehe sogar gut aus, wenn ich verliere.\n$Es ist ein echter Fluch.\n$Ich denke, es ist Zeit für ein weiteres Selfie!"
- },
- "defeat": {
- "1": "Lass uns ein Selfie zur Erinnerung machen."
- }
- },
- "brassius": {
- "encounter": {
- "1": "Ich nehme an, du bist bereit? Lassen wir unser gemeinsames Kunstwerk beginnen!"
- },
- "victory": {
- "1": "Ahhh... avant-garde!"
- },
- "defeat": {
- "1": "Ich werde sofort mit einem neuen Stück beginnen!"
- }
- },
- "iono": {
- "encounter": {
- "1": "Hey, Leute! Es ist Zeit für Enigmaras EnigmaTV!!! Naaaa, alles klärchen?\n$Hola, ciao und hallöle! Und schon bist du gefangen in meinem Elektronetz!\n$Wer ich bin, fragst du? Na, Enigmara natürlich! Ich bin hier die Arenaleiterin."
- },
- "victory": {
- "1": "Du leuchtest ja so hell wie ein tausendfacher Donnerblitz!"
- },
- "defeat": {
- "1": "Deine Augen gehören MIR!"
- }
- },
- "larry": {
- "encounter": {
- "1": "Wenn alles gesagt und getan ist, ist Einfachheit am stärksten."
- },
- "victory": {
- "1": "Eine Portion Niederlage, hm?"
- },
- "defeat": {
- "1": "Ich mache Schluss für heute."
- }
- },
- "ryme": {
- "encounter": {
- "1": "Komm schon, Baby! Bring mich zum Zittern bis auf die Knochen!"
- },
- "victory": {
- "1": "Du bist cool, mein Freund - du bewegst meine SEELE!"
- },
- "defeat": {
- "1": "Bis später, Baby!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "Alles, was ich tun muss, ist sicherzustellen, dass die Kraft meiner Pokémon dich bis auf die Knochen kühlt!"
- },
- "victory": {
- "1": "Deine brennende Leidenschaft... Ich mag sie ehrlich gesagt irgendwie."
- },
- "defeat": {
- "1": "Es hat nicht für dich gereicht."
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "Du hast es so weit geschafft, hm? Mal sehen, ob du mit meinen Pokémon umgehen kannst!",
- "2": "Ich werde mein Bestes geben, aber denke nicht, dass ich es dir leicht machen werde!"
- },
- "victory": {
- "1": "Ich kann nicht glauben, dass ich verloren habe... Aber du hast den Sieg verdient. Gut gemacht!",
- "2": "Es sieht so aus, als hätte ich noch viel zu lernen. Toller Kampf trotzdem!"
- },
- "defeat": {
- "1": "Du hast gut gekämpft, aber ich habe den Vorteil! Viel Glück beim nächsten Mal!",
- "2": "Es scheint, als hätte sich mein Training ausgezahlt. Danke für den Kampf!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "Die Gezeiten wenden sich zu meinen Gunsten. Bereit, weggespült zu werden?",
- "2": "Lass uns mit diesem Kampf Wellen schlagen! Ich hoffe, du bist vorbereitet!"
- },
- "victory": {
- "1": "Du hast diese Gewässer perfekt navigiert... Gut gemacht!",
- "2": "Es sieht so aus, als wären meine Strömungen kein Match für dich. Tolle Arbeit!"
- },
- "defeat": {
- "1": "Wasser findet immer einen Weg. Das war ein erfrischender Kampf!",
- "2": "Du hast gut gekämpft, aber die Macht des Ozeans ist unaufhaltsam!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "Bereite dich vor! Mein Kampfgeist brennt hell!",
- "2": "Mal sehen, ob du mit meinem unaufhaltsamen Tempo mithalten kannst!"
- },
- "victory": {
- "1": "Deine Stärke... Sie ist beeindruckend. Du hast diesen Sieg wirklich verdient.",
- "2": "Ich habe diese Intensität noch nie zuvor gespürt. Unglaubliche Leistung!"
- },
- "defeat": {
- "1": "Ein weiterer Sieg für mein intensives Trainingsprogramm! Gut gemacht!",
- "2": "Du hast Stärke, aber ich habe härter trainiert. Toller Kampf!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "Die Schatten fallen... Bist du bereit, dich deinen Ängsten zu stellen?",
- "2": "Mal sehen, ob du mit der Dunkelheit, die ich befehle, umgehen kannst."
- },
- "victory": {
- "1": "Du hast die Schatten vertrieben... Für jetzt. Gut gemacht.",
- "2": "Dein Licht hat meine Dunkelheit durchdrungen. Tolle Leistung."
- },
- "defeat": {
- "1": "Die Schatten haben gesprochen... Deine Stärke reicht nicht aus.",
- "2": "Die Dunkelheit triumphiert... Vielleicht wirst du nächstes Mal das Licht sehen."
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "Ein Sturm zieht auf! Mal sehen, ob du diesen Kampf überstehst!",
- "2": "Mach dich bereit, dem Auge des Sturms zu begegnen!"
- },
- "victory": {
- "1": "Du hast den Sturm bezwungen... Unglaubliche Leistung!",
- "2": "Du hast die Winde perfekt geritten... Toller Kampf!"
- },
- "defeat": {
- "1": "Ein weiterer Sturm überstanden, ein weiterer Sieg errungen! Gut gekämpft!",
- "2": "Du bist in meinen Sturm geraten! Viel Glück beim nächsten Mal!"
- }
- },
- "alder": {
- "encounter": {
- "1": "Mach dich bereit für einen Kampf gegen den stärksten Trainer in Einall! Mich - Lauro!"
- },
- "victory": {
- "1": "Gut gemacht! Du hast wirklich ein unvergleichliches Talent."
- },
- "defeat": {
- "1": "Ein frischer Wind weht durch mein Herz...\n$Was für ein außergewöhnliches Gefühl!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "Durch harte Arbeit werde ich immer stärker und stärker!\n$Ich verliere nicht."
- },
- "victory": {
- "1": "Ich kann es nicht glauben...\n$Was für ein lustiger und herzzerreißender Kampf!"
- },
- "defeat": {
- "1": "Wow, was für ein Kampf!\n$Es ist Zeit für dich, noch härter zu trainieren."
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}Hey, ich habe dich gesucht! Ich weiß, dass du es nicht erwarten konntest loszugehen,\n$aber hättest ja wenigstens Tschüss sagen können...\n$@c{smile_eclosed}Du verfolgst also wirklich deinen Traum?\nIch kann es kaum glauben.\n$@c{serious_smile_fists}Da wir schon einmal hier sind, wie wäre es mit einem Kampf?\nImmerhin muss ich doch sicherstellen, dass du bereit bist.\n$@c{serious_mopen_fists}Halte dich nicht zurück, zeig mir alles was du hast!"
- },
- "victory": {
- "1": "@c{shock}Wow…Du hast mich komplett überrumpelt.\nBist du wirklich ein Anfänger?\n$@c{smile}Vielleicht war es einfach etwas Glück, aber…\nWer weiß, vielleicht schaffst du es irgendwann\n$ja wirklich ganz groß raus zu kommen.\n$Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Die sehen wirklich cool aus.\n$@c{serious_smile_fists}Viel Glück da draußen!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}Da bist du! Ich habe schon überall nach dir gesucht!\n@c{angry_mopen}Hast du etwas vergessen\n$deiner besten Freundin Tschüss zu sagen?\n$@c{smile_ehalf}Du folgst deinem Traum, oder?\nDas ist wirklich heute…\n$@c{smile}Naja, ich vergeben dir, dass du mich vergessen hast, aber nur unter einer Bedingung. @c{smile_wave_wink}Du musst gegen mich kämpfen!\n$@c{angry_mopen}Gib alles! Wir wollen doch nicht, dass dein Abenteuer endet bevor es begonnen hat, richtig?"
- },
- "victory": {
- "1": "@c{shock}Du hast gerade erst angefangen und bist schon so stark?!@d{96} @c{angry}Du hast sowas von betrogen, oder?\n$@c{smile_wave_wink}Ich mach nur Spaß!@d{64} @c{smile_eclosed}Ich habe ehrlich verloren… Ich habe das Gefühl, dass du es dort draußen weit bringen wirst.\n$@c{smile}Übrigens, der Professor hat mich gebeten dir diese Items zu geben. Ich hoffe sie sind hilfreich!\n$@c{smile_wave}Gib wie immer dein Bestes! Ich glaube an dich!"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}Hey, du auch hier?\n@c{smile_eclosed}Immernoch ungeschlagen, hmm…?\n$@c{serious_mopen_fists}Ich weiß es sieht so aus, als wäre ich dir hierher gefolgt, aber das ist so nicht ganz richtig.\n$@c{serious_smile_fists}Ehrlicherweise kann ich es, seit du mich damals besiegt hast, garnicht erwarten erneut gegen dich zu kämpfen.\n$Ich habe selbst hart traniert. Ich werde dir diesesmal also ein würdigerer Gegner sein!.\n$@c{serious_mopen_fists}Halt dich nicht zurück, genauso wie beim letzten Mal!\nLos gehts!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}Oh. Ich war also zu sehr von mir überzeugt.\n$@c{smile}Das ist Ok. Ich hatte mir schon gedacht, dass sowas passiert.\n\n$@c{serious_mopen_fists}Es bedeutet einfach, dass ich mich beim nächsten Mal mehr anstrengen muss!\n\n$@c{smile}Nicht, dass du wirklich Hilfe benötigen würdest, aber ich habe hier noch eins von diesen Dingern herumliegen.\n$Du kannst es haben.\n\n$@c{serious_smile_fists}Erwarte aber nicht, dass ich dir noch mehr gebe!\nIch kann meinen Rivalen doch keine Vorteile verschaffen.\n$@c{smile}Egal, pass auf dich auf!"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}Oh, wie schön dich hier zu trefen. Sieht so aus als wärst du noch ungeschlagen. @c{angry_mopen}Hmm… Nicht schlecht!\n$@c{angry_mopen}Ich weiß was du denkst, und nein, ich habe dich nicht verfolgt. @c{smile_eclosed}Ich bin einfach in der Gegend gewesen.\n$@c{smile_ehalf}Ich freu mich für dich, aber ich muss dich wissen lassen, dass es auch Ok ist ab und zu mal zu verlieren.\n$@c{smile}Wir lernen oft mehr aus unseren Fehlern, als aus unseren Erfolgen.\n$@c{angry_mopen}Auf jeden Fall habe ich für unseren Rückkampf hart traniert. Also zeig mir was du drauf hast!"
- },
- "victory": {
- "1": "@c{neutral}Ich… sollte dieses Mal doch nicht verlieren…\n$@c{smile}Na gut. Das bedeutet ich muss noch härter tranieren!\n$@c{smile_wave}Ich habe noch eins von diesen Dingern!\n@c{smile_wave_wink}Kein Grund mir zu danken~.\n$@c{angry_mopen}Das ist aber das Letzte! Du bekommst ab jett keine Geschenke mehr von mir!\n$@c{smile_wave}Bleib stark!"
- },
- "defeat": {
- "1": "Es ist Ok manchmal zu verlieren…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}Hey, schau mal wen wir hier haben! Ist schon eine Weile her.\n@c{neutral}Du bist… immernoch ungeschlagen?\n$@c{neutral_eclosed}Die Dinge waren irgendwie... seltsam.\nEs ist Zuhause einfach nicht das Gleiche ohne dich.\n$@c{serious}Ich weiß es ist selbstsüchtig, aber ich musste das einfach mal loswerden.\n$@c{neutral_eclosed}Denkst du nicht, dass du dich etwas übernommen hast?\n$@c{serious}Es ist nicht realistisch immer zu gewinnen\nWir müssen manchmal verlieren. Um daran zu wachsen.\n$@c{neutral_eclosed}Du hattest einen guten Lauf, aber es liegt noch so viel vor dir. Es wird nicht gerade einfacher. @c{neutral}Bist du bereit dafür?\n$@c{serious_mopen_fists}Falls ja, beweise es mir!"
- },
- "victory": {
- "1": "@c{angry_mhalf}Das ist doch Schwachsinn… Ich habe kaum aufgehört zu tranieren…\n$Warum bin ich immernoch so viel schwächer?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}Lange nicht gesehen! Immernoch nicht verloren?\n@c{angry}Du fängst mich an zu nerven. @c{smile_wave_wink}Ich mach nur Spaß!\n$@c{smile_ehalf}Aber ehrlich, vermisst du dein Zuhause garnicht? Oder mich?\n$Ich… Ich meine, wir vermissen dich wirklich.\n$@c{smile_eclosed}Ich unterstütze dich bei deinem Traum, aber die Realität ist, du wirst früher oder später verlieren.\n$@c{smile}Und ich bin für dich da falls du es tust, wie immer.\n@c{angry_mopen}Also, zeig mir wie stark du geworden bist!"
- },
- "victory": {
- "1": "@c{shock}Nach allem was ich getan habe… war es immernoch nicht genug…?\n$Wenn es so weiter geht hole ich nie auf…"
- },
- "defeat": {
- "1": "Du hast dein Bestes gegeben. Lass uns nach Hause gehen."
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}Hey.\n$Ich werde jetzt keine Gefälligkeiten mit dir austauschen.\n@c{neutral_eclosed}Ich bin hier um zu gewinnen. Mehr nicht.\n$@c{serious_mhalf_fists}Durch mein Traning habe ich gelernt mein Potenzial zu maximieren.\n$@c{smile}Man hat deutlich mehr Zeit, wenn man auf Schlaf und unnötige soziale Interaktionen verzichtet. \n$@c{serious_mopen_fists}Das ist alles nicht mehr wichtig, nicht solange ich nicht gewonnen habe.\n$@c{neutral_eclosed}Ich bin an dem Punkt an dem ich nicht mehr verliere.\n@c{smile_eclosed}Ich schätze deine Einstellung war doch nicht so falsch.\n$@c{angry_mhalf}Nur die Schwachen verlieren, und ich bin nicht mehr schwach.\n$@c{serious_mopen_fists}Bereite dich vor zu verlieren."
- },
- "victory": {
- "1": "@c{neutral}Was…@d{64} Was bist du?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}Ich bins! Du hast mich doch nicht vergessen, oder?\n$@c{smile}Du solltest stolz auf dich sein. Du hast es soweit gebracht. Glückwunsch!\n$Aber hier endet deine Reise jetzt.\n$@c{smile_eclosed}Du hast etwas in mir erwachen lassen, etwas von dem ich nicht wusste, dass es da war.\n$Alles was ich jetzt mache ist tranieren. @c{smile_ehalf}Ich esse oder schlafe kaum. \n$Ich traniere meine Pokémon den ganzen Tag. Und werde immer stärker.\n$@c{neutral}Genau genommen, erkenne ich mich garnicht wieder.\n$Und jetzt habe ich endlich meinen Höhepunkt erreicht.\nNiemand kann mich jetzt noch schlagen.\n$Und weißt du was? Das ist alles wegen dir.\n@c{smile_ehalf}Ich weiß nicht ob ich dir danken, oder dich hassen soll!\n$@c{angry_mopen}Mach dich bereit!"
- },
- "victory": {
- "1": "@c{neutral}Was…@d{64} Was bist du?"
- },
- "defeat": {
- "1": "$@c{smile}Du solltest stolz darauf sein wie weit du es geschafft hast."
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}So sehen wir uns wieder.\n$@c{neutral}Ich hatte Zeit über alles nachzudenken.\nÜber den Grund, warum alles so merkwürdig erscheint.\n$@c{neutral_eclosed}Dein Traum, mein Antrieb dich besiegen zu wollen…\nEs ist alles Teil von etwas Größerem.\n$@c{serious}Es geht nicht um dich, oder mich… Es geht um diese Welt.\n@c{serious_mhalf_fists}Es ist mein Schicksal dich an deine Grenzen zu treiben.\n$@c{neutral_eclosed}Ob ich meine Aufgabe erfüllt habe kann ich nicht sagen, aber ich habe alles getan was ich konnte.\n$@c{neutral}Der Ort an dem wir uns befinden ist angsteinflößend… \n$Trotzdem fühlt es sich so an, als würde mich das nicht stören, als wäre ich bereits schonmal hier gewesen.\n$@c{serious_mhalf_fists}Dir geht es doch genauso, oder?\n$@c{serious}…und irgendwas hier spricht zu mir.\nDas ist alles was die Welt seit langem kennt.\n$Die Zeiten die wir zusammen verbracht haben, die so nah erscheinen, sind nichts als eine ferne Erinnerung.\n$@c{neutral_eclosed}Wer weiß, ob sie jemals real waren?\n$@c{serious_mopen_fists}Du musst weiter gehen, denn wenn du es nicht tust, wird es nie enden. Du bist der Einzige, der das schaffen kann.\n$@c{serious_smile_fists}Ich… Ich weiß nicht was das alles bedeutet, aber ich fühle, dass es wahr ist.\n$@c{serious_mopen_fists}Wenn du mich nicht hier und jetzt besiegen kannst, hast du keine Chance."
- },
- "victory": {
- "1": "@c{smile_eclosed}Es sieht so aus, als wäre meine Arbeit getan.\n$Ich will dass du mir eine Sache versprichst.\n@c{smile}Komm bitte nach Hause nachdem du die Welt gerettet hast."
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}Jetzt sind es wieder nur wir zwei.\n$@c{smile_eclosed}Weißt du, egal wie ich es drehe und wende…\n$@c{smile_ehalf}Irgendwas stört mich an der ganzen Sache, es erscheint mir irgendwie komisch…\n$@c{smile}Du hast deinen Traum, und ich habe diesen Antrieb…\n$Ich kann nicht anders, als zu glauben, dass es einen größeren Zweck gibt.\n$@c{smile_eclosed}Ich denke, ich sollte dich an deine Grenzen treiben.\n$@c{smile_ehalf}Ich bin mir nicht sicher, ob ich meine Aufgabe erfüllt habe, aber ich habe mein Bestes gegeben.\n$Irgendwas an diesem komischen und furchteinflößenden Ort… All das scheint so klar…\n$Es… ist alles was die Welt seit langem kennt.\n$@c{smile_eclosed}Es kommt mir so vor als könnte ich mich kaum an die Erinnerungen erinnern, die wir zusammen hatten.\n$@c{smile_ehalf}Waren sie jemals real? Sie scheinen so weit weg…\n$@c{angry_mopen}Du musst weiter gehen, denn wenn du es nicht tust, wird es nie enden. Du bist der Einzige, der das schaffen kann.\n$@c{smile_ehalf}Ich… Ich weiß nicht was das alles bedeutet, aber ich fühle, dass es wahr ist.\n$@c{neutral}Wenn du mich nicht hier und jetzt besiegen kannst, hast du keine Chance."
- },
- "victory": {
- "1": "@c{smile_ehalf}Ich… Ich denke ich habe meine Aufgabe erfüllt.\n$@c{smile_eclosed}Versprich mir… Nachdem du die Welt geheilt hast… Komm bitte sicher nach Hause. \n$@c{smile_ehalf}…Danke."
- }
- }
-}
diff --git a/src/locales/de/dialogue-misc-female.json b/src/locales/de/dialogue-misc-female.json
deleted file mode 100644
index 1529831d7c5..00000000000
--- a/src/locales/de/dialogue-misc-female.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
- "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
- "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.",
- "ending_name": "Entwickler"
-}
diff --git a/src/locales/de/dialogue-misc-male.json b/src/locales/de/dialogue-misc-male.json
deleted file mode 100644
index 1529831d7c5..00000000000
--- a/src/locales/de/dialogue-misc-male.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
- "ending_female": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
- "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.",
- "ending_name": "Entwickler"
-}
diff --git a/src/locales/de/dialogue-misc.json b/src/locales/de/dialogue-misc.json
new file mode 100644
index 00000000000..69c704c66c6
--- /dev/null
+++ b/src/locales/de/dialogue-misc.json
@@ -0,0 +1,6 @@
+{
+ "ending": "@c{shock}Du bist zurück?@d{32} Bedeutet das…@d{96} du hast gewonnen?!\n$@c{smile_ehalf}Ich hätte wissen sollen, dass du es in dir hast.\n$@c{smile_eclosed}Natürlich… ich hatte immer dieses Gefühl.\n$@c{smile}Es ist jetzt vorbei, richtig? Du hast die Schleife beendet.\n$@c{smile_ehalf}Du hast auch deinen Traum erfüllt, nicht wahr?\n$Du hast nicht einmal verloren.\n$Ich werde die Einzige sein, die sich daran erinnert, was du getan hast.\n$@c{angry_mopen}Ich werde versuchen, es nicht zu vergessen!\n$@c{smile_wave_wink}Nur ein Scherz!@d{64} @c{smile}Ich würde es nie vergessen.@d{32}\n$Deine Legende wird in unseren Herzen weiterleben.\n$@c{smile_wave}Wie auch immer,@d{64} es wird spät…@d{96} denke ich?\nEs ist schwer zu sagen an diesem Ort.\n$Lass uns nach Hause gehen. \n$@c{smile_wave_wink}Vielleicht können wir morgen noch einen Kampf haben, der alten Zeiten willen?",
+ "ending_female": "@c{smile}Oh? Du hast gewonnen?@d{96} @c{smile_eclosed}Ich schätze, das hätte ich wissen sollen.\n$Aber, du bist jetzt zurück.\n$@c{smile}Es ist vorbei.@d{64} Du hast die Schleife beendet.\n$@c{serious_smile_fists}Du hast auch deinen Traum erfüllt, nicht wahr?\nDu hast nicht einmal verloren.\n$@c{neutral}Ich bin der Einzige, der sich daran erinnern wird, was du getan hast.@d{96}\n$Ich schätze, das ist in Ordnung, oder?\n$@c{serious_smile_fists}Deine Legende wird immer in unseren Herzen weiterleben.\n$@c{smile_eclosed}Wie auch immer, ich habe genug von diesem Ort, oder nicht? Lass uns nach Hause gehen.\n$@c{serious_smile_fists}Vielleicht können wir, wenn wir zurück sind, noch einen Kampf haben?\n$Wenn du dazu bereit bist.",
+ "ending_endless": "Glückwunsch! Du hast das aktuelle Ende erreicht!\nWir arbeiten an mehr Spielinhalten.",
+ "ending_name": "Entwickler"
+}
diff --git a/src/locales/de/dialogue-female.json b/src/locales/de/dialogue.json
similarity index 99%
rename from src/locales/de/dialogue-female.json
rename to src/locales/de/dialogue.json
index e5bcb81ce52..8a3dbb8880e 100644
--- a/src/locales/de/dialogue-female.json
+++ b/src/locales/de/dialogue.json
@@ -1403,19 +1403,19 @@
"1": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!",
"2": "Los geht's! Dies sind meine Gesteins-Pokémon, mein ganzer Stolz!",
"3": "Gesteins-Pokémon sind einfach die besten!",
- "4": "Ich muss dein Potenzial als Trainer und die Stärke der Pokémon sehen, die mit dir kämpfen!"
+ "4": "Tag für Tag grabe ich hier nach Fossilien.\n$Die viele Arbeit hat meine Pokémon felsenfest gemacht\nund das wirst du jetzt im Kampf zu spüren bekommen!"
},
"victory": {
"1": "W-was? Das kann nicht sein! Meine total tranierten Pokémon!",
"2": "…Wir haben die Kontrolle verloren. Beim nächsten Mal fordere ich dich\n$zu einem Fossilien-Ausgrabungswettbewerb heraus.",
"3": "Mit deinem Können ist es nur natürlich, dass du gewinnst.",
- "4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?",
- "5": "Ich habe es vermasselt."
+ "4": "W-was?! Das kann nicht sein! Selbst das war nicht genug?"
},
"defeat": {
"1": "Siehst du? Ich bin stolz auf meinen steinigen Kampfstil!",
"2": "Danke! Der Kampf hat mir Vertrauen gegeben, dass ich vielleicht meinen Vater besiegen kann!",
- "3": "Ich fühle mich, als hätte ich gerade einen wirklich hartnäckigen Felsen durchbrochen!"
+ "3": "Na, was sagst du jetzt? Meine felsenfesten Pokémon waren hart genug für dich, was?",
+ "4": "Ich wusste, dass ich gewinnen würde!"
}
},
"morty": {
diff --git a/src/locales/de/menu-ui-handler.json b/src/locales/de/menu-ui-handler.json
index 56c03102b9c..93c3f4c38e8 100644
--- a/src/locales/de/menu-ui-handler.json
+++ b/src/locales/de/menu-ui-handler.json
@@ -25,5 +25,6 @@
"unlinkGoogle": "Google trennen",
"cancel": "Abbrechen",
"losingProgressionWarning": "Du wirst jeglichen Fortschritt seit Anfang dieses Kampfes verlieren. Fortfahren?",
- "noEggs": "Du brütest aktuell keine Eier aus!"
+ "noEggs": "Du brütest aktuell keine Eier aus!",
+ "donate": "Spenden"
}
\ No newline at end of file
diff --git a/src/locales/de/modifier-type.json b/src/locales/de/modifier-type.json
index c9927636c2a..8e2372cb447 100644
--- a/src/locales/de/modifier-type.json
+++ b/src/locales/de/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Verdoppelt die Wahrscheinlichkeit, dass die nächsten {{battleCount}} Begegnungen mit wilden Pokémon ein Doppelkampf sind."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Erhöht die {{tempBattleStatName}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
+ "TempStatStageBoosterModifierType": {
+ "description": "Erhöht die {{stat}} aller Teammitglieder für 5 Kämpfe um eine Stufe."
},
"AttackTypeBoosterModifierType": {
"description": "Erhöht die Stärke aller {{moveType}}-Attacken eines Pokémon um 20%."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Erhöht das Level aller Teammitglieder um {{levels}}."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Erhöht den {{statName}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist."
+ "BaseStatBoosterModifierType": {
+ "description": "Erhöht den {{stat}} Basiswert des Trägers um 10%. Das Stapellimit erhöht sich, je höher dein IS-Wert ist."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Stellt 100% der KP aller Pokémon her."
@@ -248,6 +248,12 @@
"name": "Scope-Linse",
"description": "Ein Item zum Tragen. Es erhöht die Volltrefferquote."
},
+ "DIRE_HIT": {
+ "name": "X-Volltreffer",
+ "extra": {
+ "raises": "Volltrefferquote"
+ }
+ },
"LEEK": {
"name": "Lauchstange",
"description": "Ein Item, das von Porenta getragen werden kann. Diese lange Lauchstange erhöht die Volltrefferquote stark."
@@ -411,25 +417,13 @@
"description": "Ein Item, das Ditto zum Tragen gegeben werden kann. Fein und doch hart, erhöht dieses sonderbare Pulver die Initiative."
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "X-Angriff",
"x_defense": "X-Verteidigung",
"x_sp_atk": "X-Sp.-Ang.",
"x_sp_def": "X-Sp.-Vert.",
"x_speed": "X-Tempo",
- "x_accuracy": "X-Treffer",
- "dire_hit": "X-Volltreffer"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "Angriff",
- "DEF": "Verteidigung",
- "SPATK": "Sp. Ang",
- "SPDEF": "Sp. Vert",
- "SPD": "Initiative",
- "ACC": "Genauigkeit",
- "CRIT": "Volltrefferquote",
- "EVA": "Fluchtwert",
- "DEFAULT": "???"
+ "x_accuracy": "X-Treffer"
},
"AttackTypeBoosterItem": {
"silk_scarf": "Seidenschal",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "Drachen-Disc",
"DARK_MEMORY": "Unlicht-Disc",
"FAIRY_MEMORY": "Feen-Disc",
- "BLANK_MEMORY": "Leere-Disc"
+ "NORMAL_MEMORY": "Normal-Disc"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/de/modifier.json b/src/locales/de/modifier.json
index 22053b1da63..37227973410 100644
--- a/src/locales/de/modifier.json
+++ b/src/locales/de/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
"hitHealApply": "{{typeName}} von {{pokemonNameWithAffix}} füllt einige KP auf!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} wurde durch {{typeName}} wiederbelebt!",
- "pokemonResetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!",
+ "resetNegativeStatStageApply": "Die negative Statuswertveränderung von {{pokemonNameWithAffix}} wurde durch {{typeName}} aufgehoben!",
"moneyInterestApply": "Du erhählst {{moneyAmount}} ₽ durch das Item {{typeName}}!",
"turnHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} absorbiert!",
"contactHeldItemTransferApply": "{{itemName}} von {{pokemonNameWithAffix}} wurde durch {{typeName}} von {{pokemonName}} geklaut!",
diff --git a/src/locales/de/move-trigger.json b/src/locales/de/move-trigger.json
index 5b2b2471df9..61283c9e62e 100644
--- a/src/locales/de/move-trigger.json
+++ b/src/locales/de/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} nutzt seine KP um seine Attacke zu verstärken!",
"absorbedElectricity": "{{pokemonName}} absorbiert elektrische Energie!",
"switchedStatChanges": "{{pokemonName}} tauschte die Statuswerteveränderungen mit dem Ziel!",
+ "switchedTwoStatChanges": "{{pokemonName}} tauscht Veränderungen an {{firstStat}} und {{secondStat}} mit dem Ziel!",
+ "switchedStat": "{{pokemonName}} tauscht seinen {{stat}}-Wert mit dem des Zieles!",
+ "sharedGuard": "{{pokemonName}} addiert seine Schutzkräfte mit jenen des Zieles und teilt sie gerecht auf!",
+ "sharedPower": "{{pokemonName}} addiert seine Kräfte mit jenen des Zieles und teilt sie gerecht auf!",
"goingAllOutForAttack": "{{pokemonName}} legt sich ins Zeug!",
"regainedHealth": "{{pokemonName}} erholt sich!",
"keptGoingAndCrashed": "{{pokemonName}} springt daneben und verletzt sich!",
@@ -61,5 +65,6 @@
"suppressAbilities": "Die Fähigkeit von {{pokemonName}} wirkt nicht mehr!",
"revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!",
"swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!",
- "exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!"
-}
\ No newline at end of file
+ "exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!",
+ "safeguard": "{{targetName}} wird durch Bodyguard geschützt!"
+}
diff --git a/src/locales/de/pokemon-form-battle.json b/src/locales/de/pokemon-form-battle.json
index 8651b3d1318..35060c33d0b 100644
--- a/src/locales/de/pokemon-form-battle.json
+++ b/src/locales/de/pokemon-form-battle.json
@@ -10,5 +10,5 @@
"eternamaxChange": "{{preName}} hat sich zu {{pokemonName}} unendynamaximiert!",
"revertChange": "{{pokemonName}} hat seine ursprüngliche Form zurückerlangt!",
"formChange": "{{preName}} hat seine Form geändert!",
- "disguiseChange": "Its disguise served it as a decoy!"
+ "disguiseChange": "Sein Kostüm hat die Attacke absorbiert!"
}
\ No newline at end of file
diff --git a/src/locales/de/pokemon-info.json b/src/locales/de/pokemon-info.json
index a559001f663..2d625d52ba7 100644
--- a/src/locales/de/pokemon-info.json
+++ b/src/locales/de/pokemon-info.json
@@ -1,7 +1,6 @@
{
"Stat": {
"HP": "KP",
- "HPStat": "KP",
"HPshortened": "KP",
"ATK": "Angriff",
"ATKshortened": "Ang",
diff --git a/src/locales/de/settings.json b/src/locales/de/settings.json
index d72a026cf5a..31406f28d17 100644
--- a/src/locales/de/settings.json
+++ b/src/locales/de/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "Bewegung Touch Steuerung",
"shopOverlayOpacity": "Shop Overlay Deckkraft",
"shopCursorTarget": "Shop-Cursor Ziel",
- "items": "Items",
+ "rewards": "Items",
"reroll": "Neu rollen",
"shop": "Shop",
"checkTeam": "Team überprüfen"
diff --git a/src/locales/en/ability-trigger.json b/src/locales/en/ability-trigger.json
index 307ab70b85c..4f1d4dac766 100644
--- a/src/locales/en/ability-trigger.json
+++ b/src/locales/en/ability-trigger.json
@@ -12,6 +12,7 @@
"blockItemTheft": "{{pokemonNameWithAffix}}'s {{abilityName}}\nprevents item theft!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}'s {{abilityName}}\nrestored its HP a little!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} avoided damage\nwith {{abilityName}}!",
+ "fullHpResistType": "{{pokemonNameWithAffix}} made its shell gleam!\nIt's distorting type matchups!",
"moveImmunity": "It doesn't affect {{pokemonNameWithAffix}}!",
"reverseDrain": "{{pokemonNameWithAffix}} sucked up the liquid ooze!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}'s {{abilityName}}\nmade it the {{typeName}} type!",
diff --git a/src/locales/en/achv-female.json b/src/locales/en/achv-female.json
deleted file mode 100644
index ec695c3ed2a..00000000000
--- a/src/locales/en/achv-female.json
+++ /dev/null
@@ -1,264 +0,0 @@
-{
- "Achievements": {
- "name": "Achievements"
- },
- "Locked": {
- "name": "Locked"
- },
- "MoneyAchv": {
- "description": "Accumulate a total of ₽{{moneyAmount}}"
- },
- "10K_MONEY": {
- "name": "Money Haver"
- },
- "100K_MONEY": {
- "name": "Rich"
- },
- "1M_MONEY": {
- "name": "Millionaire"
- },
- "10M_MONEY": {
- "name": "One Percenter"
- },
- "DamageAchv": {
- "description": "Inflict {{damageAmount}} damage in one hit"
- },
- "250_DMG": {
- "name": "Hard Hitter"
- },
- "1000_DMG": {
- "name": "Harder Hitter"
- },
- "2500_DMG": {
- "name": "That's a Lotta Damage!"
- },
- "10000_DMG": {
- "name": "One Punch Man"
- },
- "HealAchv": {
- "description": "Heal {{healAmount}} {{HP}} at once with a move, ability, or held item"
- },
- "250_HEAL": {
- "name": "Novice Healer"
- },
- "1000_HEAL": {
- "name": "Big Healer"
- },
- "2500_HEAL": {
- "name": "Cleric"
- },
- "10000_HEAL": {
- "name": "Recovery Master"
- },
- "LevelAchv": {
- "description": "Level up a Pokémon to Lv{{level}}"
- },
- "LV_100": {
- "name": "But Wait, There's More!"
- },
- "LV_250": {
- "name": "Elite"
- },
- "LV_1000": {
- "name": "To Go Even Further Beyond"
- },
- "RibbonAchv": {
- "description": "Accumulate a total of {{ribbonAmount}} Ribbons"
- },
- "10_RIBBONS": {
- "name": "Pokémon League Champion"
- },
- "25_RIBBONS": {
- "name": "Great League Champion"
- },
- "50_RIBBONS": {
- "name": "Ultra League Champion"
- },
- "75_RIBBONS": {
- "name": "Rogue League Champion"
- },
- "100_RIBBONS": {
- "name": "Master League Champion"
- },
- "TRANSFER_MAX_BATTLE_STAT": {
- "name": "Teamwork",
- "description": "Baton pass to another party member with at least one stat maxed out"
- },
- "MAX_FRIENDSHIP": {
- "name": "Friendmaxxing",
- "description": "Reach max friendship on a Pokémon"
- },
- "MEGA_EVOLVE": {
- "name": "Megamorph",
- "description": "Mega evolve a Pokémon"
- },
- "GIGANTAMAX": {
- "name": "Absolute Unit",
- "description": "Gigantamax a Pokémon"
- },
- "TERASTALLIZE": {
- "name": "STAB Enthusiast",
- "description": "Terastallize a Pokémon"
- },
- "STELLAR_TERASTALLIZE": {
- "name": "The Hidden Type",
- "description": "Stellar Terastallize a Pokémon"
- },
- "SPLICE": {
- "name": "Infinite Fusion",
- "description": "Splice two Pokémon together with DNA Splicers"
- },
- "MINI_BLACK_HOLE": {
- "name": "A Hole Lot of Items",
- "description": "Acquire a Mini Black Hole"
- },
- "CATCH_MYTHICAL": {
- "name": "Mythical",
- "description": "Catch a mythical Pokémon"
- },
- "CATCH_SUB_LEGENDARY": {
- "name": "(Sub-)Legendary",
- "description": "Catch a sub-legendary Pokémon"
- },
- "CATCH_LEGENDARY": {
- "name": "Legendary",
- "description": "Catch a legendary Pokémon"
- },
- "SEE_SHINY": {
- "name": "Shiny",
- "description": "Find a shiny Pokémon in the wild"
- },
- "SHINY_PARTY": {
- "name": "That's Dedication",
- "description": "Have a full party of shiny Pokémon"
- },
- "HATCH_MYTHICAL": {
- "name": "Mythical Egg",
- "description": "Hatch a mythical Pokémon from an egg"
- },
- "HATCH_SUB_LEGENDARY": {
- "name": "Sub-Legendary Egg",
- "description": "Hatch a sub-legendary Pokémon from an egg"
- },
- "HATCH_LEGENDARY": {
- "name": "Legendary Egg",
- "description": "Hatch a legendary Pokémon from an egg"
- },
- "HATCH_SHINY": {
- "name": "Shiny Egg",
- "description": "Hatch a shiny Pokémon from an egg"
- },
- "HIDDEN_ABILITY": {
- "name": "Hidden Potential",
- "description": "Catch a Pokémon with a hidden ability"
- },
- "PERFECT_IVS": {
- "name": "Certificate of Authenticity",
- "description": "Get perfect IVs on a Pokémon"
- },
- "CLASSIC_VICTORY": {
- "name": "Undefeated",
- "description": "Beat the game in classic mode"
- },
- "UNEVOLVED_CLASSIC_VICTORY": {
- "name": "Bring Your Child To Work Day",
- "description": "Beat the game in Classic Mode with at least one unevolved party member."
- },
- "MONO_GEN_ONE": {
- "name": "The Original Rival",
- "description": "Complete the generation one only challenge."
- },
- "MONO_GEN_TWO": {
- "name": "Generation 1.5",
- "description": "Complete the generation two only challenge."
- },
- "MONO_GEN_THREE": {
- "name": "Too much water?",
- "description": "Complete the generation three only challenge."
- },
- "MONO_GEN_FOUR": {
- "name": "Is she really the hardest?",
- "description": "Complete the generation four only challenge."
- },
- "MONO_GEN_FIVE": {
- "name": "All Original",
- "description": "Complete the generation five only challenge."
- },
- "MONO_GEN_SIX": {
- "name": "Almost Royalty",
- "description": "Complete the generation six only challenge."
- },
- "MONO_GEN_SEVEN": {
- "name": "Only Technically",
- "description": "Complete the generation seven only challenge."
- },
- "MONO_GEN_EIGHT": {
- "name": "A Champion Time!",
- "description": "Complete the generation eight only challenge."
- },
- "MONO_GEN_NINE": {
- "name": "She was going easy on you",
- "description": "Complete the generation nine only challenge."
- },
- "MonoType": {
- "description": "Complete the {{type}} monotype challenge."
- },
- "MONO_NORMAL": {
- "name": "Extra Ordinary"
- },
- "MONO_FIGHTING": {
- "name": "I Know Kung Fu"
- },
- "MONO_FLYING": {
- "name": "Angry Birds"
- },
- "MONO_POISON": {
- "name": "Kanto's Favourite"
- },
- "MONO_GROUND": {
- "name": "Forecast: Earthquakes"
- },
- "MONO_ROCK": {
- "name": "Brock Hard"
- },
- "MONO_BUG": {
- "name": "You Like Jazz?"
- },
- "MONO_GHOST": {
- "name": "Who You Gonna Call?"
- },
- "MONO_STEEL": {
- "name": "Iron Giant"
- },
- "MONO_FIRE": {
- "name": "I Cast Fireball!"
- },
- "MONO_WATER": {
- "name": "When It Rains, It Pours"
- },
- "MONO_GRASS": {
- "name": "Can't Touch This"
- },
- "MONO_ELECTRIC": {
- "name": "Aim For The Horn!"
- },
- "MONO_PSYCHIC": {
- "name": "Big Brain Energy"
- },
- "MONO_ICE": {
- "name": "Walking On Thin Ice"
- },
- "MONO_DRAGON": {
- "name": "Pseudo-Legend Club"
- },
- "MONO_DARK": {
- "name": "It's Just A Phase"
- },
- "MONO_FAIRY": {
- "name": "Hey! Listen!"
- },
- "FRESH_START": {
- "name": "First Try!",
- "description": "Complete the Fresh Start challenge."
- }
-}
\ No newline at end of file
diff --git a/src/locales/en/achv.json b/src/locales/en/achv.json
index 185b42d181a..32d519fbf78 100644
--- a/src/locales/en/achv.json
+++ b/src/locales/en/achv.json
@@ -10,19 +10,19 @@
},
"10K_MONEY": {
"name": "Money Haver",
- "name_female": null
+ "name_female": "Money Haver"
},
"100K_MONEY": {
"name": "Rich",
- "name_female": null
+ "name_female": "Rich"
},
"1M_MONEY": {
"name": "Millionaire",
- "name_female": null
+ "name_female": "Millionaire"
},
"10M_MONEY": {
"name": "One Percenter",
- "name_female": null
+ "name_female": "One Percenter"
},
"DamageAchv": {
"description": "Inflict {{damageAmount}} damage in one hit"
@@ -32,11 +32,11 @@
},
"1000_DMG": {
"name": "Harder Hitter",
- "name_female": null
+ "name_female": "Harder Hitter"
},
"2500_DMG": {
"name": "That's a Lotta Damage!",
- "name_female": null
+ "name_female": "That's a Lotta Damage!"
},
"10000_DMG": {
"name": "One Punch Man",
@@ -47,19 +47,19 @@
},
"250_HEAL": {
"name": "Novice Healer",
- "name_female": null
+ "name_female": "Novice Healer"
},
"1000_HEAL": {
"name": "Big Healer",
- "name_female": null
+ "name_female": "Big Healer"
},
"2500_HEAL": {
"name": "Cleric",
- "name_female": null
+ "name_female": "Cleric"
},
"10000_HEAL": {
"name": "Recovery Master",
- "name_female": null
+ "name_female": "Recovery Master"
},
"LevelAchv": {
"description": "Level up a Pokémon to Lv{{level}}"
@@ -69,7 +69,7 @@
},
"LV_250": {
"name": "Elite",
- "name_female": null
+ "name_female": "Elite"
},
"LV_1000": {
"name": "To Go Even Further Beyond"
@@ -79,27 +79,27 @@
},
"10_RIBBONS": {
"name": "Pokémon League Champion",
- "name_female": null
+ "name_female": "Pokémon League Champion"
},
"25_RIBBONS": {
"name": "Great League Champion",
- "name_female": null
+ "name_female": "Great League Champion"
},
"50_RIBBONS": {
"name": "Ultra League Champion",
- "name_female": null
+ "name_female": "Ultra League Champion"
},
"75_RIBBONS": {
"name": "Rogue League Champion",
- "name_female": null
+ "name_female": "Rogue League Champion"
},
"100_RIBBONS": {
"name": "Master League Champion",
- "name_female": null
+ "name_female": "Master League Champion"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Teamwork",
- "description": "Baton pass to another party member with at least one stat maxed out"
+ "description": "Baton pass to another party member with at least one stat stage maxed out"
},
"MAX_FRIENDSHIP": {
"name": "Friendmaxxing",
@@ -147,7 +147,7 @@
},
"SHINY_PARTY": {
"name": "That's Dedication",
- "name_female": null,
+ "name_female": "That's Dedication",
"description": "Have a full party of shiny Pokémon"
},
"HATCH_MYTHICAL": {
@@ -176,7 +176,7 @@
},
"CLASSIC_VICTORY": {
"name": "Undefeated",
- "name_female": null,
+ "name_female": "Undefeated",
"description": "Beat the game in classic mode"
},
"UNEVOLVED_CLASSIC_VICTORY": {
@@ -279,5 +279,9 @@
"FRESH_START": {
"name": "First Try!",
"description": "Complete the Fresh Start challenge."
+ },
+ "INVERSE_BATTLE": {
+ "name": "Mirror rorriM",
+ "description": "Complete the Inverse Battle challenge.\n.egnellahc elttaB esrevnI eht etelpmoC"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/en/arena-flyout.json b/src/locales/en/arena-flyout.json
index 141ed4f743d..043d4127eb8 100644
--- a/src/locales/en/arena-flyout.json
+++ b/src/locales/en/arena-flyout.json
@@ -39,5 +39,6 @@
"matBlock": "Mat Block",
"craftyShield": "Crafty Shield",
"tailwind": "Tailwind",
- "happyHour": "Happy Hour"
-}
+ "happyHour": "Happy Hour",
+ "safeguard": "Safeguard"
+}
\ No newline at end of file
diff --git a/src/locales/en/arena-tag.json b/src/locales/en/arena-tag.json
index ef0b55b691b..d8fed386b24 100644
--- a/src/locales/en/arena-tag.json
+++ b/src/locales/en/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "Your team's Tailwind petered out!",
"tailwindOnRemoveEnemy": "The opposing team's Tailwind petered out!",
"happyHourOnAdd": "Everyone is caught up in the happy atmosphere!",
- "happyHourOnRemove": "The atmosphere returned to normal."
+ "happyHourOnRemove": "The atmosphere returned to normal.",
+ "safeguardOnAdd": "The whole field is cloaked in a mystical veil!",
+ "safeguardOnAddPlayer": "Your team cloaked itself in a mystical veil!",
+ "safeguardOnAddEnemy": "The opposing team cloaked itself in a mystical veil!",
+ "safeguardOnRemove": "The field is no longer protected by Safeguard!",
+ "safeguardOnRemovePlayer": "Your team is no longer protected by Safeguard!",
+ "safeguardOnRemoveEnemy": "The opposing team is no longer protected by Safeguard!"
}
\ No newline at end of file
diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json
index 662678e7673..918fb38b520 100644
--- a/src/locales/en/battle.json
+++ b/src/locales/en/battle.json
@@ -61,6 +61,7 @@
"skipItemQuestion": "Are you sure you want to skip taking an item?",
"itemStackFull": "The stack for {{fullItemName}} is full.\nYou will receive {{itemName}} instead.",
"eggHatching": "Oh?",
+ "eggSkipPrompt": "Skip to egg summary?",
"ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?",
"wildPokemonWithAffix": "Wild {{pokemonName}}",
"foePokemonWithAffix": "Foe {{pokemonName}}",
diff --git a/src/locales/en/challenges.json b/src/locales/en/challenges.json
index c89fa7a21bf..7d330401407 100644
--- a/src/locales/en/challenges.json
+++ b/src/locales/en/challenges.json
@@ -1,6 +1,7 @@
{
"title": "Challenge Modifiers",
"illegalEvolution": "{{pokemon}} changed into an ineligble pokémon\nfor this challenge!",
+ "noneSelected": "None Selected",
"singleGeneration": {
"name": "Mono Gen",
"desc": "You can only use Pokémon from Generation {{gen}}.",
@@ -25,5 +26,12 @@
"desc": "You can only use the original starters, and only as if you had just started PokéRogue.",
"value.0": "Off",
"value.1": "On"
+ },
+ "inverseBattle": {
+ "name": "Inverse Battle",
+ "shortName": "Inverse",
+ "desc": "Type matchups are reversed and no type is immune to any other type.\nDisables other challenges' achievements.",
+ "value.0": "Off",
+ "value.1": "On"
}
}
\ No newline at end of file
diff --git a/src/locales/en/config.ts b/src/locales/en/config.ts
index 36593befb8f..024f7f10108 100644
--- a/src/locales/en/config.ts
+++ b/src/locales/en/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const enConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/en/dialogue-double-battle-female.json b/src/locales/en/dialogue-double-battle-female.json
deleted file mode 100644
index 8e8e1d813fb..00000000000
--- a/src/locales/en/dialogue-double-battle-female.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "Blue: Hey Red, let's show them what we're made of!\n$Red: ...\n$Blue: This is Pallet Town Power!"
- },
- "victory": {
- "1": "Blue: That was a great battle!\n$Red: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "Red: ...!\n$Blue: He never talks much.\n$Blue: But dont let that fool you! He is a champ after all!"
- },
- "victory": {
- "1": "Red: ...!\n$Blue: Next time we will beat you!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "Tate: Are you surprised?\n$Liza: We are two gym leaders at once!\n$Tate: We are twins!\n$Liza: We dont need to talk to understand each other!\n$Tate: Twice the power...\n$Liza: Can you handle it?"
- },
- "victory": {
- "1": "Tate: What? Our combination was perfect!\n$Liza: Looks like we need to train more..."
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "Liza: Hihihi... Are you surprised?\n$Tate: Yes, we are really two gym leaders at once!\n$Liza: This is my twin brother Tate!\n$Tate: And this is my twin sister Liza!\n$Liza: Don't you think we are a perfect combination?"
- },
- "victory": {
- "1": "Liza: Are we...\n$Tate: ...not as strong as we thought?"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "Steven: Wallace, let's show them the power of the champions!\n$Wallace: We will show you the power of Hoenn!\n$Steven: Let's go!"
- },
- "victory": {
- "1": "Steven: That was a great battle!\n$Wallace: We will win next time!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "Steven: Do you have any rare Pokémon?\n$Wallace: Steven... We are here for a battle, not to show off our Pokémon.\n$Steven: Oh... I see... Let's go then!"
- },
- "victory": {
- "1": "Steven: Now that we are done with the battle, let's show off our Pokémon!\n$Wallace: Steven..."
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "Alder: We are the strongest trainers in Unova!\n$Iris: Fights against strong trainers are the best!"
- },
- "victory": {
- "1": "Alder: Wow! You are super strong!\n$Iris: We will win next time!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?"
- },
- "victory": {
- "1": "Iris: A loss like this is not easy to take...\n$Alder: But we will only get stronger with every loss!"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "Marnie: Brother, let's show them the power of Spikemuth!\n$Piers: We bring darkness!"
- },
- "victory": {
- "1": "Marnie: You brought light to our darkness!\n$Piers: Its too bright..."
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing..."
- },
- "victory": {
- "1": "Piers: Now that was a great concert!\n$Marnie: Brother..."
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-double-battle-male.json b/src/locales/en/dialogue-double-battle.json
similarity index 90%
rename from src/locales/en/dialogue-double-battle-male.json
rename to src/locales/en/dialogue-double-battle.json
index 8e8e1d813fb..4190af49d15 100644
--- a/src/locales/en/dialogue-double-battle-male.json
+++ b/src/locales/en/dialogue-double-battle.json
@@ -57,7 +57,8 @@
},
"iris_alder_double": {
"encounter": {
- "1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?"
+ "1": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?",
+ "1_female": "Iris: Welcome Challenger! I am THE Unova Champion!\n$Alder: Iris, aren't you a bit too excited?"
},
"victory": {
"1": "Iris: A loss like this is not easy to take...\n$Alder: But we will only get stronger with every loss!"
@@ -73,7 +74,8 @@
},
"marnie_piers_double": {
"encounter": {
- "1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing..."
+ "1": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing...",
+ "1_female": "Piers: Ready for a concert?\n$Marnie: Brother... They are here to fight, not to sing..."
},
"victory": {
"1": "Piers: Now that was a great concert!\n$Marnie: Brother..."
diff --git a/src/locales/en/dialogue-female.json b/src/locales/en/dialogue-female.json
deleted file mode 100644
index b58fbbb36ec..00000000000
--- a/src/locales/en/dialogue-female.json
+++ /dev/null
@@ -1,2691 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "Hey, wanna battle?",
- "2": "Are you a new trainer too?",
- "3": "Hey, I haven't seen you before. Let's battle!",
- "4": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
- "5": "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
- "6": "All right! Let's go!",
- "7": "All right! Here I come! I'll show you my power!",
- "8": "Haw haw haw... I'll show you how hawesome my Pokémon are!",
- "9": "No need to waste time saying hello. Bring it on whenever you're ready!",
- "10": "Don't let your guard down, or you may be crying when a kid beats you.",
- "11": "I've raised my Pokémon with great care. You're not allowed to hurt them!",
- "12": "Glad you made it! It won't be an easy job from here.",
- "13": "The battles continue forever! Welcome to the world with no end!"
- },
- "victory": {
- "1": "Wow! You're strong!",
- "2": "I didn't stand a chance, huh?",
- "3": "I'll find you again when I'm older and beat you!",
- "4": "Ugh. I don't have any more Pokémon.",
- "5": "No way… NO WAY! How could I lose again…",
- "6": "No! I lost!",
- "7": "Whoa! You are incredible! I'm amazed and surprised!",
- "8": "Could it be… How… My Pokémon and I are the strongest, though…",
- "9": "I won't lose next time! Let's battle again sometime!",
- "10": "Sheesh! Can't you see that I'm just a kid! It wasn't fair of you to go all out like that!",
- "11": "Your Pokémon are more amazing! Trade with me!",
- "12": "I got a little carried away earlier, but what job was I talking about?",
- "13": "Ahaha! There it is! That's right! You're already right at home in this world!"
- }
- },
- "lass": {
- "encounter": {
- "1": "Let's have a battle, shall we?",
- "2": "You look like a new trainer. Let's have a battle!",
- "3": "I don't recognize you. How about a battle?",
- "4": "Let's have a fun Pokémon battle!",
- "5": "I'll show you the ropes of how to really use Pokémon!",
- "6": "A serious battle starts from a serious beginning! Are you sure you're ready?",
- "7": "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
- "8": "You'd better go easy on me, OK? Though I'll be seriously fighting!",
- "9": "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
- },
- "victory": {
- "1": "That was impressive! I've got a lot to learn.",
- "2": "I didn't think you'd beat me that bad…",
- "3": "I hope we get to have a rematch some day.",
- "4": "That was pretty amazingly fun! You've totally exhausted me…",
- "5": "You actually taught me a lesson! You're pretty amazing!",
- "6": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
- "7": "I don't need memories like this. Deleting memory…",
- "8": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
- "9": "I'm actually getting tired of battling… There's gotta be something new to do…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "Obedient Pokémon, selfish Pokémon… Pokémon have unique characteristics.",
- "2": "Even though my upbringing and behavior are poor, I've raised my Pokémon well.",
- "3": "Hmm, do you discipline your Pokémon? Pampering them too much is no good."
- },
- "victory": {
- "1": "It is important to nurture and train each Pokémon's characteristics.",
- "2": "Unlike my diabolical self, these are some good Pokémon.",
- "3": "Too much praise can spoil both Pokémon and people."
- },
- "defeat": {
- "1": "You should not get angry at your Pokémon, even if you lose a battle.",
- "2": "Right? Pretty good Pokémon, huh? I'm suited to raising things.",
- "3": "No matter how much you love your Pokémon, you still have to discipline them when they misbehave."
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "Pokémon never betray you. They return all the love you give them.",
- "2": "Shall I give you a tip for training good Pokémon?",
- "3": "I have raised these very special Pokémon using a special method."
- },
- "victory": {
- "1": "Ugh… It wasn't supposed to be like this. Did I administer the wrong blend?",
- "2": "How could that happen to my Pokémon… What are you feeding your Pokémon?",
- "3": "If I lose, that tells you I was just killing time. It doesn't damage my ego at all."
- },
- "defeat": {
- "1": "This proves my Pokémon have accepted my love.",
- "2": "The real trick behind training good Pokémon is catching good Pokémon.",
- "3": "Pokémon will be strong or weak depending on how you raise them."
- }
- },
- "fisherman": {
- "encounter": {
- "1": "Aack! You made me lose a bite!\nWhat are you going to do about it?",
- "2": "Go away! You're scaring the Pokémon!",
- "3": "Let's see if you can reel in a victory!"
- },
- "victory": {
- "1": "Just forget about it.",
- "2": "Next time, I'll be reelin' in the triumph!",
- "3": "Guess I underestimated the currents this time."
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "Woah! I've hooked a big one!",
- "2": "Line's in, ready to reel in success!",
- "3": "Ready to make waves!"
- },
- "victory": {
- "1": "I'll be back with a stronger hook.",
- "2": "I'll reel in victory next time.",
- "3": "I'm just sharpening my hooks for the comeback!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "Time to dive in!",
- "2": "Let's ride the waves of victory!",
- "3": "Ready to make a splash!"
- },
- "victory": {
- "1": "Drenched in defeat!",
- "2": "A wave of defeat!",
- "3": "Back to shore, I guess."
- }
- },
- "backpacker": {
- "encounter": {
- "1": "Pack up, game on!",
- "2": "Let's see if you can keep pace!",
- "3": "Gear up, challenger!",
- "4": "I've spent 20 years trying to find myself… But where am I?"
- },
- "victory": {
- "1": "Tripped up this time!",
- "2": "Oh, I think I'm lost.",
- "3": "Dead end!",
- "4": "Wait up a second! Hey! Don't you know who I am?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "You seem quite confident.",
- "2": "Your Pokémon… Show them to me…",
- "3": "Because I'm an Ace Trainer, people think I'm strong.",
- "4": "Are you aware of what it takes to be an Ace Trainer?"
- },
- "victory": {
- "1": "Yes… You have good Pokémon…",
- "2": "What?! But I'm a battling genius!",
- "3": "Of course, you are the main character!",
- "4": "OK! OK! You could be an Ace Trainer!"
- },
- "defeat": {
- "1": "I am devoting my body and soul to Pokémon battles!",
- "2": "All within my expectations… Nothing to be surprised about…",
- "3": "I thought I'd grow up to be a frail person who looked like they would break if you squeezed them too hard.",
- "4": "Of course I'm strong and don't lose. It's important that I win gracefully."
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "Time to grace the battlefield with elegance and poise!"
- },
- "victory": {
- "1": "My elegance remains unbroken!"
- }
- },
- "twins": {
- "encounter": {
- "1": "Get ready, because when we team up, it's double the trouble!",
- "2": "Two hearts, one strategy – let's see if you can keep up with our twin power!",
- "3": "Hope you're ready for double trouble, because we're about to bring the heat!"
- },
- "victory": {
- "1": "We may have lost this round, but our bond remains unbreakable!",
- "2": "Our twin spirit won't be dimmed for long.",
- "3": "We'll come back stronger as a dynamic duo!"
- },
- "defeat": {
- "1": "Twin power reigns supreme!",
- "2": "Two hearts, one triumph!",
- "3": "Double the smiles, double the victory dance!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "Get ready to eat my dust!",
- "2": "Gear up, challenger! I'm about to leave you in the dust!",
- "3": "Pedal to the metal, let's see if you can keep pace!"
- },
- "victory": {
- "1": "Spokes may be still, but determination pedals on.",
- "2": "Outpaced!",
- "3": "The road to victory has many twists and turns yet to explore."
- }
- },
- "black_belt": {
- "encounter": {
- "1": "I praise your courage in challenging me! For I am the one with the strongest kick!",
- "2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?"
- },
- "victory": {
- "1": "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.",
- "2": "Hmmm… If I was going to lose anyway, I was hoping to get totally messed up in the process."
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "You don't have to try to impress me. You can lose against me."
- },
- "victory": {
- "1": "It's hard to say good-bye, but we are running out of time…"
- }
- },
- "hiker": {
- "encounter": {
- "1": "My middle-age spread has given me as much gravitas as the mountains I hike!",
- "2": "I inherited this big-boned body from my parents… I'm like a living mountain range…"
- },
- "victory": {
- "1": "At least I cannot lose when it comes to BMI!",
- "2": "It's not enough… It's never enough. My bad cholesterol isn't high enough…"
- }
- },
- "ranger": {
- "encounter": {
- "1": "When I am surrounded by nature, most other things cease to matter.",
- "2": "When I'm living without nature in my life, sometimes I'll suddenly feel an anxiety attack coming on."
- },
- "victory": {
- "1": "It doesn't matter to the vastness of nature whether I win or lose…",
- "2": "Something like this is pretty trivial compared to the stifling feelings of city life."
- },
- "defeat": {
- "1": "I won the battle. But victory is nothing compared to the vastness of nature…",
- "2": "I'm sure how you feel is not so bad if you compare it to my anxiety attacks…"
- }
- },
- "scientist": {
- "encounter": {
- "1": "My research will lead this world to peace and joy."
- },
- "victory": {
- "1": "I am a genius… I am not supposed to lose against someone like you…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "…Heehee. I'm confident in my calculations and analysis.",
- "2": "I'm gaining as much experience as I can because I want to be a Gym Leader someday."
- },
- "victory": {
- "1": "Ohhhh… Calculation and analysis are perhaps no match for chance…",
- "2": "Even difficult, trying experiences have their purpose, I suppose."
- }
- },
- "artist": {
- "encounter": {
- "1": "I used to be popular, but now I am all washed up."
- },
- "victory": {
- "1": "As times change, values also change. I realized that too late."
- }
- },
- "guitarist": {
- "encounter": {
- "1": "Get ready to feel the rhythm of defeat as I strum my way to victory!"
- },
- "victory": {
- "1": "Silenced for now, but my melody of resilience will play on."
- }
- },
- "worker": {
- "encounter": {
- "1": "It bothers me that people always misunderstand me. I'm a lot more pure than everyone thinks."
- },
- "victory": {
- "1": "I really don't want my skin to burn, so I want to stay in the shade while I work."
- }
- },
- "worker_female": {
- "encounter": {
- "1": "It bothers me that people always misunderstand me.\n$I'm a lot more pure than everyone thinks."
- },
- "victory": {
- "1": "I really don't want my skin to burn, so I want to stay in the shade while I work."
- },
- "defeat": {
- "1": "My body and mind aren't necessarily always in sync."
- }
- },
- "worker_double": {
- "encounter": {
- "1": "I'll show you we can break you. We've been training in the field!"
- },
- "victory": {
- "1": "How strange… How could this be… I shouldn't have been outmuscled."
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "I normally only ever listen to classical music, but if I lose, I think I shall try a bit of new age!",
- "2": "I grow stronger with each tear I cry."
- },
- "victory": {
- "1": "Is this the dawning of the age of Aquarius?",
- "2": "Now I can get even stronger. I grow with every grudge."
- },
- "defeat": {
- "1": "New age simply refers to twentieth century classical composers, right?",
- "2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself."
- }
- },
- "psychic": {
- "encounter": {
- "1": "Hi! Focus!"
- },
- "victory": {
- "1": "Eeeeek!"
- }
- },
- "officer": {
- "encounter": {
- "1": "Brace yourself, because justice is about to be served!",
- "2": "Ready to uphold the law and serve justice on the battlefield!"
- },
- "victory": {
- "1": "The weight of justice feels heavier than ever…",
- "2": "The shadows of defeat linger in the precinct."
- }
- },
- "beauty": {
- "encounter": {
- "1": "My last ever battle… That's the way I'd like us to view this match…"
- },
- "victory": {
- "1": "It's been fun… Let's have another last battle again someday…"
- }
- },
- "baker": {
- "encounter": {
- "1": "Hope you're ready to taste defeat!"
- },
- "victory": {
- "1": "I'll bake a comeback."
- }
- },
- "biker": {
- "encounter": {
- "1": "Time to rev up and leave you in the dust!"
- },
- "victory": {
- "1": "I'll tune up for the next race."
- }
- },
- "firebreather": {
- "encounter": {
- "1": "My flames shall devour you!",
- "2": "My soul is on fire. I'll show you how hot it burns!",
- "3": "Step right up and take a look!"
- },
- "victory": {
- "1": "I burned down to ashes...",
- "2": "Yow! That's hot!",
- "3": "Ow! I scorched the tip of my nose!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "Matey, you're walking the plank if you lose!",
- "2": "Come on then! My sailor's pride is at stake!",
- "3": "Ahoy there! Are you seasick?"
- },
- "victory": {
- "1": "Argh! Beaten by a kid!",
- "2": "Your spirit sank me!",
- "3": "I think it's me that's seasick..."
- }
- },
- "archer": {
- "encounter": {
- "1": "Before you go any further, let's see how you fare against us, Team Rocket!",
- "2": "I have received reports that your skills are not insignificant. Let's see if they are true.",
- "3": "I am Archer, an Admin of Team Rocket. And I do not go easy on enemies of our organization."
- },
- "victory": {
- "1": "What a blunder!",
- "2": "With my current skills, I was not up to the task after all.",
- "3": "F-forgive me, Giovanni... For me to be defeated by a mere trainer..."
- }
- },
- "ariana": {
- "encounter": {
- "1": "Hold it right there! We can't someone on the loose.\n$It's harmful to Team Rocket's pride, you see.",
- "2": "I don't know or care if what I'm doing is right or wrong...\n$I just put my faith in Giovanni and do as I am told",
- "3": "Your trip ends here. I'm going to take you down!"
- },
- "victory": {
- "1": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
- "2": "I... I'm shattered...",
- "3": "Aaaieeeee! This can't be happening! I fought hard, but I still lost…"
- }
- },
- "proton": {
- "encounter": {
- "1": "What do you want? If you interrupt our work, don't expect any mercy!",
- "2": "What do we have here? I am often labeled as the scariest and cruelest guy in Team Rocket…\n$I strongly urge you not to interfere with our business!",
- "3": "I am Proton, an Admin of Team Rocket. I am here to put an end to your meddling!"
- },
- "victory": {
- "1": "The fortress came down!",
- "2": "You may have won this time… But all you did was make Team Rocket's wrath grow…",
- "3": "I am defeated… But I will not forget this!"
- }
- },
- "petrel": {
- "encounter": {
- "1": "Muhahaha, we've been waiting for you. Me? You don't know who I am? It is me, Giovanni.\n$The majestic Giovanni himself! Wahahaha! …Huh? I don't sound anything like Giovanni?\n$I don't even look like Giovanni? How come? I've worked so hard to mimic him!",
- "2": "I am Petrel, an Admin of Team Rocket. I will not allow you to interfere with our plans!",
- "3": "Rocket Executive Petrel will deal with this intruder!"
- },
- "victory": {
- "1": "OK, OK. I'll tell you where he is.",
- "2": "I… I couldn't do a thing… Giovanni, please forgive me…",
- "3": "No, I can't let this affect me. I have to inform the others…"
- }
- },
- "tabitha": {
- "encounter": {
- "1": "Hehehe! So you've come all the way here! But you're too late!",
- "2": "Hehehe... Got here already, did you? We underestimated you! But this is it! \n$I'm a cut above the Grunts you've seen so far. I'm not stalling for time.\n$I'm going to pulverize you!",
- "3": "I'm going to give you a little taste of pain! Resign yourself to it!"
- },
- "victory": {
- "1": "Hehehe! You might have beaten me, but you don't stand a chance against the Boss!\n$If you get lost now, you won't have to face a sound whipping!",
- "2": "Hehehe... So, I lost, too...",
- "3": "Ahya! How could this be? For an Admin like me to lose to some random trainer..."
- }
- },
- "courtney": {
- "encounter": {
- "1": "The thing...The thing that you hold...That is what... That's what we of Team Magma seek...",
- "2": "... Well then...Deleting...",
- "3": "...Ha. ...Analyzing... ...Hah♪"
- },
- "victory": {
- "1": "... ...Change...the world.",
- "2": "As anticipated. Unanticipated. You. Target lock...completed.\n$Commencing...experiment. You. Forever. Aha... ♪",
- "3": "...Again? That's unanticipated. ...I knew it. You...are interesting! ...Haha. ♪"
- }
- },
- "shelly": {
- "encounter": {
- "1": "Ahahahaha! You're going to meddle in Team Aqua's affairs?\n$You're either absolutely fearless, simply ignorant, or both!\n$You're so cute, you're disgusting! I'll put you down",
- "2": "What's this? Who's this spoiled brat?",
- "3": "Cool your jets. Be patient. I'll crush you shortly."
- },
- "victory": {
- "1": "Ahahahaha! We got meddled with unexpectedly! We're out of options.\n$We'll have to pull out. But this isn't the last you'll see of Team Aqua!\n$We have other plans! Don't you forget it!",
- "2": "Ahhh?! Did I go too easy on you?!",
- "3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie."
- }
- },
- "matt": {
- "encounter": {
- "1": "Hoohahaha! What, you got a screw loose or something? Look at you, little Makuhita person!",
- "2": "Oho! You! You're that funny kid!",
- "3": "What are you doing here? Did you follow us?"
- },
- "victory": {
- "1": "All right then, until the Boss has time for you, I'll be your opponent!",
- "2": "I can feel it! I can feel it, all right! The strength coming offa you!\n$More! I still want more! But looks like we're outta time...",
- "3": "That was fun! I knew you'd show me a good time! I look forward to facing you again someday!"
- }
- },
- "mars": {
- "encounter": {
- "1": "I'm Mars, one of Team Galactic's top Commanders.",
- "2": "Team Galactic's vision for the future is unwavering. Opposition will be crushed without mercy!",
- "3": "Feeling nervous? You should be!"
- },
- "victory": {
- "1": "This can't be happening! How did I lose?!",
- "2": "You have some skill, I'll give you that.",
- "3": "Defeated... This was a costly mistake."
- }
- },
- "jupiter": {
- "encounter": {
- "1": "Jupiter, Commander of Team Galactic, at your service.",
- "2": "Resistance is futile. Team Galactic will prevail!",
- "3": "You're trembling... scared already?"
- },
- "victory": {
- "1": "No way... I lost?!",
- "2": "Impressive, you've got guts!",
- "3": "Losing like this... How embarrassing."
- }
- },
- "saturn": {
- "encounter": {
- "1": "I am Saturn, Commander of Team Galactic.",
- "2": "Our mission is absolute. Any hindrance will be obliterated!",
- "3": "Is that fear I see in your eyes?"
- },
- "victory": {
- "1": "Impossible... Defeated by you?!",
- "2": "You have proven yourself a worthy adversary.",
- "3": "Bestowed in defeat... This is unacceptable."
- }
- },
- "zinzolin": {
- "encounter": {
- "1": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
- "2": "Oh, for crying out loud... I didn't expect to have to battle in this freezing cold!",
- "3": "You're an impressive Trainer to have made it this far. But it ends here."
- },
- "victory": {
- "1": "Ghetsis... I have failed you...",
- "2": "It's bitter cold. I'm shivering. I'm suffering. Yet, I still stand victorious.",
- "3": "Hmph. You're a smarter Trainer than I expected, but not smart enough."
- }
- },
- "rood": {
- "encounter": {
- "1": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
- "2": "Oh, this icy wind... I never thought I'd have to fight here!",
- "3": "You are a remarkable Trainer to have made it this far. But this is where it ends."
- },
- "victory": {
- "1": "Ghetsis... I have failed my mission...",
- "2": "The cold is piercing. I'm shivering. I'm suffering. Yet, I have triumphed.",
- "3": "Hm. You are a talented Trainer, but unfortunately not talented enough."
- }
- },
- "xerosic": {
- "encounter": {
- "1": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
- "2": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
- "3": "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
- },
- "victory": {
- "1": "Ah, you're quite strong. Oh yes—very strong, indeed.",
- "2": "Ding-ding-ding! You did it! To the victor go the spoils!",
- "3": "Wonderful! Amazing! You have tremendous skill and bravery!"
- }
- },
- "bryony": {
- "encounter": {
- "1": "I am Bryony, and it would be my pleasure to battle you. Show me what you've got.",
- "2": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
- "3": "I've anticipated your arrival. It's time for a little test. Shall we begin?"
- },
- "victory": {
- "1": "You're quite strong. Oh yes—very strong, indeed.",
- "2": "Ding-ding-ding! You've done well. Victory is yours.",
- "3": "Wonderful! Remarkable! Your skill and bravery are commendable."
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "Prepare for trouble!",
- "2": "We're pulling a big job here! Get lost, kid!",
- "3": "Hand over your Pokémon, or face the wrath of Team Rocket!",
- "4": "You're about to experience the true terror of Team Rocket!",
- "5": "Hey, kid! Me am a Team Rocket member kind of guy!"
- },
- "victory": {
- "1": "Team Rocket blasting off again!",
- "2": "Oh no! I dropped the Lift Key!",
- "3": "I blew it!",
- "4": "My associates won't stand for this!",
- "5": "You say what? Team Rocket bye-bye a go-go? Broken it is says you?"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": "If you get in the way of Team Magma, don’t expect any mercy!",
- "2": "You'd better not interfere with our plans! We're making the world a better place!",
- "3": "You're in the way! Team Magma has no time for kids like you!",
- "4": "I hope you brought marshmallows because things are about to heat up!",
- "5": "We're going to use the power of a volcano! It's gonna be... explosive! Get it? Heh heh!"
- },
- "victory": {
- "1": "Huh? I lost?!",
- "2": "I can't believe I lost! I even skipped lunch for this",
- "3": "No way! You're just a kid!",
- "4": "Urrrgh... I should've ducked into our hideout right away...",
- "5": "You beat me... Do you think the boss will dock my pay for this?"
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "No one who crosses Team Aqua gets any mercy, not even kids!",
- "2": "Grrr... You've got some nerve meddling with Team Aqua!",
- "3": "You're about to get soaked! And not just from my water Pokémon!",
- "4": "We, Team Aqua, exist for the good of all!",
- "5": "Prepare to be washed away by the tides of my... uh, Pokémon! Yeah, my Pokémon!"
- },
- "victory": {
- "1": "You're kidding me!",
- "2": "Arrgh, I didn't count on being meddled with by some meddling kid!",
- "3": "I lost?! Guess I'll have to swim back to the hideout now...",
- "4": "Oh, man, what a disaster... The boss is going to be furious...",
- "5": "You beat me... Do you think the boss will make me walk the plank for this?"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "Don't mess with Team Galactic!",
- "2": "Witness the power of our technology and the future we envision!",
- "3": "In the name of Team Galactic, I'll eliminate anyone who stands in our way!",
- "4": "Get ready to lose!",
- "5": "Hope you're ready for a cosmic beatdown!"
- },
- "victory": {
- "1": "Shut down...",
- "2": "This setback means nothing in the grand scheme.",
- "3": "Our plans are bigger than this defeat.",
- "4": "How?!",
- "5": "Note to self: practice Pokémon battling, ASAP."
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "We won't tolerate people who have different ideas!",
- "2": "If I win against you, release your Pokémon!",
- "3": "If you get in the way of Team Plasma, I'll take care of you!",
- "4": "Team Plasma will liberate Pokémon from selfish humans like you!",
- "5": "Our hairstyles are out of this world... but our battling skills? You'll find out soon enough."
- },
- "victory": {
- "1": "Plasmaaaaaaaaa!",
- "2": "How could I lose...",
- "3": "...What a weak Pokémon, I'll just have to go steal some better ones!",
- "4": "Great plans are always interrupted.",
- "5": "This is bad... Badbadbadbadbadbadbad! Bad for Team Plasma! Or Plasbad, for short!"
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "Your Pokémon are no match for the elegance of Team Flare.",
- "2": "Hope you brought your sunglasses, because things are about to get bright!",
- "3": "Team Flare will cleanse the world of imperfection!",
- "4": "Prepare to face the brilliance of Team Flare!",
- "5": "Fashion is most important to us!"
- },
- "victory": {
- "1": "The future doesn't look bright for me.",
- "2": "Perhaps there's more to battling than I thought. Back to the drawing board.",
- "3": "Gahh?! I lost?!",
- "4": "Even in defeat, Team Flare's elegance shines through.",
- "5": "You may have beaten me, but when I lose, I go out in style!"
- }
- },
- "aether_grunt": {
- "encounter": {
- "1": "I'll fight you with all I have to wipe you out!",
- "2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
- "3": "I was told to turn away Trainers, whomever they might be!",
- "4": "I'll show you the power of Aether Paradise!",
- "5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
- },
- "victory": {
- "1": "Hmph! You seem to have a lot of skill.",
- "2": "What does this mean? What does this mean!",
- "3": "Hey! You're so strong that there's no way I can turn you away!",
- "4": "Hmm... It seems as though I may have lost.",
- "5": "Here's an impression for you: Aiyee!"
- }
- },
- "faba": {
- "encounter": {
- "1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
- "2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
- "3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
- },
- "victory": {
- "1": "Aiyee!",
- "2": "H-h-how can this be?! How could this child...",
- "3": "This is why... This is why I can't bring myself to like children."
- }
- },
- "skull_grunt": {
- "encounter": {
- "1": "We're not bad-we're just hard!",
- "2": "You want some? That's how we say hello! Nice knowing you, punks!",
- "3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
- "4": "Why you trying to act hard when we're already hard as bones out here, homie?",
- "5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
- },
- "victory": {
- "1": "Huh? Is it over already?",
- "2": "Time for us to break out, yo! Gotta tell y'all peace out, yo!",
- "3": "We don't need your wack Pokémon anyway!",
- "4": "Wha-?! This kid's way too strong-no bones about it!",
- "5": "So, what? I'm lower than a Pokémon?! I already got self-esteem issues, man."
- }
- },
- "plumeria": {
- "encounter": {
- "1": " ...Hmph. You don't look like anything special to me.",
- "2": "It takes these dumb Grunts way too long to deal with you kids...",
- "3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
- },
- "victory": {
- "1": "Hmmph! You're pretty strong. I'll give you that.",
- "2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
- "3": "Hmmph! I guess I just have to hold that loss."
- }
- },
- "macro_grunt": {
- "encounter": {
- "1": "It looks like this is the end of the line for you!",
- "2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
- "3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
- },
- "victory": {
- "1": "I have little choice but to respectfully retreat.",
- "2": "Having to give up my pocket money... Losing means I'm back in the red...",
- "3": "Nobody can beat Macro Cosmos when it comes to our dedication to our work!"
- }
- },
- "oleana": {
- "encounter": {
- "1": "I won't let anyone interfere with Mr. Rose's plan!",
- "2": "So, you got through all of the special staff that I had ordered to stop you. I would expect nothing less.",
- "3": "For the chairman! I won't lose!"
- },
- "victory": {
- "1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
- "2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
- "3": "*sigh* I am one tired Oleana..."
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "So! I must say, I am impressed you got here!"
- },
- "victory": {
- "1": "WHAT! This cannot be!"
- },
- "defeat": {
- "1": "Mark my words. Not being able to measure your own strength shows that you are still a child."
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "My old associates need me... Are you going to get in my way?"
- },
- "victory": {
- "1": "How is this possible...? The precious dream of Team Rocket has become little more than an illusion..."
- },
- "defeat": {
- "1": "Team Rocket will be reborn again, and I will rule the world!"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "I will bury you by my own hand. I hope you appreciate this honor!"
- },
- "victory": {
- "1": "Ugh! You are... quite capable...\nI fell behind, but only by an inch..."
- },
- "defeat": {
- "1": "Team Magma will prevail!"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "You are the final obstacle remaining between me and my goals.\n$Brace yourself for my ultimate attack! Fuhahaha!"
- },
- "victory": {
- "1": "This... This is not.. Ngh..."
- },
- "defeat": {
- "1": "And now... I will transform this planet to a land ideal for humanity."
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "I'm the leader of Team Aqua, so I'm afraid it's the rope's end for you."
- },
- "victory": {
- "1": "Let's meet again somewhere. I'll be sure to remember that face."
- },
- "defeat": {
- "1": "Brilliant! My team won't hold back now!"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "I've been waiting so long for this day to come.\nThis is the true power of my team!"
- },
- "victory": {
- "1": "Like I figured..."
- },
- "defeat": {
- "1": "I'll return everything in this world to its original, pure state!!"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!"
- },
- "victory": {
- "1": "Interesting. And quite curious."
- },
- "defeat": {
- "1": "I will create my new world..."
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "So we meet again. It seems our fates have become intertwined.\n$But here and now, I will finally break that bond!"
- },
- "victory": {
- "1": "How? How? HOW?!"
- },
- "defeat": {
- "1": "Farewell."
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "I won't allow anyone to stop me! No matter who does what!"
- },
- "victory": {
- "1": "How can this be? I'm the creator of Team Plasma! I'm perfect!"
- },
- "defeat": {
- "1": "I am the perfect ruler of a perfect new world! Mwa ha ha!"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "Come now! I want to see your face at the moment you lose all hope!"
- },
- "victory": {
- "1": "My calculations... No! My careful schemes! The world should be mine!"
- },
- "defeat": {
- "1": "Kyurem! Use Absofusion!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "Do you want to stop me? Show me in battle."
- },
- "victory": {
- "1": "You are here to stop me. But I ask you to wait. "
- },
- "defeat": {
- "1": "Pokemon...Shall no longer exist."
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "The future you want, or the future I want... Let us see which one is more deserving, shall we?"
- },
- "victory": {
- "1": "Whaugh!"
- },
- "defeat": {
- "1": "Fools with no vision will continue to befoul this beautiful world."
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "You're going to startle my sweet beast! It looks like I'll need to silence you first."
- },
- "victory": {
- "1": "How... how can you be so awful!"
- },
- "defeat": {
- "1": "Hmph..."
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "Why must you continue to pester me?! I am sick of you. Sick through and through!\n$Enough with this useless talk.. with Nihilego's power I will show you how wrong you were to come here!"
- },
- "victory": {
- "1": "Aaauuuggghhhhhhhhh!!!"
- },
- "defeat": {
- "1": "All that I want is my precious beast! I don't care about any of the rest of you!"
- }
- },
- "skull_boss_guzma_1": {
- "encounter": {
- "1": "The hated boss who beats you down and beats you down and never lets up...\n$Yeah. Big bad Guzma is here!"
- },
- "victory": {
- "1": "Tch. I'm gonna beat you down one of these days!"
- },
- "defeat": {
- "1": "And you came all the way out here just for that, huh?"
- }
- },
- "skull_boss_guzma_2": {
- "encounter": {
- "1": "Doesn't matter who I'm up against, I'm gonna beat them down!\n$That's what big bad Guzma is all about!"
- },
- "victory": {
- "1": "Guzma!!! What is wrong with you?!"
- },
- "defeat": {
- "1": "Y'all are stupid!"
- }
- },
- "macro_boss_rose_1": {
- "encounter": {
- "1": "I must provide limitless energy to ensure everlasting prosperity for everyone...\n$It is my purpose, my duty, my destiny!"
- },
- "victory": {
- "1": "You still don't understand, trainer...\n$We... No, I am going to change the course of history!"
- },
- "defeat": {
- "1": "You still don't understand a thing!"
- }
- },
- "macro_boss_rose_2": {
- "encounter": {
- "1": "I'm committed to solving the energy problem in the Galar region—and, of course, around the world.\n$My experience and accomplishments that made Macro Cosmos a success are proof my methods work.\n$I don't intend to change my mind, even if I lose."
- },
- "victory": {
- "1": "I'd forgotten how great Pokémon battles are! It's been so long since I battled...\n$That sure was satisfying, I accept defeat for this battle."
- },
- "defeat": {
- "1": "I suppose it must seem that I am doing something terrible. I don't expect you to understand.\n$But I must provide the Galar region with limitless energy to ensure everlasting prosperity."
- }
- },
- "brock": {
- "encounter": {
- "1": "My expertise on Rock-type Pokémon will take you down! Come on!",
- "2": "My rock-hard willpower will overwhelm you!",
- "3": "Allow me to show you the true strength of my Pokémon!"
- },
- "victory": {
- "1": "Your Pokémon's strength have overcome my rock-hard defenses!",
- "2": "The world is huge! I'm glad to have had a chance to battle you.",
- "3": "Perhaps I should go back to pursuing my dream as a Pokémon Breeder…"
- },
- "defeat": {
- "1": "The best offense is a good defense!\nThat's my way of doing things!",
- "2": "Come study rocks with me next time to better learn how to fight them!",
- "3": "Hah, all my traveling around the regions is paying off!"
- }
- },
- "misty": {
- "encounter": {
- "1": "My policy is an all out offensive with Water-type Pokémon!",
- "2": "Hiya, I'll show you the strength of my aquatic Pokémon!",
- "3": "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?"
- },
- "victory": {
- "1": "You really are strong… I'll admit that you are skilled…",
- "2": "Grrr… You know you just got lucky, right?!",
- "3": "Wow, you're too much! I can't believe you beat me!"
- },
- "defeat": {
- "1": "Was the mighty Misty too much for you?",
- "2": "I hope you saw my Pokémon's elegant swimming techniques!",
- "3": "Your Pokémon were no match for my pride and joys!"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "My Electric Pokémon saved me during the war! I'll show you how!",
- "2": "Ten-hut! I'll shock you into surrender!",
- "3": "I'll zap you just like I do to all my enemies in battle!"
- },
- "victory": {
- "1": "Whoa! Your team's the real deal, kid!",
- "2": "Aaargh, you're strong! Even my electric tricks lost against you.",
- "3": "That was an absolutely shocking loss!"
- },
- "defeat": {
- "1": "Oh yeah! When it comes to Electric-type Pokémon, I'm number one in the world!",
- "2": "Hahaha! That was an electrifying battle, kid!",
- "3": "A Pokémon battle is war, and I have showed you first-hand combat!"
- }
- },
- "erika": {
- "encounter": {
- "1": "Ah, the weather is lovely here…\nOh, a battle? Very well then.",
- "2": "My Pokémon battling skills rival that of my flower arranging skills.",
- "3": "Oh, I hope the pleasant aroma of my Pokémon doesn't put me to sleep again…",
- "4": "Seeing flowers in a garden is so soothing."
- },
- "victory": {
- "1": "Oh! I concede defeat.",
- "2": "That match was most delightful.",
- "3": "Ah, it appears it is my loss…",
- "4": "Oh, my goodness."
- },
- "defeat": {
- "1": "I was afraid I would doze off…",
- "2": "Oh my, it seems my Grass Pokémon overwhelmed you.",
- "3": "That battle was such a soothing experience.",
- "4": "Oh… Is that all?"
- }
- },
- "janine": {
- "encounter": {
- "1": "I am mastering the art of poisonous attacks.\nI shall spar with you today!",
- "2": "Father trusts that I can hold my own.\nI will prove him right!",
- "3": "My ninja techniques are only second to my Father's!\nCan you keep up?"
- },
- "victory": {
- "1": "Even now, I still need training… I understand.",
- "2": "Your battle technique has outmatched mine.",
- "3": "I'm going to really apply myself and improve my skills."
- },
- "defeat": {
- "1": "Fufufu… the poison has sapped all your strength to battle.",
- "2": "Ha! You didn't stand a chance against my superior ninja skills!",
- "3": "Father's faith in me has proven to not be misplaced."
- }
- },
- "sabrina": {
- "encounter": {
- "1": "Through my psychic ability, I had a vision of your arrival!",
- "2": "I dislike fighting, but if you wish, I will show you my powers!",
- "3": "I can sense great ambition in you. I shall see if it not unfounded."
- },
- "victory": {
- "1": "Your power… It far exceeds what I foresaw…",
- "2": "I failed to accurately predict your power.",
- "3": "Even with my immense psychic powers, I cannot sense another as strong as you."
- },
- "defeat": {
- "1": "This victory… It is exactly as I foresaw in my visions!",
- "2": "Perhaps it was another I sensed a great desire in…",
- "3": "Hone your abilities before recklessly charging into battle.\nYou never know what the future may hold if you do…"
- }
- },
- "blaine": {
- "encounter": {
- "1": "Hah! Hope you brought a Burn Heal!",
- "2": "My fiery Pokémon will incinerate all challengers!",
- "3": "Get ready to play with fire!"
- },
- "victory": {
- "1": "I have burned down to nothing! Not even ashes remain!",
- "2": "Didn't I stoke the flames high enough?",
- "3": "I'm all burned out… But this makes my motivation to improve burn even hotter!"
- },
- "defeat": {
- "1": "My raging inferno cannot be quelled!",
- "2": "My Pokémon have been powered up with the heat from this victory!",
- "3": "Hah! My passion burns brighter than yours!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "I, the leader of Team Rocket, will make you feel a world of pain!",
- "2": "My training here will be vital before I am to face my old associates again.",
- "3": "I do not think you are prepared for the level of failure you are about to experience!"
- },
- "victory": {
- "1": "WHAT! Me, lose?! There is nothing I wish to say to you!",
- "2": "Hmph… You could never understand what I hope to achieve.",
- "3": "This defeat is merely delaying the inevitable.\nI will rise Team Rocket from the ashes in due time."
- },
- "defeat": {
- "1": "Not being able to measure your own strength shows that you are still but a child.",
- "2": "Do not try to interfere with me again.",
- "3": "I hope you understand how foolish challenging me was."
- }
- },
- "roxanne": {
- "encounter": {
- "1": "Would you kindly demonstrate how you battle?",
- "2": "You can learn many things by battling many trainers.",
- "3": "Oh, you caught me strategizing.\nWould you like to battle?"
- },
- "victory": {
- "1": "Oh, I appear to have lost.\nI understand.",
- "2": "It seems that I still have so much more to learn when it comes to battle.",
- "3": "I'll take what I learned here today to heart."
- },
- "defeat": {
- "1": "I have learned many things from our battle.\nI hope you have too.",
- "2": "I look forward to battling you again.\nI hope you'll use what you've learned here.",
- "3": "I won due to everything I have learned."
- }
- },
- "brawly": {
- "encounter": {
- "1": "Oh man, a challenger!\nLet's see what you can do!",
- "2": "You seem like a big splash.\nLet's battle!",
- "3": "Time to create a storm!\nLet's go!"
- },
- "victory": {
- "1": "Oh woah, you've washed me out!",
- "2": "You surfed my wave and crashed me down!",
- "3": "I feel like I'm lost in Granite Cave!"
- },
- "defeat": {
- "1": "Haha, I surfed the big wave!\nChallenge me again sometime.",
- "2": "Surf with me again some time!",
- "3": "Just like the tides come in and out, I hope you return to challenge me again."
- }
- },
- "wattson": {
- "encounter": {
- "1": "Time to get shocked!\nWahahahaha!",
- "2": "I'll make sparks fly!\nWahahahaha!",
- "3": "I hope you brought Paralyz Heal!\nWahahahaha!"
- },
- "victory": {
- "1": "Seems like I'm out of charge!\nWahahahaha!",
- "2": "You've completely grounded me!\nWahahahaha!",
- "3": "Thanks for the thrill!\nWahahahaha!"
- },
- "defeat": {
- "1": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
- "2": "I hope you found our battle electrifying!\nWahahahaha!",
- "3": "Aren't you shocked I won?\nWahahahaha!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "Nice to meet you! Wait, no…\nI will crush you!",
- "2": "I've only been a leader for a little while, but I'll smoke you!",
- "3": "It's time to demonstrate the moves my grandfather has taught me! Let's battle!"
- },
- "victory": {
- "1": "You remind me of my grandfather…\nNo wonder I lost.",
- "2": "Am I trying too hard?\nI should relax, can't get too heated.",
- "3": "Losing isn't going to smother me out.\nTime to reignite training!"
- },
- "defeat": {
- "1": "I hope I've made my grandfather proud…\nLet's battle again some time.",
- "2": "I…I can't believe I won!\nDoing things my way worked!",
- "3": "Let's exchange burning hot moves again soon!"
- }
- },
- "norman": {
- "encounter": {
- "1": "I'm surprised you managed to get here.\nLet's battle.",
- "2": "I'll do everything in my power as a Gym Leader to win.\nLet's go!",
- "3": "You better give this your all.\nIt's time to battle!"
- },
- "victory": {
- "1": "I lost to you…?\nRules are rules, though.",
- "2": "Was moving from Olivine a mistake…?",
- "3": "I can't believe it.\nThat was a great match."
- },
- "defeat": {
- "1": "We both tried our best.\nI hope we can battle again soon.",
- "2": "You should try challenging my kid instead.\nYou might learn something!",
- "3": "Thank you for the excellent battle.\nBetter luck next time."
- }
- },
- "winona": {
- "encounter": {
- "1": "I've been soaring the skies looking for prey…\nAnd you're my target!",
- "2": "No matter how our battle is, my Flying Pokémon and I will triumph with grace. Let's battle!",
- "3": "I hope you aren't scared of heights.\nLet's ascend!"
- },
- "victory": {
- "1": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
- "2": "Oh, my Flying Pokémon have plummeted!\nVery well.",
- "3": "Though I may have fallen, my Pokémon will continue to fly!"
- },
- "defeat": {
- "1": "My Flying Pokémon and I will forever dance elegantly!",
- "2": "I hope you enjoyed our show.\nOur graceful dance is finished.",
- "3": "Won't you come see our elegant choreography again?"
- }
- },
- "tate": {
- "encounter": {
- "1": "Hehehe…\nWere you surprised to see me without my sister?",
- "2": "I can see what you're thinking…\nYou want to battle!",
- "3": "How can you defeat someone…\nWho knows your every move?"
- },
- "victory": {
- "1": "It can't be helped…\nI miss Liza…",
- "2": "Your bond with your Pokémon was stronger than mine.",
- "3": "If I were with Liza, we would have won.\nWe can finish each other's thoughts!"
- },
- "defeat": {
- "1": "My Pokémon and I are superior!",
- "2": "If you can't even defeat me, you'll never be able to defeat Liza either.",
- "3": "It's all thanks to my strict training with Liza.\nI can make myself one with Pokémon."
- }
- },
- "liza": {
- "encounter": {
- "1": "Fufufu…\nWere you surprised to see me without my brother?",
- "2": "I can determine what you desire…\nYou want to battle, don't you?",
- "3": "How can you defeat someone…\nWho's one with their Pokémon?"
- },
- "victory": {
- "1": "It can't be helped…\nI miss Tate…",
- "2": "Your bond with your Pokémon…\nIt's stronger than mine.",
- "3": "If I were with Tate, we would have won.\nWe can finish each other's sentences!"
- },
- "defeat": {
- "1": "My Pokémon and I are victorious.",
- "2": "If you can't even defeat me, you'll never be able to defeat Tate either.",
- "3": "It's all thanks to my strict training with Tate.\nI can synchronize myself with my Pokémon."
- }
- },
- "juan": {
- "encounter": {
- "1": "Now's not the time to act coy.\nLet's battle!",
- "2": "Ahahaha, You'll be witness to my artistry with Water Pokémon!",
- "3": "A typhoon approaches!\nWill you be able to test me?",
- "4": "Please, you shall bear witness to our artistry.\nA grand illusion of water sculpted by my Pokémon and myself!"
- },
- "victory": {
- "1": "You may be a genius who can take on Wallace!",
- "2": "I focused on elegance while you trained.\nIt's only natural that you defeated me.",
- "3": "Ahahaha!\nVery well, You have won this time.",
- "4": "From you, I sense the brilliant shine of skill that will overcome all."
- },
- "defeat": {
- "1": "My Pokémon and I have sculpted an illusion of Water and come out victorious.",
- "2": "Ahahaha, I have won, and you have lost.",
- "3": "Shall I loan you my outfit? It may help you battle!\nAhahaha, I jest!",
- "4": "I'm the winner! Which is to say, you lost."
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "Crash! Crash! Watch out!\nCrasher Wake…is…heeere!",
- "2": "Crash! Crash! Crasher Wake!",
- "3": "I'm the tidal wave of power to wash you away!"
- },
- "victory": {
- "1": "That puts a grin on my face!\nGuhahaha! That was a blast!",
- "2": "Hunwah! It's gone and ended!\nHow will I say this…\nI want more! I wanted to battle a lot more!",
- "3": "WHAAAAT!?"
- },
- "defeat": {
- "1": "Yeeeeah! That's right!",
- "2": "I won, but I want more! I wanted to battle a lot more!",
- "3": "So long!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "I'll show you the real power of the magnificent bird Pokémon!",
- "2": "Winds, stay with me!",
- "3": "Dad! I hope you're watching me battle from above!"
- },
- "victory": {
- "1": "I understand… I'll bow out gracefully.",
- "2": "A defeat is a defeat. You are strong indeed.",
- "3": "…Shoot! Yeah, I lost."
- },
- "defeat": {
- "1": "Dad! I won with your cherished bird Pokémon…",
- "2": "Bird Pokémon are the best after all!",
- "3": "Feels like I'm catching up to my dad!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
- "2": "I'm not here to chat. I'm here to win!",
- "3": "This is a little gift from my Pokémon… I hope you can take it!"
- },
- "victory": {
- "1": "You and your Pokémon are just too much…",
- "2": "How…? How can this be?!",
- "3": "I was totally washed away!"
- },
- "defeat": {
- "1": "The raging wave crashes again!",
- "2": "Time to ride the wave of victory!",
- "3": "Ehehe!"
- }
- },
- "melony": {
- "encounter": {
- "1": "I'm not going to hold back!",
- "2": "All righty, I suppose we should get started.",
- "3": "I'll freeze you solid!"
- },
- "victory": {
- "1": "You… You're pretty good, huh?",
- "2": "If you find Gordie around, be sure to give him a right trashing, would you?",
- "3": "I think you took breaking the ice a little too literally…"
- },
- "defeat": {
- "1": "Now do you see how severe battles can be?",
- "2": "Hee! Looks like I went and won again!",
- "3": "Are you holding back?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "You look strong! Shoots! Let's start!",
- "2": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
- "3": "Oh ho, so I'm facing you! That's off the wall."
- },
- "victory": {
- "1": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
- "2": "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!",
- "3": "You're strong as a gnarly wave!"
- },
- "defeat": {
- "1": "You're tough, but it's not enough to sway the sea, 'K!",
- "2": "Hee! Looks like I went and won again!",
- "3": "Sweet, sweet victory!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
- "2": "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?",
- "3": "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?"
- },
- "victory": {
- "1": "Wow. I'm dumbstruck!",
- "2": "S-sorry! First, I must apologize to my Pokémon…\n\nI'm really sorry you had a bad experience because of me!",
- "3": "Even in light of that, I'm still one of the Elite Four!"
- },
- "defeat": {
- "1": "Eheh.",
- "2": "That gave me excellent material for my next novel!",
- "3": "And so, another tale ends…"
- }
- },
- "marshal": {
- "encounter": {
- "1": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
- "2": "Victory, decisive victory, is my intention! Challenger, here I come!",
- "3": "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!"
- },
- "victory": {
- "1": "Whew! Well done!",
- "2": "As your battles continue, aim for even greater heights!",
- "3": "The strength shown by you and your Pokémon has deeply impressed me…"
- },
- "defeat": {
- "1": "Hmm.",
- "2": "That was good battle.",
- "3": "Haaah! Haaah! Haiyaaaah!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "You remind me of an old friend. That makes me excited about this Pokémon battle!",
- "2": "Pokémon battles have no meaning if you don't think why you battle.\n$Or better said, it makes battling together with Pokémon meaningless.",
- "3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you."
- },
- "victory": {
- "1": "Thank you! I saw what was missing in me.",
- "2": "Thank you! I feel like I saw a little of the way toward my ideals.",
- "3": "Hmm… This is problematic."
- },
- "defeat": {
- "1": "As a Gym Leader, I aim to be a wall for you to overcome.",
- "2": "All right!",
- "3": "I made it where I am because Pokémon were by my side.\nPerhaps we need to think about why Pokémon help us not in terms of Pokémon and Trainers but as a relationship between living beings."
- }
- },
- "chili": {
- "encounter": {
- "1": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
- "2": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
- "3": "I'm going to show you what me and my blazing Fire types can do!"
- },
- "victory": {
- "1": "You got me. I am… burned… out…",
- "2": "Whoa ho! You're on fire!",
- "3": "Augh! You got me!"
- },
- "defeat": {
- "1": "I'm on fire! Play with me, and you'll get burned!",
- "2": "When you play with fire, you get burned!",
- "3": "I mean, c'mon, your opponent was me! You didn't have a chance!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
- "2": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
- "3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon."
- },
- "victory": {
- "1": "Er… Is it over now?",
- "2": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
- "3": "…Huh. Looks like my timing was, um, off?"
- },
- "defeat": {
- "1": "Huh? Did I win?",
- "2": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
- "3": "It…it was quite a thrilling experience…"
- }
- },
- "roark": {
- "encounter": {
- "1": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
- "2": "Here goes! These are my rocking Pokémon, my pride and joy!",
- "3": "Rock-type Pokémon are simply the best!",
- "4": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!"
- },
- "victory": {
- "1": "W-what? That can't be! My buffed-up Pokémon!",
- "2": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
- "3": "With skill like yours, it's natural for you to win.",
- "4": "Wh-what?! It can't be! Even that wasn't enough?",
- "5": "I blew it."
- },
- "defeat": {
- "1": "See? I'm proud of my rocking battle style!",
- "2": "Thanks! The battle gave me confidence that I may be able to beat my dad!",
- "3": "I feel like I just smashed through a really stubborn boulder!"
- }
- },
- "morty": {
- "encounter": {
- "1": "With a little more, I could see a future in which I meet the legendary Pokémon.\n$You're going to help me reach that level!",
- "2": "It's said that a rainbow-hued Pokémon will come down to appear before a truly powerful Trainer. \n$I believed that tale, so I have secretly trained here all my life. As a result, I can now see what others cannot. \n$I see a shadow of the person who will make the Pokémon appear. \n$I believe that person is me! You're going to help me reach that level!",
- "3": "Whether you choose to believe or not, mystic power does exist.",
- "4": "You can bear witness to the fruits of my training.",
- "5": "You must make your soul one with that of Pokémon. Can you do this?",
- "6": "Say, do you want to be part of my training?"
- },
- "victory": {
- "1": "I'm not good enough yet…",
- "2": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
- "3": "How is this possible…",
- "4": "I don't think our potentials are so different.\n$But you seem to have something more than that… So be it.",
- "5": "Guess I need more training.",
- "6": "That's a shame."
- },
- "defeat": {
- "1": "I moved… one step ahead again.",
- "2": "Fufufu…",
- "3": "Wh-what?! It can't be! Even that wasn't enough?",
- "4": "I feel like I just smashed through a really stubborn boulder!",
- "5": "Ahahahah!",
- "6": "I knew I would win!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "I wanna win, so that's exactly what I'll do!",
- "2": "I battle because I wanna battle! And you know what? That's how it should be!"
- },
- "victory": {
- "1": "I wanted to win…but I lost!",
- "2": "I lost…'cause I couldn't win!"
- },
- "defeat": {
- "1": "Hey, wait a sec. Did I just win? I think I just won! Talk about satisfying!",
- "2": "Wooo! That was amazing!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "I want to be the one to help a certain person. That being the case, I cannot afford to lose.\n$… Our battle starts now."
- },
- "victory": {
- "1": "I am… not enough, I see."
- },
- "defeat": {
- "1": "Victory belongs to me. Well fought."
- }
- },
- "lacey": {
- "encounter": {
- "1": "I'll be facing you with my usual party as a member of the Elite Four."
- },
- "victory": {
- "1": "That was a great battle!"
- },
- "defeat": {
- "1": "Let's give your Pokémon a nice round of applause for their efforts!"
- }
- },
- "drayton": {
- "encounter": {
- "1": "Man, I love chairs. Don't you love chairs? What lifesavers. \n$I don't get why everyone doesn't just sit all the time. Standing up's tiring work!"
- },
- "victory": {
- "1": "Guess I should've expected that!"
- },
- "defeat": {
- "1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?"
- },
- "victory": {
- "1": "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout."
- },
- "defeat": {
- "1": "Hohoho… Indeed. Frail little blades o' grass'll break through even concrete."
- }
- },
- "viola": {
- "encounter": {
- "1": "Whether it's the tears of frustration that follow a loss or the blossoming of joy that comes with victory…\n$They're both great subjects for my camera! Fantastic! This'll be just fantastic! \n$Now come at me!",
- "2": "My lens is always focused on victory--I won't let anything ruin this shot!"
- },
- "victory": {
- "1": "You and your Pokémon have shown me a whole new depth of field! Fantastic! Just fantastic!",
- "2": "The world you see through a lens, and the world you see with a Pokémon by your side…\n$The same world can look entirely different depending on your view."
- },
- "defeat": {
- "1": "The photo from the moment of my victory will be a real winner, all right!",
- "2": "Yes! I took some great photos!"
- }
- },
- "candice": {
- "encounter": {
- "1": "You want to challenge Candice? Sure thing! I was waiting for someone tough! \n$But I should tell you, I'm tough because I know how to focus.",
- "2": "Pokémon, fashion, romance… It's all about focus! \n$I'll show you just what I mean. Get ready to lose!"
- },
- "victory": {
- "1": "I must say, I'm warmed up to you! I might even admire you a little.",
- "2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. "
- },
- "defeat": {
- "1": "I sensed your will to win, but I don't lose!",
- "2": "See? Candice's focus! My Pokémon's focus is great, too!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "You have a winning aura about you. So, anyway, this will be fun. Let's have our battle!"
- },
- "victory": {
- "1": "Amazing! You're very good, aren't you?"
- },
- "defeat": {
- "1": "Yes! My Pokémon and I are perfectly good!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "Ok! Let me take you on!"
- },
- "victory": {
- "1": "Battling is a deep and complex affair…"
- },
- "defeat": {
- "1": "Victory over an Elite Four member doesn't come easily."
- }
- },
- "cress": {
- "encounter": {
- "1": "That is correct! It shall be I and my esteemed Water types that you must face in battle!"
- },
- "victory": {
- "1": "Lose? Me? I don't believe this."
- },
- "defeat": {
- "1": "This is the appropriate result when I'm your opponent."
- }
- },
- "allister": {
- "encounter": {
- "1": "'M Allister.\nH-here… I go…"
- },
- "victory": {
- "1": "I nearly lost my mask from the shock… That was…\n$Wow. I can see your skill for what it is."
- },
- "defeat": {
- "1": "Th-that was ace!"
- }
- },
- "clay": {
- "encounter": {
- "1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!"
- },
- "victory": {
- "1": "Man oh man… It feels good to go all out and still be defeated!"
- },
- "defeat": {
- "1": "What's important is how ya react to losin'. \n$That's why folks who use losin' as fuel to get better are tough."
- }
- },
- "kofu": {
- "encounter": {
- "1": "I'mma serve you a full course o' Water-type Pokémon! Don't try to eat 'em, though!"
- },
- "victory": {
- "1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
- },
- "defeat": {
- "1": "You come back to see me again now, ya hear?"
- }
- },
- "tulip": {
- "encounter": {
- "1": "Allow me to put my skills to use to make your cute little Pokémon even more beautiful!"
- },
- "victory": {
- "1": "Your strength has a magic to it that cannot be washed away."
- },
- "defeat": {
- "1": "You know, in my line of work, people who lack talent in one area or the other often fade away quickly—never to be heard of again."
- }
- },
- "sidney": {
- "encounter": {
- "1": "I like that look you're giving me. I guess you'll give me a good match.\n$That's good! Looking real good! All right!\n$You and me, let's enjoy a battle that can only be staged here!"
- },
- "victory": {
- "1": "Well, how do you like that? I lost! Eh, it was fun, so it doesn't matter."
- },
- "defeat": {
- "1": "No hard feelings, alright?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "While I trained, I gained the ability to commune with Ghost-type Pokémon. \n$Yes, the bond I developed with Pokémon is extremely tight. \n$So, come on, just try and see if you can even inflict damage on my Pokémon!"
- },
- "victory": {
- "1": "Oh, darn. I've gone and lost."
- },
- "defeat": {
- "1": "I look forward to battling you again sometime!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "All I have seen are challenges by weak Trainers and their Pokémon. \n$What about you? It would please me to no end if I could go all out against you!"
- },
- "victory": {
- "1": "You and your Pokémon… How hot your spirits burn!\n$The all-consuming heat overwhelms. \n$It's no surprise that my icy skills failed to harm you."
- },
- "defeat": {
- "1": "A fiercely passionate battle, indeed."
- }
- },
- "drake": {
- "encounter": {
- "1": "For us to battle with Pokémon as partners, do you know what it takes? Do you know what is needed? \n$If you don't, then you will never prevail over me!"
- },
- "victory": {
- "1": "Superb, it should be said."
- },
- "defeat": {
- "1": "I gave my all for that battle!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "There's something about you… A difference in your demeanor. \n$I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. \n$And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!"
- },
- "victory": {
- "1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy."
- },
- "defeat": {
- "1": "A grand illusion!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?"
- },
- "victory": {
- "1": "How dare you!"
- },
- "defeat": {
- "1": "There's nothing you can do once you're frozen."
- }
- },
- "will": {
- "encounter": {
- "1": "I have trained all around the world, making my psychic Pokémon powerful.\n$I can only keep getting better! Losing is not an option!"
- },
- "victory": {
- "1": "I… I can't… believe it…"
- },
- "defeat": {
- "1": "That was close. I wonder what it is that you lack."
- }
- },
- "malva": {
- "encounter": {
- "1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!"
- },
- "victory": {
- "1": "What news… So a new challenger has defeated Malva!"
- },
- "defeat": {
- "1": "I am delighted! Yes, delighted that I could squash you beneath my heel."
- }
- },
- "hala": {
- "encounter": {
- "1": "Old Hala is here to make you holler!"
- },
- "victory": {
- "1": "I could feel the power you gained on your journey."
- },
- "defeat": {
- "1": "Haha! What a delightful battle!"
- }
- },
- "molayne": {
- "encounter": {
- "1": "I gave the captain position to my cousin Sophocles, but I'm confident in my ability. \n$My strength is like that of a supernova!"
- },
- "victory": {
- "1": "I certainly found an interesting Trainer to face!"
- },
- "defeat": {
- "1": "Ahaha. What an interesting battle."
- }
- },
- "rika": {
- "encounter": {
- "1": "I'd say I'll go easy on you, but… I'd be lying! Think fast!"
- },
- "victory": {
- "1": "Not bad, kiddo."
- },
- "defeat": {
- "1": "Nahahaha! You really are something else, kiddo!"
- }
- },
- "bruno": {
- "encounter": {
- "1": "We will grind you down with our superior power! Hoo hah!"
- },
- "victory": {
- "1": "Why? How could I lose?"
- },
- "defeat": {
- "1": "You can challenge me all you like, but the results will never change!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "I'm Bugsy! I never lose when it comes to bug Pokémon!"
- },
- "victory": {
- "1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win."
- },
- "defeat": {
- "1": "Thanks! Thanks to our battle, I was also able to make progress in my research!"
- }
- },
- "koga": {
- "encounter": {
- "1": "Fwahahahaha! Pokémon are not merely about brute force--you shall see soon enough!"
- },
- "victory": {
- "1": "Ah! You've proven your worth!"
- },
- "defeat": {
- "1": "Have you learned to fear the techniques of the ninja?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "Well, would you show this old lady how much you've learned?"
- },
- "victory": {
- "1": "Well! Dear child, I must say, that was most impressive. \n$Your Pokémon believed in you and did their best to earn you the win. \n$Even though I've lost, I find myself with this silly grin!"
- },
- "defeat": {
- "1": "Hahahahah! Looks like this old lady won!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!"
- },
- "victory": {
- "1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!"
- },
- "defeat": {
- "1": "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "As long as I am alive, I shall strive onward to seek the ultimate cuisine... and the strongest opponents in battle!"
- },
- "victory": {
- "1": "I shall store my memory of you and your Pokémon forever away within my heart."
- },
- "defeat": {
- "1": "Our Pokémon battle was like food for my soul. It shall keep me going. \n$That is how I will pay my respects to you for giving your all in battle!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "Get ready! I'm gonna knock some sense outta ya!"
- },
- "victory": {
- "1": "Wild! Your reason's already more toxic than mine!"
- },
- "defeat": {
- "1": "Hey, c'mon! Get serious! You gotta put more out there!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "No introduction needed here. Time to battle me, Olivia!"
- },
- "victory": {
- "1": "Really lovely… Both you and your Pokémon…"
- },
- "defeat": {
- "1": "Mmm-hmm."
- }
- },
- "poppy": {
- "encounter": {
- "1": "Oooh! Do you wanna have a Pokémon battle with me?"
- },
- "victory": {
- "1": "Uagh?! Mmmuuuggghhh…"
- },
- "defeat": {
- "1": "Yaaay! I did it! I de-feet-ed you! You can come for… For… An avenge match? \n$Come for an avenge match anytime you want!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "Pokémon are for battling! I'll show you how a real Trainer battles!"
- },
- "victory": {
- "1": "Oh my! You're something special, child!"
- },
- "defeat": {
- "1": "Bahaha. That's how a proper battle's done!"
- }
- },
- "flint": {
- "encounter": {
- "1": "Hope you're warmed up, cause here comes the Big Bang!"
- },
- "victory": {
- "1": "Incredible! Your moves are so hot, they make mine look lukewarm!"
- },
- "defeat": {
- "1": "Huh? Is that it? I think you need a bit more passion."
- }
- },
- "grimsley": {
- "encounter": {
- "1": "The winner takes everything, and there's nothing left for the loser."
- },
- "victory": {
- "1": "When one loses, they lose everything… The next thing I'll look for will be victory, too!"
- },
- "defeat": {
- "1": "If somebody wins, the person who fought against that person will lose."
- }
- },
- "caitlin": {
- "encounter": {
- "1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!"
- },
- "victory": {
- "1": "My Pokémon and I learned so much! I offer you my thanks."
- },
- "defeat": {
- "1": "I aspire to claim victory with elegance and grace."
- }
- },
- "diantha": {
- "encounter": {
- "1": "Battling against you and your Pokémon, all of you brimming with hope for the future… \n$Honestly, it just fills me up with energy I need to keep facing each new day! It does!"
- },
- "victory": {
- "1": "Witnessing the noble spirits of you and your Pokémon in battle has really touched my heart…"
- },
- "defeat": {
- "1": "Oh, fantastic! What did you think? My team was pretty cool, right?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!"
- },
- "victory": {
- "1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!"
- },
- "defeat": {
- "1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "Battling is just plain fun! Come on, I can take you!"
- },
- "victory": {
- "1": "I'm… I'm speechless! How did you do it?!"
- },
- "defeat": {
- "1": "Ehaha! What an amazing victory!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "Hello there… It's me, Larry.\n$I serve as a member of the Elite Four too, yes… Unfortunately for me."
- },
- "victory": {
- "1": "Well, that took the wind from under our wings…"
- },
- "defeat": {
- "1": "It's time for a meeting with the boss."
- }
- },
- "lance": {
- "encounter": {
- "1": "I've been waiting for you. Allow me to test your skill.",
- "2": "I thought that you would be able to get this far. Let's get this started."
- },
- "victory": {
- "1": "You got me. You are magnificent!",
- "2": "I never expected another trainer to beat me… I'm surprised."
- },
- "defeat": {
- "1": "That was close. Want to try again?",
- "2": "It's not that you are weak. Don't let it bother you."
- }
- },
- "karen": {
- "encounter": {
- "1": "I am Karen. Would you care for a showdown with my Dark-type Pokémon?",
- "2": "I am unlike those you've already met.",
- "3": "You've assembled a charming team. Our battle should be a good one."
- },
- "victory": {
- "1": "No! I can't win. How did you become so strong?",
- "2": "I will not stray from my chosen path.",
- "3": "The Champion is looking forward to meeting you."
- },
- "defeat": {
- "1": "That's about what I expected.",
- "2": "Well, that was relatively entertaining.",
- "3": "Come visit me anytime."
- }
- },
- "milo": {
- "encounter": {
- "1": "Sure seems like you understand Pokémon real well. \n$This is gonna be a doozy of a battle! \n$I'll have to Dynamax my Pokémon if I want to win!"
- },
- "victory": {
- "1": "The power of Grass has wilted… What an incredible Challenger!"
- },
- "defeat": {
- "1": "This'll really leave you in shock and awe."
- }
- },
- "lucian": {
- "encounter": {
- "1": "Just a moment, please. The book I'm reading has nearly reached its thrilling climax… \n$The hero has obtained a mystic sword and is about to face their final trial… Ah, never mind. \n$Since you've made it this far, I'll put that aside and battle you. \n$Let me see if you'll achieve as much glory as the hero of my book!"
- },
- "victory": {
- "1": "I see… It appears you've put me in checkmate."
- },
- "defeat": {
- "1": "I have a reputation to uphold."
- }
- },
- "drasna": {
- "encounter": {
- "1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!"
- },
- "victory": {
- "1": "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!"
- },
- "defeat": {
- "1": "How can this be?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "So, here you are… Why don't we see who the winds favor today, you… Or me?"
- },
- "victory": {
- "1": "It's frustrating to me as a member of the Elite Four, but it seems your strength is the real deal."
- },
- "defeat": {
- "1": "That was an ace!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "Prepare to learn firsthand how the fiery breath of ferocious battle feels!"
- },
- "victory": {
- "1": "Fortune smiled on me this time, but… \n$Judging from how the match went, who knows if I will be so lucky next time."
- },
- "defeat": {
- "1": "That was an ace!"
- }
- },
- "blue": {
- "encounter": {
- "1": "You must be pretty good to get this far."
- },
- "victory": {
- "1": "I've only lost to him and now to you… Him? Hee, hee…"
- },
- "defeat": {
- "1": "See? My power is what got me here."
- }
- },
- "piers": {
- "encounter": {
- "1": "Get ready for a mosh pit with me and my party! Spikemuth, it's time to rock!"
- },
- "victory": {
- "1": "Me an' my team gave it our best. Let's meet up again for a battle some time…"
- },
- "defeat": {
- "1": "My throat's ragged from shoutin'… But 'at was an excitin' battle!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "Oh… Your Pokémon are impressive. I think I will enjoy this."
- },
- "victory": {
- "1": "You are truly strong. I'll have to try much harder, too."
- },
- "defeat": {
- "1": "I never expected to win."
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "I am still the Champion. I won't hold anything back."
- },
- "victory": {
- "1": "This is the emergence of a new Champion."
- },
- "defeat": {
- "1": "I successfully defended my Championship."
- }
- },
- "steven": {
- "encounter": {
- "1": "Tell me… What have you seen on your journey with your Pokémon? \n$What have you felt, meeting so many other Trainers out there? \n$Traveling this rich land… Has it awoken something inside you? \n$I want you to come at me with all that you've learned. \n$My Pokémon and I will respond in turn with all that we know!"
- },
- "victory": {
- "1": "So I, the Champion, fall in defeat…"
- },
- "defeat": {
- "1": "That was time well spent! Thank you!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "I, Cynthia, accept your challenge! There won't be any letup from me!"
- },
- "victory": {
- "1": "No matter how fun the battle is, it will always end sometime…"
- },
- "defeat": {
- "1": "Even if you lose, never lose your love of Pokémon."
- }
- },
- "iris": {
- "encounter": {
- "1": "Know what? I really look forward to having serious battles with strong Trainers! \n$I mean, come on! The Trainers who make it here are Trainers who desire victory with every fiber of their being! \n$And they are battling alongside Pokémon that have been through countless difficult battles! \n$If I battle with people like that, not only will I get stronger, my Pokémon will, too! \n$And we'll get to know each other even better! OK! Brace yourself! \n$I'm Iris, the Pokémon League Champion, and I'm going to defeat you!"
- },
- "victory": {
- "1": "Aghhhh… I did my best, but we lost…"
- },
- "defeat": {
- "1": "Yay! We won!"
- }
- },
- "hau": {
- "encounter": {
- "1": "I wonder if a Trainer battles differently depending on whether they're from a warm region or a cold region.\n$Let's test it out!"
- },
- "victory": {
- "1": "That was awesome! I think I kinda understand your vibe a little better now!"
- },
- "defeat": {
- "1": "Ma-an, that was some kinda battle!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "I decided to throw my hat in the ring once more. \n$Come now… Show me the fruits of your training."
- },
- "victory": {
- "1": "I eagerly await news of all your achievements!"
- },
- "defeat": {
- "1": "What's the matter? This isn't all, is it?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "Yesss! I'm so psyched! Time for us to let loose!"
- },
- "victory": {
- "1": "Well, that stinks, but I still had fun! I'll getcha next time!"
- },
- "defeat": {
- "1": "Well, that was a great battle! Fruitful for sure."
- }
- },
- "leon": {
- "encounter": {
- "1": "We're gonna have an absolutely champion time!"
- },
- "victory": {
- "1": "My time as Champion is over… \n$But what a champion time it's been! \n$Thank you for the greatest battle I've ever had!"
- },
- "defeat": {
- "1": "An absolute champion time, that was!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "Hey! Don't you think Pokémon are, like, super cute?"
- },
- "victory": {
- "1": "Waaah! Waaah! You're so mean!"
- },
- "defeat": {
- "1": "And that's that!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "Hah! You want to challenge me? Are you brave or just ignorant?"
- },
- "victory": {
- "1": "You're strong! Would you please make me your apprentice?"
- },
- "defeat": {
- "1": "There. Do you realize how much more powerful I am than you?"
- }
- },
- "katy": {
- "encounter": {
- "1": "Don't let your guard down unless you would like to find yourself knocked off your feet!"
- },
- "victory": {
- "1": "All of my sweet little Pokémon dropped like flies!"
- },
- "defeat": {
- "1": "Eat up, my cute little Vivillon!"
- }
- },
- "pryce": {
- "encounter": {
- "1": "Youth alone does not ensure victory! Experience is what counts."
- },
- "victory": {
- "1": "Outstanding! That was perfect. Try not to forget what you feel now."
- },
- "defeat": {
- "1": "Just as I envisioned."
- }
- },
- "clair": {
- "encounter": {
- "1": "Do you know who I am? And you still dare to challenge me?"
- },
- "victory": {
- "1": "I wonder how far you can get with your skill level. This should be fascinating."
- },
- "defeat": {
- "1": "That's that."
- }
- },
- "maylene": {
- "encounter": {
- "1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!"
- },
- "victory": {
- "1": "I admit defeat…"
- },
- "defeat": {
- "1": "That was awesome."
- }
- },
- "fantina": {
- "encounter": {
- "1": "You shall challenge me, yes? But I shall win. \n$That is what the Gym Leader of Hearthome does, non?"
- },
- "victory": {
- "1": "You are so fantastically strong. I know why I have lost."
- },
- "defeat": {
- "1": "I am so, so, very happy!"
- }
- },
- "byron": {
- "encounter": {
- "1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!"
- },
- "victory": {
- "1": "Hmm! My sturdy Pokémon--defeated!"
- },
- "defeat": {
- "1": "Gwahahaha! How were my sturdy Pokémon?!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "An ancient custom deciding one's destiny. The battle begins!"
- },
- "victory": {
- "1": "Create your own path. Let nothing get in your way. Your fate, your future."
- },
- "defeat": {
- "1": "Our path is clear now."
- }
- },
- "volkner": {
- "encounter": {
- "1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!"
- },
- "victory": {
- "1": "You've got me beat…\n$Your desire and the noble way your Pokémon battled for you… \n$I even felt thrilled during our match. That was a very good battle."
- },
- "defeat": {
- "1": "It was not shocking at all… \n$That is not what I wanted!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "M'hm… If I win this battle, I feel like I can draw a picture unlike any before it. \n$OK! I can hear my battle muse loud and clear. Let's get straight to it!",
- "2": "Of course, I'm really proud of all of my Pokémon! \n$Well now… Let's get right to it!"
- },
- "victory": {
- "1": "Is it over? Has my muse abandoned me?",
- "2": "Hmm… It's over! You're incredible!"
- },
- "defeat": {
- "1": "Wow… It's beautiful somehow, isn't it…",
- "2": "Sometimes I hear people say something was an ugly win. \n$I think if you're trying your best, any win is beautiful."
- }
- },
- "elesa": {
- "encounter": {
- "1": "C'est fini! When I'm certain of that, I feel an electric jolt run through my body! \n$I want to feel the sensation, so now my beloved Pokémon are going to make your head spin!"
- },
- "victory": {
- "1": "I meant to make your head spin, but you shocked me instead."
- },
- "defeat": {
- "1": "That was unsatisfying somehow… Will you give it your all next time?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "It's finally time for a showdown! That means the Pokémon battle that decides who's at the top, right? \n$I love being on the summit! 'Cause you can see forever and ever from high places! \n$So, how about you and I have some fun?"
- },
- "victory": {
- "1": "Being your opponent in battle is a new source of strength to me. Thank you!"
- },
- "defeat": {
- "1": "Win or lose, you always gain something from a battle, right?"
- }
- },
- "brycen": {
- "encounter": {
- "1": "There is also strength in being with other people and Pokémon. \n$Receiving their support makes you stronger. I'll show you this power!"
- },
- "victory": {
- "1": "The wonderful combination of you and your Pokémon! What a beautiful friendship!"
- },
- "defeat": {
- "1": "Extreme conditions really test you and train you!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "What I want to find is a young Trainer who can show me a bright future. \n$Let's battle with everything we have: your skill, my experience, and the love we've raised our Pokémon with!"
- },
- "victory": {
- "1": "This intense feeling that floods me after a defeat… I don't know how to describe it."
- },
- "defeat": {
- "1": "Harrumph! I know your ability is greater than that!"
- }
- },
- "grant": {
- "encounter": {
- "1": "There is only one thing I wish for. \n$That by surpassing one another, we find a way to even greater heights."
- },
- "victory": {
- "1": "You are a wall that I am unable to surmount!"
- },
- "defeat": {
- "1": "Do not give up. \n$That is all there really is to it. \n$The most important lessons in life are simple."
- }
- },
- "korrina": {
- "encounter": {
- "1": "Time for Lady Korrina's big appearance!"
- },
- "victory": {
- "1": "It's your very being that allows your Pokémon to evolve!"
- },
- "defeat": {
- "1": "What an explosive battle!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "Oh! I'm glad that we got to meet!"
- },
- "victory": {
- "1": "Your passion for battle inspires me!"
- },
- "defeat": {
- "1": "Looks like my Trainer-Grow-Stronger Machine, Mach 2 is really working!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong."
- },
- "victory": {
- "1": "I hope that you will find things worth smiling about tomorrow…"
- },
- "defeat": {
- "1": "Oh goodness, what a pity…"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "You know what? We all talk big about what you learn from battling and bonds and all that…\n$But really, I just do it 'cause it's fun. \n$Who cares about the grandstanding? Let's get to battling!"
- },
- "victory": {
- "1": "Outstanding! I'm tough as an iceberg, but you smashed me through and through!"
- },
- "defeat": {
- "1": "Tussle with me and this is what happens!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "Every Trainer and Pokémon trains hard in pursuit of victory. \n$But that means your opponent is also working hard to win. \n$In the end, the match is decided by which side is able to unleash their true potential."
- },
- "victory": {
- "1": "I'm glad I could battle you today!"
- },
- "defeat": {
- "1": "That's a great way for me to feel my own growth!"
- }
- },
- "bea": {
- "encounter": {
- "1": "Do you have an unshakable spirit that won't be moved, no matter how you are attacked? \n$I think I'll just test that out, shall I?"
- },
- "victory": {
- "1": "I felt the fighting spirit of your Pokémon as you led them in battle."
- },
- "defeat": {
- "1": "That was the best sort of match anyone could ever hope for."
- }
- },
- "opal": {
- "encounter": {
- "1": "Let me have a look at how you and your partner Pokémon behave!"
- },
- "victory": {
- "1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon."
- },
- "defeat": {
- "1": "Too bad for you, I guess."
- }
- },
- "bede": {
- "encounter": {
- "1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am."
- },
- "victory": {
- "1": "I see… Well, that's fine. I wasn't really trying all that hard anyway."
- },
- "defeat": {
- "1": "Not a bad job, I suppose."
- }
- },
- "gordie": {
- "encounter": {
- "1": "So, let's get this over with."
- },
- "victory": {
- "1": "I just want to climb into a hole… Well, I guess it'd be more like falling from here."
- },
- "defeat": {
- "1": "Battle like you always do, victory will follow!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "The truth is, when all's said and done… I really just wanna become Champion for myself! \n$So don't take it personal when I kick your butt!"
- },
- "victory": {
- "1": "OK, so I lost… But I got to see a lot of the good points of you and your Pokémon!"
- },
- "defeat": {
- "1": "Hope you enjoyed our battle tactics."
- }
- },
- "raihan": {
- "encounter": {
- "1": "I'm going to defeat the Champion, win the whole tournament, and prove to the world just how strong the great Raihan really is!"
- },
- "victory": {
- "1": "I look this good even when I lose. \n$It's a real curse. \n$Guess it's time for another selfie!"
- },
- "defeat": {
- "1": "Let's take a selfie to remember this."
- }
- },
- "brassius": {
- "encounter": {
- "1": "I assume you are ready? Let our collaborative work of art begin!"
- },
- "victory": {
- "1": "Ahhh…vant-garde!"
- },
- "defeat": {
- "1": "I will begin on a new piece at once!"
- }
- },
- "iono": {
- "encounter": {
- "1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!"
- },
- "victory": {
- "1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
- },
- "defeat": {
- "1": "Your eyeballs are MINE!"
- }
- },
- "larry": {
- "encounter": {
- "1": "When all's said and done, simplicity is strongest."
- },
- "victory": {
- "1": "A serving of defeat, huh?"
- },
- "defeat": {
- "1": "I'll call it a day."
- }
- },
- "ryme": {
- "encounter": {
- "1": "Come on, baby! Rattle me down to the bone!"
- },
- "victory": {
- "1": "You're cool, my friend—you move my SOUL!"
- },
- "defeat": {
- "1": "Later, baby!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "All I need to do is make sure the power of my Pokémon chills you to the bone!"
- },
- "victory": {
- "1": "Your burning passion… I kinda like it, to be honest."
- },
- "defeat": {
- "1": "Things didn't heat up for you."
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "You've made it this far, huh? Let's see if you can handle my Pokémon!",
- "2": "I'll give it my best shot, but don't think I'll go easy on you!"
- },
- "victory": {
- "1": "I can't believe I lost... But you deserved that win. Well done!",
- "2": "Looks like I've still got a lot to learn. Great battle, though!"
- },
- "defeat": {
- "1": "You put up a good fight, but I've got the edge! Better luck next time!",
- "2": "Seems like my training's paid off. Thanks for the battle!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "The tides are turning in my favor. Ready to get swept away?",
- "2": "Let's make some waves with this battle! I hope you're prepared!"
- },
- "victory": {
- "1": "You navigated those waters perfectly... Well done!",
- "2": "Looks like my currents were no match for you. Great job!"
- },
- "defeat": {
- "1": "Water always finds a way. That was a refreshing battle!",
- "2": "You fought well, but the ocean's power is unstoppable!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "Prepare yourself! My fighting spirit burns bright!",
- "2": "Let's see if you can keep up with my relentless pace!"
- },
- "victory": {
- "1": "Your strength... It's impressive. You truly deserve this win.",
- "2": "I've never felt this intensity before. Amazing job!"
- },
- "defeat": {
- "1": "Another victory for my intense training regimen! Well done!",
- "2": "You've got strength, but I trained harder. Great battle!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "Shadows fall... Are you ready to face your fears?",
- "2": "Let's see if you can handle the darkness that I command."
- },
- "victory": {
- "1": "You've dispelled the shadows... For now. Well done.",
- "2": "Your light pierced through my darkness. Great job."
- },
- "defeat": {
- "1": "The shadows have spoken... Your strength isn't enough.",
- "2": "Darkness triumphs... Maybe next time you'll see the light."
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "Storm's brewing! Let's see if you can weather this fight!",
- "2": "Get ready to face the eye of the storm!"
- },
- "victory": {
- "1": "You've bested the storm... Incredible job!",
- "2": "You rode the winds perfectly... Great battle!"
- },
- "defeat": {
- "1": "Another storm weathered, another victory claimed! Well fought!",
- "2": "You got caught in my storm! Better luck next time!"
- }
- },
- "alder": {
- "encounter": {
- "1": "Prepare yourself for a match against the strongest Trainer in Unova!"
- },
- "victory": {
- "1": "Well done! You certainly are an unmatched talent."
- },
- "defeat": {
- "1": "A fresh wind blows through my heart...\n$What an extraordinary effort!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "Through hard work, I become stronger and stronger!\n$I don't lose."
- },
- "victory": {
- "1": "I don't believe it...\n$What a fun and heart-pounding battle!"
- },
- "defeat": {
- "1": "Wowzers, what a battle!\n$Time for you to train even harder."
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}Hey, I was looking for you! I knew you were eager to get going but I expected at least a goodbye…$@c{smile_eclosed}So you're really pursuing your dream after all? I almost can't believe it.$@c{serious_smile_fists}Since we're here, how about a battle?\nAfter all, I want to make sure you're ready.$@c{serious_mopen_fists}Don't hold back, I want you to give me everything you've got!"
- },
- "victory": {
- "1": "@c{shock}Wow… You cleaned me out.\nAre you actually a beginner?$@c{smile}Maybe it was a bit of luck but…Who knows you might just be able to go all the way.$By the way, the professor asked me to give you these items. They look pretty cool.$@c{serious_smile_fists}Good luck out there!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}There you are! I've been looking everywhere for you!\n@c{angry_mopen}Did you forget to say goodbye to your best friend?\n$@c{smile_ehalf}You're going after your dream, huh?\nThat day is really today isn't it…\n$@c{smile}Anyway, I'll forgive you for forgetting me, but on one condition. @c{smile_wave_wink}You have to battle me!\n$@c{angry_mopen}Give it your all! Wouldn't want your adventure to be over before it started, right?"
- },
- "victory": {
- "1": "@c{shock}You just started and you're already this strong?!@d{96}\n@c{angry}You totally cheated, didn't you?\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile_eclosed}I lost fair and square… I have a feeling you're going to do really well out there.\n$@c{smile}By the way, the professor wanted me to give you some items. Hopefully they're helpful!\n$@c{smile_wave}Do your best like always! I believe in you!\n"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}Hey, you're here too?\n@c{smile_eclosed}Still a perfect record, huh…?\n$@c{serious_mopen_fists}I know it kind of looks like I followed you here, but that's mostly not true.\n$@c{serious_smile_fists}Honestly though, I've been itching for a rematch since you beat me back at home.\n$I've been doing a lot of my own training so I'll definitely put up a fight this time.\n$@c{serious_mopen_fists}Don't hold back, just like before!\nLet's go!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}Oh. I guess I was overconfident.\n$@c{smile}That's alright, though. I figured this might happen.\n@c{serious_mopen_fists}It just means I need to try harder for next time!\n\n$@c{smile}Oh, not that you really need the help, but I had an extra one of each of these lying around and figured you might want them.\n\n$@c{serious_smile_fists}Don't expect another one after this, though!\nI can't keep giving my opponent an advantage after all."
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}Oh, fancy meeting you here. Looks like you're still undefeated. @c{angry_mopen}Huh… Not bad!\n$@c{angry_mopen}I know what you're thinking, and no, I wasn't creeping on you. @c{smile_eclosed}I just happened to be in the area.\n$@c{smile_ehalf}I'm happy for you but I just want to let you know that it's OK to lose sometimes.\n$@c{smile}We learn from our mistakes, often more than we would if we kept succeeding.\n$@c{angry_mopen}In any case, I've been training hard for our rematch, so you'd better give it your all!"
- },
- "victory": {
- "1": "@c{neutral}I… wasn't supposed to lose that time…\n$@c{smile}Aw well. That just means I'll have to train even harder for next time!\n$@c{smile_wave}I also got you another two of these!\n@c{smile_wave_wink}No need to thank me~.\n$@c{angry_mopen}This is the last one, though! You won't be getting anymore freebies from me after this!"
- },
- "defeat": {
- "1": "It's OK to lose sometimes…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}Hey, look who it is! It's been a while.\n@c{neutral}You're… still undefeated? Huh.\n$@c{neutral_eclosed}Things have been kind of… strange.\nIt's not the same back home without you.\n$@c{serious}I know it's selfish, but I need to get this off my chest.\n@c{neutral_eclosed}I think you're in over your head here.\n$@c{serious}Never losing once is just unrealistic.\nWe need to lose sometimes in order to grow.\n$@c{neutral_eclosed}You've had a great run but there's still so much ahead, and it only gets harder. @c{neutral}Are you prepared for that?\n$@c{serious_mopen_fists}If so, prove it to me."
- },
- "victory": {
- "1": "@c{angry_mhalf}This is ridiculous… I've hardly stopped training…\nHow are we still so far apart?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}Long time no see! Still haven't lost, huh.\n@c{angry}You're starting to get on my nerves. @c{smile_wave_wink}Just kidding!\n$@c{smile_ehalf}But really, don't you miss home by now? Or… me?\nI… I mean, we've really missed you.\n$@c{smile_eclosed}I support you in your dream and everything, but the reality is you're going to lose sooner or later.\n$@c{smile}And when you do, I'll be there for you like always.\n@c{angry_mopen}Now, let me show you how strong I've become!"
- },
- "victory": {
- "1": "@c{shock}After all that… it wasn't enough…?\nYou'll never come back at this rate…"
- },
- "defeat": {
- "1": "You gave it your best, now let's go home."
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}Hey.\n$I won't mince words or pleasantries with you.\n@c{neutral_eclosed}I'm here to win, plain and simple.\n$@c{serious_mhalf_fists}I've learned to maximize my potential by putting all my time into training.\n$@c{smile}You get a lot of extra time when you cut out the unnecessary sleep and social interaction.\n$@c{serious_mopen_fists}None of that matters anymore, not until I win.\n$@c{neutral_eclosed}I've even reached the point where I don't lose anymore.\n@c{smile_eclosed}I suppose your philosophy wasn't so wrong after all.\n$@c{angry_mhalf}Losing is for the weak, and I'm not weak anymore.\n$@c{serious_mopen_fists}Prepare yourself."
- },
- "victory": {
- "1": "@c{neutral}What…@d{64} What are you?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}It's me! You didn't forget about me again… did you?\n$@c{smile}You should be proud of how far you made it. Congrats!\nBut it looks like it's the end of your journey.\n$@c{smile_eclosed}You've awoken something in me I never knew was there.\nIt seems like all I do now is train.\n$@c{smile_ehalf}I hardly even eat or sleep now, I just train my Pokémon all day, getting stronger every time.\n$@c{neutral}In fact, I… hardly recognize myself.\n$And now, I've finally reached peak performance.\nI don't think anyone could beat me now.\n$And you know what? It's all because of you.\n@c{smile_ehalf}I don't know whether to thank you or hate you.\n$@c{angry_mopen}Prepare yourself."
- },
- "victory": {
- "1": "@c{neutral}What…@d{64} What are you?"
- },
- "defeat": {
- "1": "$@c{smile}You should be proud of how far you made it."
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}We meet again.\n$@c{neutral}I've had some time to reflect on all this.\nThere's a reason this all seems so strange.\n$@c{neutral_eclosed}Your dream, my drive to beat you…\nIt's all a part of something greater.\n$@c{serious}This isn't about me, or about you… This is about the world, @c{serious_mhalf_fists}and it's my purpose to push you to your limits.\n$@c{neutral_eclosed}Whether I've fulfilled that purpose I can't say, but I've done everything in my power.\n$@c{neutral}This place we ended up in is terrifying… Yet somehow I feel unphased, like I've been here before.\n$@c{serious_mhalf_fists}You feel the same, don't you?\n$@c{serious}…and it's like something here is speaking to me.\nThis is all the world's known for a long time now.\n$Those times we cherished together that seem so recent are nothing but a distant memory.\n$@c{neutral_eclosed}Who can say whether they were ever even real in the first place.\n$@c{serious_mopen_fists}You need to keep pushing, because if you don't, it will never end. You're the only one who can do this.\n$@c{serious_smile_fists}I hardly know what any of this means, I just know that it's true.\n$@c{serious_mopen_fists}If you can't defeat me here and now, you won't stand a chance."
- },
- "victory": {
- "1": "@c{smile_eclosed}It looks like my work is done here.\n$I want you to promise me one thing.\n@c{smile}After you heal the world, please come home."
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}So it's just us again.\n$@c{smile_eclosed}You know, I keep going around and around in my head…\n$@c{smile_ehalf}There's something to all this, why everything seems so strange now…\n$@c{smile}You have your dream, and I have this ambition in me…\n$I just can't help but feel there's a greater purpose to all this, to what we're doing, you and I.\n$@c{smile_eclosed}I think I'm supposed to push you… to your limits.\n$@c{smile_ehalf}I'm not sure if I've been doing a good job at that, but I've tried my best up to now.\n$It's something about this strange and dreadful place… Everything seems so clear…\n$This… is all the world's known for a long time now.\n$@c{smile_eclosed}It's like I can barely remember the memories we cherished together.\n$@c{smile_ehalf}Were they even real? They seem so far away now…\n$@c{angry_mopen}You need to keep pushing, because if you don't, it will never end. You're the only one who can do this.\n$@c{smile_ehalf}I… don't know what all this means… but I feel it's true.\n$@c{neutral}If you can't defeat me here and now, you won't stand a chance."
- },
- "victory": {
- "1": "@c{smile_ehalf}I… I think I fulfilled my purpose…\n$@c{smile_eclosed}Promise me… After you heal the world… Please… come home safe.\n$@c{smile_ehalf}…Thank you."
- }
- }
-}
diff --git a/src/locales/en/dialogue-final-boss-female.json b/src/locales/en/dialogue-final-boss-female.json
deleted file mode 100644
index 2e03b6e15e3..00000000000
--- a/src/locales/en/dialogue-final-boss-female.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
- "firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.",
- "secondStageWin": "…Magnificent."
-}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-final-boss-male.json b/src/locales/en/dialogue-final-boss-male.json
deleted file mode 100644
index 2e03b6e15e3..00000000000
--- a/src/locales/en/dialogue-final-boss-male.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
- "firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.",
- "secondStageWin": "…Magnificent."
-}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-final-boss.json b/src/locales/en/dialogue-final-boss.json
new file mode 100644
index 00000000000..6f99aae3e0c
--- /dev/null
+++ b/src/locales/en/dialogue-final-boss.json
@@ -0,0 +1,10 @@
+{
+ "encounter": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
+ "encounter_female": "It appears the time has finally come once again.\nYou know why you have come here, do you not?\n$You were drawn here, because you have been here before.\nCountless times.\n$Though, perhaps it can be counted.\nTo be precise, this is in fact your {{cycleCount}} cycle.\n$Each cycle your mind reverts to its former state.\nEven so, somehow, remnants of your former selves remain.\n$Until now you have yet to succeed, but I sense a different presence in you this time.\n\n$You are the only one here, though it is as if there is… another.\n$Will you finally prove a formidable challenge to me?\nThe challenge I have longed after for millennia?\n$We begin.",
+ "firstStageWin": "I see. The presence I felt was indeed real.\nIt appears I no longer need to hold back.\n$Do not disappoint me.",
+ "secondStageWin": "…Magnificent.",
+ "key_ordinal_one": "st",
+ "key_ordinal_two": "nd",
+ "key_ordinal_few": "rd",
+ "key_ordinal_other": "th"
+}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-misc-female.json b/src/locales/en/dialogue-misc-female.json
deleted file mode 100644
index f5c63a85410..00000000000
--- a/src/locales/en/dialogue-misc-female.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
- "ending_female": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
- "ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.",
- "ending_name": "Devs"
-}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-misc-male.json b/src/locales/en/dialogue-misc-male.json
deleted file mode 100644
index f5c63a85410..00000000000
--- a/src/locales/en/dialogue-misc-male.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
- "ending_female": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
- "ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.",
- "ending_name": "Devs"
-}
\ No newline at end of file
diff --git a/src/locales/en/dialogue-misc.json b/src/locales/en/dialogue-misc.json
new file mode 100644
index 00000000000..2f333b5f383
--- /dev/null
+++ b/src/locales/en/dialogue-misc.json
@@ -0,0 +1,6 @@
+{
+ "ending": "@c{shock}You're back?@d{32} Does that mean…@d{96} you won?!\n@c{smile_ehalf}I should have known you had it in you.\n$@c{smile_eclosed}Of course… I always had that feeling.\n@c{smile}It's over now, right? You ended the loop.\n$@c{smile_ehalf}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$I'll be the only one to remember what you did.\n@c{angry_mopen}I'll try not to forget!\n$@c{smile_wave_wink}Just kidding!@d{64} @c{smile}I'd never forget.@d{32}\nYour legend will live on in our hearts.\n$@c{smile_wave}Anyway,@d{64} it's getting late…@d{96} I think?\nIt's hard to tell in this place.\n$Let's go home. @c{smile_wave_wink}Maybe tomorrow, we can have another battle, for old time's sake?",
+ "ending_female": "@c{smile}Oh? You won?@d{96} @c{smile_eclosed}I guess I should've known.\nBut, you're back now.\n$@c{smile}It's over.@d{64} You ended the loop.\n$@c{serious_smile_fists}You fulfilled your dream too, didn't you?\nYou didn't lose even once.\n$@c{neutral}I'm the only one who'll remember what you did.@d{96}\nI guess that's okay, isn't it?\n$@c{serious_smile_fists}Your legend will always live on in our hearts.\n$@c{smile_eclosed}Anyway, I've had about enough of this place, haven't you? Let's head home.\n$@c{serious_smile_fists}Maybe when we get back, we can have another battle?\nIf you're up to it.",
+ "ending_endless": "Congratulations on reaching the current end!\nMore content is coming soon.",
+ "ending_name": "Devs"
+}
diff --git a/src/locales/en/dialogue-male.json b/src/locales/en/dialogue.json
similarity index 85%
rename from src/locales/en/dialogue-male.json
rename to src/locales/en/dialogue.json
index ed4082f411e..5565d2258c2 100644
--- a/src/locales/en/dialogue-male.json
+++ b/src/locales/en/dialogue.json
@@ -3,24 +3,31 @@
"encounter": {
"1": "Hey, wanna battle?",
"2": "Are you a new trainer too?",
+ "2_female": "Are you a new trainer too?",
"3": "Hey, I haven't seen you before. Let's battle!",
"4": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
+ "4_female": "I just lost, so I'm trying to find more Pokémon.\nWait! You look weak! Come on, let's battle!",
"5": "Have we met or not? I don't really remember. Well, I guess it's nice to meet you anyway!",
"6": "All right! Let's go!",
"7": "All right! Here I come! I'll show you my power!",
"8": "Haw haw haw... I'll show you how hawesome my Pokémon are!",
"9": "No need to waste time saying hello. Bring it on whenever you're ready!",
+ "9_female": "No need to waste time saying hello. Bring it on whenever you're ready!",
"10": "Don't let your guard down, or you may be crying when a kid beats you.",
"11": "I've raised my Pokémon with great care. You're not allowed to hurt them!",
"12": "Glad you made it! It won't be an easy job from here.",
- "13": "The battles continue forever! Welcome to the world with no end!"
+ "12_female": "Glad you made it! It won't be an easy job from here.",
+ "13": "The battles continue forever! Welcome to the world with no end!",
+ "13_female": "The battles continue forever! Welcome to the world with no end!"
},
"victory": {
"1": "Wow! You're strong!",
+ "1_female": "Wow! You're strong!",
"2": "I didn't stand a chance, huh?",
"3": "I'll find you again when I'm older and beat you!",
"4": "Ugh. I don't have any more Pokémon.",
"5": "No way… NO WAY! How could I lose again…",
+ "5_female": "No way… NO WAY! How could I lose again…",
"6": "No! I lost!",
"7": "Whoa! You are incredible! I'm amazed and surprised!",
"8": "Could it be… How… My Pokémon and I are the strongest, though…",
@@ -35,10 +42,12 @@
"encounter": {
"1": "Let's have a battle, shall we?",
"2": "You look like a new trainer. Let's have a battle!",
+ "2_female": "You look like a new trainer. Let's have a battle!",
"3": "I don't recognize you. How about a battle?",
"4": "Let's have a fun Pokémon battle!",
"5": "I'll show you the ropes of how to really use Pokémon!",
"6": "A serious battle starts from a serious beginning! Are you sure you're ready?",
+ "6_female": "A serious battle starts from a serious beginning! Are you sure you're ready?",
"7": "You're only young once. And you only get one shot at a given battle. Soon, you'll be nothing but a memory.",
"8": "You'd better go easy on me, OK? Though I'll be seriously fighting!",
"9": "School is boring. I've got nothing to do. Yawn. I'm only battling to kill the time."
@@ -46,12 +55,15 @@
"victory": {
"1": "That was impressive! I've got a lot to learn.",
"2": "I didn't think you'd beat me that bad…",
+ "2_female": "I didn't think you'd beat me that bad…",
"3": "I hope we get to have a rematch some day.",
"4": "That was pretty amazingly fun! You've totally exhausted me…",
"5": "You actually taught me a lesson! You're pretty amazing!",
"6": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
+ "6_female": "Seriously, I lost. That is, like, seriously depressing, but you were seriously cool.",
"7": "I don't need memories like this. Deleting memory…",
"8": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
+ "8_female": "Hey! I told you to go easy on me! Still, you're pretty cool when you're serious.",
"9": "I'm actually getting tired of battling… There's gotta be something new to do…"
}
},
@@ -142,6 +154,7 @@
"ace_trainer": {
"encounter": {
"1": "You seem quite confident.",
+ "1_female": "You seem quite confident.",
"2": "Your Pokémon… Show them to me…",
"3": "Because I'm an Ace Trainer, people think I'm strong.",
"4": "Are you aware of what it takes to be an Ace Trainer?"
@@ -150,7 +163,9 @@
"1": "Yes… You have good Pokémon…",
"2": "What?! But I'm a battling genius!",
"3": "Of course, you are the main character!",
- "4": "OK! OK! You could be an Ace Trainer!"
+ "3_female": "Of course, you are the main character!",
+ "4": "OK! OK! You could be an Ace Trainer!",
+ "4_female": "OK! OK! You could be an Ace Trainer!"
},
"defeat": {
"1": "I am devoting my body and soul to Pokémon battles!",
@@ -171,7 +186,8 @@
"encounter": {
"1": "Get ready, because when we team up, it's double the trouble!",
"2": "Two hearts, one strategy – let's see if you can keep up with our twin power!",
- "3": "Hope you're ready for double trouble, because we're about to bring the heat!"
+ "3": "Hope you're ready for double trouble, because we're about to bring the heat!",
+ "3_female": "Hope you're ready for double trouble, because we're about to bring the heat!"
},
"victory": {
"1": "We may have lost this round, but our bond remains unbreakable!",
@@ -199,7 +215,8 @@
"black_belt": {
"encounter": {
"1": "I praise your courage in challenging me! For I am the one with the strongest kick!",
- "2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?"
+ "2": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?",
+ "2_female": "Oh, I see. Would you like to be cut to pieces? Or do you prefer the role of punching bag?"
},
"victory": {
"1": "Oh. The Pokémon did the fighting. My strong kick didn't help a bit.",
@@ -310,7 +327,8 @@
},
"defeat": {
"1": "New age simply refers to twentieth century classical composers, right?",
- "2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself."
+ "2": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself.",
+ "2_female": "Don't get hung up on sadness or frustration. You can use your grudges to motivate yourself."
}
},
"psychic": {
@@ -341,7 +359,8 @@
},
"baker": {
"encounter": {
- "1": "Hope you're ready to taste defeat!"
+ "1": "Hope you're ready to taste defeat!",
+ "1_female": "Hope you're ready to taste defeat!"
},
"victory": {
"1": "I'll bake a comeback."
@@ -371,7 +390,8 @@
"encounter": {
"1": "Matey, you're walking the plank if you lose!",
"2": "Come on then! My sailor's pride is at stake!",
- "3": "Ahoy there! Are you seasick?"
+ "3": "Ahoy there! Are you seasick?",
+ "3_female": "Ahoy there! Are you seasick?"
},
"victory": {
"1": "Argh! Beaten by a kid!",
@@ -393,12 +413,13 @@
},
"ariana": {
"encounter": {
- "1": "Hold it right there! We can't someone on the loose.\n$It's harmful to Team Rocket's pride, you see.",
+ "1": "Hold it right there!\nWe can't have someone on the loose.\n$It's harmful to Team Rocket's pride, you see.",
"2": "I don't know or care if what I'm doing is right or wrong...\n$I just put my faith in Giovanni and do as I am told",
"3": "Your trip ends here. I'm going to take you down!"
},
"victory": {
"1": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
+ "1_female": "Tch, you really are strong. It's too bad.\n$If you were to join Team Rocket, you could become an Executive.",
"2": "I... I'm shattered...",
"3": "Aaaieeeee! This can't be happening! I fought hard, but I still lost…"
}
@@ -434,52 +455,57 @@
"3": "I'm going to give you a little taste of pain! Resign yourself to it!"
},
"victory": {
- "1": "Hehehe! You might have beaten me, but you don't stand a chance against the Boss!\n$If you get lost now, you won't have to face a sound whipping!",
+ "1": "Hehehe! You might have beaten me, but you don't stand a chance against the boss!\n$If you get lost now, you won't have to face a sound whipping!",
"2": "Hehehe... So, I lost, too...",
- "3": "Ahya! How could this be? For an Admin like me to lose to some random trainer..."
+ "3": "Ahya! How could this be? For an Admin like me to lose to some random trainer...",
+ "3_female": "Ahya! How could this be? For an Admin like me to lose to some random trainer..."
}
},
"courtney": {
"encounter": {
- "1": "The thing...The thing that you hold...That is what... That's what we of Team Magma seek...",
- "2": "... Well then...Deleting...",
- "3": "...Ha. ...Analyzing... ...Hah♪"
+ "1": "Don't. Get. In. My. Way.",
+ "2": "You... ...I want to...analyze. Ahahaha",
+ "3": "... Well then...Deleting..."
},
"victory": {
- "1": "... ...Change...the world.",
+ "1": "Hah hah... Uhn...hah hah...",
"2": "As anticipated. Unanticipated. You. Target lock...completed.\n$Commencing...experiment. You. Forever. Aha... ♪",
- "3": "...Again? That's unanticipated. ...I knew it. You...are interesting! ...Haha. ♪"
+ "3": "That's unanticipated. ...I knew it. You...are interesting! ...Haha. ♪"
}
},
"shelly": {
"encounter": {
"1": "Ahahahaha! You're going to meddle in Team Aqua's affairs?\n$You're either absolutely fearless, simply ignorant, or both!\n$You're so cute, you're disgusting! I'll put you down",
"2": "What's this? Who's this spoiled brat?",
- "3": "Cool your jets. Be patient. I'll crush you shortly."
+ "3": "Cool your jets. Be patient. I'll crush you shortly.",
+ "3_female": "Cool your jets. Be patient. I'll crush you shortly."
},
"victory": {
"1": "Ahahahaha! We got meddled with unexpectedly! We're out of options.\n$We'll have to pull out. But this isn't the last you'll see of Team Aqua!\n$We have other plans! Don't you forget it!",
"2": "Ahhh?! Did I go too easy on you?!",
- "3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie."
+ "3": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie.",
+ "3_female": "Uh. Are you telling me you've upped your game even more during the fight?\n$You're a brat with a bright future… My Pokémon and I don't have any strength left to fight…\n$Go on… Go and be destroyed by Archie."
}
},
"matt": {
"encounter": {
- "1": "Hoohahaha! What, you got a screw loose or something? Look at you, little Makuhita person!",
- "2": "Oho! You! You're that funny kid!",
- "3": "What are you doing here? Did you follow us?"
+ "1": "All right then, until the boss has time for you, I'll be your opponent!",
+ "2": "Hooah! Full on! I'm burning up! Well! Welll! Wellllll! Let's battle it out until we've got nothing left!",
+ "3": "Hoo hah! I'm gonna smash you up!"
},
"victory": {
- "1": "All right then, until the Boss has time for you, I'll be your opponent!",
+ "1": "Muwuhahaha! That battle was fun even though I lost!",
"2": "I can feel it! I can feel it, all right! The strength coming offa you!\n$More! I still want more! But looks like we're outta time...",
- "3": "That was fun! I knew you'd show me a good time! I look forward to facing you again someday!"
+ "3": "Oho! That's a loss I can be proud of!",
+ "3_female": "Oho! That's a loss I can be proud of!"
}
},
"mars": {
"encounter": {
"1": "I'm Mars, one of Team Galactic's top Commanders.",
"2": "Team Galactic's vision for the future is unwavering. Opposition will be crushed without mercy!",
- "3": "Feeling nervous? You should be!"
+ "3": "Feeling nervous? You should be!",
+ "3_female": "Feeling nervous? You should be!"
},
"victory": {
"1": "This can't be happening! How did I lose?!",
@@ -514,36 +540,44 @@
"zinzolin": {
"encounter": {
"1": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
- "2": "Oh, for crying out loud... I didn't expect to have to battle in this freezing cold!",
- "3": "You're an impressive Trainer to have made it this far. But it ends here."
+ "1_female": "You could become a threat to Team Plasma, so we will eliminate you here and now!",
+ "2": "You don't have the sense to know when to quit, it seems. It's an act of mercy on my part to bring an end to this now!",
+ "3": "You're an impressive Trainer to have made it this far. But it ends here.",
+ "3_female": "You're an impressive Trainer to have made it this far. But it ends here."
},
"victory": {
"1": "Ghetsis... I have failed you...",
- "2": "It's bitter cold. I'm shivering. I'm suffering. Yet, I still stand victorious.",
- "3": "Hmph. You're a smarter Trainer than I expected, but not smart enough."
+ "2": "It's bitter cold. I'm shivering. I'm suffering. Yet, we will stand victorious.",
+ "3": "Hmph. You're a smarter Trainer than I expected, but not smart enough.",
+ "3_female": "Hmph. You're a smarter Trainer than I expected, but not smart enough."
}
},
"rood": {
"encounter": {
"1": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
- "2": "Oh, this icy wind... I never thought I'd have to fight here!",
- "3": "You are a remarkable Trainer to have made it this far. But this is where it ends."
+ "1_female": "You are a threat to Team Plasma. We cannot let you walk away from here and now!",
+ "2": "It seems you don't know when to give up. I'll make sure no one interferes with our plans!",
+ "3": "You are a remarkable Trainer to have made it this far. But this is where it ends.",
+ "3_female": "You are a remarkable Trainer to have made it this far. But this is where it ends."
},
"victory": {
"1": "Ghetsis... I have failed my mission...",
- "2": "The cold is piercing. I'm shivering. I'm suffering. Yet, I have triumphed.",
+ "2": "The cold is piercing. I'm shivering. I'm suffering. Yet, we will stand triumphant.",
"3": "Hm. You are a talented Trainer, but unfortunately not talented enough."
}
},
"xerosic": {
"encounter": {
"1": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
+ "1_female": "Ah ha ha! It would be my pleasure. Come on, little Trainer! Let's see what you've got!",
"2": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
+ "2_female": "Hmm... You're more powerful than you look. I wonder how much energy there is inside you.",
"3": "I've been waiting for you! I need to do a little research on you! Come, let us begin!"
},
"victory": {
"1": "Ah, you're quite strong. Oh yes—very strong, indeed.",
"2": "Ding-ding-ding! You did it! To the victor go the spoils!",
+ "2_female": "Ding-ding-ding! You did it! To the victor go the spoils!",
"3": "Wonderful! Amazing! You have tremendous skill and bravery!"
}
},
@@ -551,6 +585,7 @@
"encounter": {
"1": "I am Bryony, and it would be my pleasure to battle you. Show me what you've got.",
"2": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
+ "2_female": "Impressive... You're more powerful than you appear. Let's see the true extent of your energy.",
"3": "I've anticipated your arrival. It's time for a little test. Shall we begin?"
},
"victory": {
@@ -563,9 +598,11 @@
"encounter": {
"1": "Prepare for trouble!",
"2": "We're pulling a big job here! Get lost, kid!",
+ "2_female": "We're pulling a big job here! Get lost, kid!",
"3": "Hand over your Pokémon, or face the wrath of Team Rocket!",
"4": "You're about to experience the true terror of Team Rocket!",
- "5": "Hey, kid! Me am a Team Rocket member kind of guy!"
+ "5": "Hey, kid! Me am a Team Rocket member kind of guy!",
+ "5_female": "Hey, kid! Me am a Team Rocket member kind of guy!"
},
"victory": {
"1": "Team Rocket blasting off again!",
@@ -587,6 +624,7 @@
"1": "Huh? I lost?!",
"2": "I can't believe I lost! I even skipped lunch for this",
"3": "No way! You're just a kid!",
+ "3_female": "No way! You're just a kid!",
"4": "Urrrgh... I should've ducked into our hideout right away...",
"5": "You beat me... Do you think the boss will dock my pay for this?"
}
@@ -613,7 +651,8 @@
"2": "Witness the power of our technology and the future we envision!",
"3": "In the name of Team Galactic, I'll eliminate anyone who stands in our way!",
"4": "Get ready to lose!",
- "5": "Hope you're ready for a cosmic beatdown!"
+ "5": "Hope you're ready for a cosmic beatdown!",
+ "5_female": "Hope you're ready for a cosmic beatdown!"
},
"victory": {
"1": "Shut down...",
@@ -643,6 +682,7 @@
"encounter": {
"1": "Your Pokémon are no match for the elegance of Team Flare.",
"2": "Hope you brought your sunglasses, because things are about to get bright!",
+ "2_female": "Hope you brought your sunglasses, because things are about to get bright!",
"3": "Team Flare will cleanse the world of imperfection!",
"4": "Prepare to face the brilliance of Team Flare!",
"5": "Fashion is most important to us!"
@@ -659,6 +699,7 @@
"encounter": {
"1": "I'll fight you with all I have to wipe you out!",
"2": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
+ "2_female": "I don't care if you're a kid or what. I'll send you flying if you threaten us!",
"3": "I was told to turn away Trainers, whomever they might be!",
"4": "I'll show you the power of Aether Paradise!",
"5": "Now that you've learned of the darkness at the heart of Aether Paradise, we'll need you to conveniently disappear!"
@@ -675,11 +716,13 @@
"encounter": {
"1": "I, Branch Chief Faba, shall show you the harshness of the real world!",
"2": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
+ "2_female": "The man who is called Aether Paradise's last line of defense is to battle a mere child?",
"3": "I, Faba, am the Aether Branch Chief. The only one in the world, I'm irreplaceable."
},
"victory": {
"1": "Aiyee!",
"2": "H-h-how can this be?! How could this child...",
+ "2_female": "H-h-how can this be?! How could this child...",
"3": "This is why... This is why I can't bring myself to like children."
}
},
@@ -687,9 +730,12 @@
"encounter": {
"1": "We're not bad-we're just hard!",
"2": "You want some? That's how we say hello! Nice knowing you, punks!",
+ "2_female": "You want some? That's how we say hello! Nice knowing you, punks!",
"3": "We're just a bunch of guys and gals with a great interest in other people's Pokémon!",
"4": "Why you trying to act hard when we're already hard as bones out here, homie?",
- "5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
+ "4_female": "Why you trying to act hard when we're already hard as bones out here, homie?",
+ "5": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!",
+ "5_female": "Team Skull represent! We can't pay the rent! Had a lot of fun, but our youth was misspent!"
},
"victory": {
"1": "Huh? Is it over already?",
@@ -702,11 +748,13 @@
"plumeria": {
"encounter": {
"1": " ...Hmph. You don't look like anything special to me.",
- "2": "It takes these dumb Grunts way too long to deal with you kids..",
+ "1_female": " ...Hmph. You don't look like anything special to me.",
+ "2": "It takes these dumb Grunts way too long to deal with you kids...",
"3": "Mess with anyone in Team Skull, and I'll show you how serious I can get."
},
"victory": {
"1": "Hmmph! You're pretty strong. I'll give you that.",
+ "1_female": "Hmmph! You're pretty strong. I'll give you that.",
"2": "Hmmph. Guess you are pretty tough. Now I understand why my Grunts waste so much time battling kids.",
"3": "Hmmph! I guess I just have to hold that loss."
}
@@ -715,6 +763,7 @@
"encounter": {
"1": "It looks like this is the end of the line for you!",
"2": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
+ "2_female": "You are a trainer aren't you? I'm afraid that doesn't give you the right to interfere in our work.",
"3": "I'm from Macro Cosmos Insurance! Do you have a life insurance policy?"
},
"victory": {
@@ -732,6 +781,7 @@
"victory": {
"1": "*sigh* I wasn't able to win... Oleana...you really are a hopeless woman.",
"2": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
+ "2_female": "Arghhh! This is inexcusable... What was I thinking... Any trainer who's made it this far would be no pushover..",
"3": "*sigh* I am one tired Oleana..."
}
},
@@ -743,7 +793,8 @@
"1": "WHAT! This cannot be!"
},
"defeat": {
- "1": "Mark my words. Not being able to measure your own strength shows that you are still a child."
+ "1": "Mark my words. Not being able to measure your own strength shows that you are still a child.",
+ "1_female": "Mark my words. Not being able to measure your own strength shows that you are still a child."
}
},
"rocket_boss_giovanni_2": {
@@ -803,7 +854,8 @@
},
"galactic_boss_cyrus_1": {
"encounter": {
- "1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!"
+ "1": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!",
+ "1_female": "You were compelled to come here by such vacuous sentimentality.\n$I will make you regret paying heed to your heart!"
},
"victory": {
"1": "Interesting. And quite curious."
@@ -953,6 +1005,7 @@
"misty": {
"encounter": {
"1": "My policy is an all out offensive with Water-type Pokémon!",
+ "1_female": "My policy is an all out offensive with Water-type Pokémon!",
"2": "Hiya, I'll show you the strength of my aquatic Pokémon!",
"3": "My dream was to go on a journey and battle powerful trainers…\nWill you be a sufficient challenge?"
},
@@ -970,12 +1023,14 @@
"lt_surge": {
"encounter": {
"1": "My Electric Pokémon saved me during the war! I'll show you how!",
+ "1_female": "My Electric Pokémon saved me during the war! I'll show you how!",
"2": "Ten-hut! I'll shock you into surrender!",
"3": "I'll zap you just like I do to all my enemies in battle!"
},
"victory": {
"1": "Whoa! Your team's the real deal, kid!",
"2": "Aaargh, you're strong! Even my electric tricks lost against you.",
+ "2_female": "Aaargh, you're strong! Even my electric tricks lost against you.",
"3": "That was an absolutely shocking loss!"
},
"defeat": {
@@ -1000,6 +1055,7 @@
"defeat": {
"1": "I was afraid I would doze off…",
"2": "Oh my, it seems my Grass Pokémon overwhelmed you.",
+ "2_female": "Oh my, it seems my Grass Pokémon overwhelmed you.",
"3": "That battle was such a soothing experience.",
"4": "Oh… Is that all?"
}
@@ -1059,7 +1115,8 @@
"encounter": {
"1": "I, the leader of Team Rocket, will make you feel a world of pain!",
"2": "My training here will be vital before I am to face my old associates again.",
- "3": "I do not think you are prepared for the level of failure you are about to experience!"
+ "3": "I do not think you are prepared for the level of failure you are about to experience!",
+ "3_female": "I do not think you are prepared for the level of failure you are about to experience!"
},
"victory": {
"1": "WHAT! Me, lose?! There is nothing I wish to say to you!",
@@ -1092,6 +1149,7 @@
"brawly": {
"encounter": {
"1": "Oh man, a challenger!\nLet's see what you can do!",
+ "1_female": "Oh man, a challenger!\nLet's see what you can do!",
"2": "You seem like a big splash.\nLet's battle!",
"3": "Time to create a storm!\nLet's go!"
},
@@ -1119,6 +1177,7 @@
},
"defeat": {
"1": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
+ "1_female": "Recharge your batteries and challenge me again sometime!\nWahahahaha!",
"2": "I hope you found our battle electrifying!\nWahahahaha!",
"3": "Aren't you shocked I won?\nWahahahaha!"
}
@@ -1165,6 +1224,7 @@
},
"victory": {
"1": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
+ "1_female": "You're the first Trainer I've seen with more grace than I.\nExcellently played.",
"2": "Oh, my Flying Pokémon have plummeted!\nVery well.",
"3": "Though I may have fallen, my Pokémon will continue to fly!"
},
@@ -1177,6 +1237,7 @@
"tate": {
"encounter": {
"1": "Hehehe…\nWere you surprised to see me without my sister?",
+ "1_female": "Hehehe…\nWere you surprised to see me without my sister?",
"2": "I can see what you're thinking…\nYou want to battle!",
"3": "How can you defeat someone…\nWho knows your every move?"
},
@@ -1194,6 +1255,7 @@
"liza": {
"encounter": {
"1": "Fufufu…\nWere you surprised to see me without my brother?",
+ "1_female": "Fufufu…\nWere you surprised to see me without my brother?",
"2": "I can determine what you desire…\nYou want to battle, don't you?",
"3": "How can you defeat someone…\nWho's one with their Pokémon?"
},
@@ -1265,8 +1327,10 @@
"nessa": {
"encounter": {
"1": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
+ "1_female": "No matter what kind of plan your refined mind may be plotting, my partner and I will be sure to sink it.",
"2": "I'm not here to chat. I'm here to win!",
- "3": "This is a little gift from my Pokémon… I hope you can take it!"
+ "3": "This is a little gift from my Pokémon… I hope you can take it!",
+ "3_female": "This is a little gift from my Pokémon… I hope you can take it!"
},
"victory": {
"1": "You and your Pokémon are just too much…",
@@ -1287,6 +1351,7 @@
},
"victory": {
"1": "You… You're pretty good, huh?",
+ "1_female": "You… You're pretty good, huh?",
"2": "If you find Gordie around, be sure to give him a right trashing, would you?",
"3": "I think you took breaking the ice a little too literally…"
},
@@ -1300,10 +1365,12 @@
"encounter": {
"1": "You look strong! Shoots! Let's start!",
"2": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
+ "2_female": "I'm strong like the ocean's wide. You're gonna get swept away, fo' sho'.",
"3": "Oh ho, so I'm facing you! That's off the wall."
},
"victory": {
"1": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
+ "1_female": "You totally rocked that! You're raising some wicked Pokémon. You got this Trainer thing down!",
"2": "You don't just look strong, you're strong fo' reals! Eh, I was swept away, too!",
"3": "You're strong as a gnarly wave!"
},
@@ -1316,6 +1383,7 @@
"shauntal": {
"encounter": {
"1": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
+ "1_female": "Excuse me. You're a challenger, right?\nI'm the Elite Four's Ghost-type Pokémon user, Shauntal, and I shall be your opponent.",
"2": "I absolutely love writing about Trainers who come here and the Pokémon they train.\nCould I use you and your Pokémon as a subject?",
"3": "Every person who works with Pokémon has a story to tell.\nWhat story is about to be told?"
},
@@ -1333,6 +1401,7 @@
"marshal": {
"encounter": {
"1": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
+ "1_female": "My mentor, Alder, sees your potential as a Trainer and is taking an interest in you.\nIt is my intention to test you--to take you to the limits of your strength. Kiai!",
"2": "Victory, decisive victory, is my intention! Challenger, here I come!",
"3": "In myself, I seek to develop the strength of a fighter and shatter any weakness in myself!\nPrevailing with the force of my convictions!"
},
@@ -1351,7 +1420,8 @@
"encounter": {
"1": "You remind me of an old friend. That makes me excited about this Pokémon battle!",
"2": "Pokémon battles have no meaning if you don't think why you battle.\n$Or better said, it makes battling together with Pokémon meaningless.",
- "3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you."
+ "3": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you.",
+ "3_female": "My name's Cheren! I'm a Gym Leader and a teacher! Pleasure to meet you."
},
"victory": {
"1": "Thank you! I saw what was missing in me.",
@@ -1367,55 +1437,73 @@
"chili": {
"encounter": {
"1": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
+ "1_female": "Yeeeeooow! Time to play with FIRE!! I'm the strongest of us brothers!",
"2": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
- "3": "I'm going to show you what me and my blazing Fire types can do!"
+ "2_female": "Ta-da! The Fire-type scorcher Chili--that's me--will be your opponent!",
+ "3": "I'm going to show you what me and my blazing Fire types can do!",
+ "3_female": "I'm going to show you what me and my blazing Fire types can do!"
},
"victory": {
"1": "You got me. I am… burned… out…",
+ "1_female": "You got me. I am… burned… out…",
"2": "Whoa ho! You're on fire!",
+ "2_female": "Whoa ho! You're on fire!",
"3": "Augh! You got me!"
},
"defeat": {
"1": "I'm on fire! Play with me, and you'll get burned!",
+ "1_female": "I'm on fire! Play with me, and you'll get burned!",
"2": "When you play with fire, you get burned!",
- "3": "I mean, c'mon, your opponent was me! You didn't have a chance!"
+ "3": "I mean, c'mon, your opponent was me! You didn't have a chance!",
+ "3_female": "I mean, c'mon, your opponent was me! You didn't have a chance!"
}
},
"cilan": {
"encounter": {
"1": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
+ "1_female": "Nothing personal... No hard feelings... Me and my Grass-type Pokémon will...\n$Um... We're gonna battle come what may.",
"2": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
- "3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon."
+ "2_female": "So, um, if you're OK with me, I'll, um, put everything I've got into being, er, you know, your opponent.",
+ "3": "OK… So, um, I'm Cilan, I like Grass-type Pokémon.",
+ "3_female": "OK… So, um, I'm Cilan, I like Grass-type Pokémon."
},
"victory": {
"1": "Er… Is it over now?",
+ "1_female": "Er… Is it over now?",
"2": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
+ "2_female": "…What a surprise. You are very strong, aren't you? \n$I guess my brothers wouldn't have been able to defeat you either…",
"3": "…Huh. Looks like my timing was, um, off?"
},
"defeat": {
"1": "Huh? Did I win?",
+ "1_female": "Huh? Did I win?",
"2": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
- "3": "It…it was quite a thrilling experience…"
+ "2_female": "I guess… \n$I suppose I won, because I've been competing with my brothers Chili and Cress, and we all were able to get tougher.",
+ "3": "It…it was quite a thrilling experience…",
+ "3_female": "It…it was quite a thrilling experience…"
}
},
"roark": {
"encounter": {
"1": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
+ "1_female": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!",
"2": "Here goes! These are my rocking Pokémon, my pride and joy!",
"3": "Rock-type Pokémon are simply the best!",
- "4": "I need to see your potential as a Trainer. And, I'll need to see the toughness of the Pokémon that battle with you!"
+ "4": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?",
+ "4_female": "Every day, I toughened up my Pokémon by digging up Fossils nonstop.\n$Could I show you how tough I made them in a battle?"
},
"victory": {
"1": "W-what? That can't be! My buffed-up Pokémon!",
"2": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
+ "2_female": "…We lost control there. Next time I'd like to challenge you to a Fossil-digging race underground.",
"3": "With skill like yours, it's natural for you to win.",
- "4": "Wh-what?! It can't be! Even that wasn't enough?",
- "5": "I blew it."
+ "4": "Wh-what?! It can't be! Even that wasn't enough?"
},
"defeat": {
"1": "See? I'm proud of my rocking battle style!",
"2": "Thanks! The battle gave me confidence that I may be able to beat my dad!",
- "3": "I feel like I just smashed through a really stubborn boulder!"
+ "3": "See? These are my rocking Pokémon, my pride and joy!",
+ "4": "I knew I would win!"
}
},
"morty": {
@@ -1430,6 +1518,7 @@
"victory": {
"1": "I'm not good enough yet…",
"2": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
+ "2_female": "I see… Your journey has taken you to far-away places and you have witnessed much more than I.\n$I envy you for that…",
"3": "How is this possible…",
"4": "I don't think our potentials are so different.\n$But you seem to have something more than that… So be it.",
"5": "Guess I need more training.",
@@ -1488,12 +1577,14 @@
"1": "Guess I should've expected that!"
},
"defeat": {
- "1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?"
+ "1": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?",
+ "1_female": "Heh heh! Don't mind me, just scooping up a W over here. I get it if you're upset, but don't go full Kieran on me, OK?"
}
},
"ramos": {
"encounter": {
- "1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?"
+ "1": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?",
+ "1_female": "Did yeh enjoy the garden playground I made with all these sturdy plants o' mine?\n$Their strength is a sign o' my strength as a gardener and a Gym Leader! Yeh sure yer up to facing all that?"
},
"victory": {
"1": "Yeh believe in yer Pokémon… And they believe in yeh, too… It was a fine battle, sprout."
@@ -1523,7 +1614,8 @@
},
"victory": {
"1": "I must say, I'm warmed up to you! I might even admire you a little.",
- "2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. "
+ "2": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. ",
+ "2_female": "Wow! You're great! You've earned my respect! \n$I think your focus and will bowled us over totally. "
},
"defeat": {
"1": "I sensed your will to win, but I don't lose!",
@@ -1535,7 +1627,8 @@
"1": "You have a winning aura about you. So, anyway, this will be fun. Let's have our battle!"
},
"victory": {
- "1": "Amazing! You're very good, aren't you?"
+ "1": "Amazing! You're very good, aren't you?",
+ "1_female": "Amazing! You're very good, aren't you?"
},
"defeat": {
"1": "Yes! My Pokémon and I are perfectly good!"
@@ -1576,7 +1669,8 @@
},
"clay": {
"encounter": {
- "1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!"
+ "1": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!",
+ "1_female": "Harrumph! Kept me waitin', didn't ya, kid? All right, time to see what ya can do!"
},
"victory": {
"1": "Man oh man… It feels good to go all out and still be defeated!"
@@ -1590,7 +1684,8 @@
"1": "I'mma serve you a full course o' Water-type Pokémon! Don't try to eat 'em, though!"
},
"victory": {
- "1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
+ "1": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!",
+ "1_female": "Vaultin' Veluza! Yer a lively one, aren't ya! A little TOO lively, if I do say so myself!"
},
"defeat": {
"1": "You come back to see me again now, ya hear?"
@@ -1656,7 +1751,8 @@
"1": "There's something about you… A difference in your demeanor. \n$I think I sense that in you. Now, show me. Show me the power you wield with your Pokémon. \n$And I, in turn, shall present you with a performance of illusions in water by me and my Pokémon!"
},
"victory": {
- "1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy."
+ "1": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy.",
+ "1_female": "Bravo. I realize now your authenticity and magnificence as a Pokémon Trainer. \n$I find much joy in having met you and your Pokémon. You have proven yourself worthy."
},
"defeat": {
"1": "A grand illusion!"
@@ -1664,13 +1760,15 @@
},
"lorelei": {
"encounter": {
- "1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?"
+ "1": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?",
+ "1_female": "No one can best me when it comes to icy Pokémon! Freezing moves are powerful!\n$Your Pokémon will be at my mercy when they are frozen solid! Hahaha! Are you ready?"
},
"victory": {
"1": "How dare you!"
},
"defeat": {
- "1": "There's nothing you can do once you're frozen."
+ "1": "There's nothing you can do once you're frozen.",
+ "1_female": "There's nothing you can do once you're frozen."
}
},
"will": {
@@ -1686,10 +1784,12 @@
},
"malva": {
"encounter": {
- "1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!"
+ "1": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!",
+ "1_female": "I feel like my heart might just burst into flames. \n$I'm burning up with my hatred for you, runt!"
},
"victory": {
- "1": "What news… So a new challenger has defeated Malva!"
+ "1": "What news… So a new challenger has defeated Malva!",
+ "1_female": "What news… So a new challenger has defeated Malva!"
},
"defeat": {
"1": "I am delighted! Yes, delighted that I could squash you beneath my heel."
@@ -1711,7 +1811,8 @@
"1": "I gave the captain position to my cousin Sophocles, but I'm confident in my ability. \n$My strength is like that of a supernova!"
},
"victory": {
- "1": "I certainly found an interesting Trainer to face!"
+ "1": "I certainly found an interesting Trainer to face!",
+ "1_female": "I certainly found an interesting Trainer to face!"
},
"defeat": {
"1": "Ahaha. What an interesting battle."
@@ -1722,10 +1823,12 @@
"1": "I'd say I'll go easy on you, but… I'd be lying! Think fast!"
},
"victory": {
- "1": "Not bad, kiddo."
+ "1": "Not bad, kiddo.",
+ "1_female": "Not bad, kiddo."
},
"defeat": {
- "1": "Nahahaha! You really are something else, kiddo!"
+ "1": "Nahahaha! You really are something else, kiddo!",
+ "1_female": "Nahahaha! You really are something else, kiddo!"
}
},
"bruno": {
@@ -1744,7 +1847,8 @@
"1": "I'm Bugsy! I never lose when it comes to bug Pokémon!"
},
"victory": {
- "1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win."
+ "1": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win.",
+ "1_female": "Whoa, amazing! You're an expert on Pokémon!\nMy research isn't complete yet. OK, you win."
},
"defeat": {
"1": "Thanks! Thanks to our battle, I was also able to make progress in my research!"
@@ -1774,10 +1878,12 @@
},
"lenora": {
"encounter": {
- "1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!"
+ "1": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!",
+ "1_female": "Well then, challenger, I'm going to research how you battle with the Pokémon you've so lovingly raised!"
},
"victory": {
- "1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!"
+ "1": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!",
+ "1_female": "My theory about you was correct. You're more than just talented… You're motivated! I salute you!"
},
"defeat": {
"1": "Ah ha ha! If you lose, make sure to analyze why, and use that knowledge in your next battle!"
@@ -1802,7 +1908,8 @@
"1": "Wild! Your reason's already more toxic than mine!"
},
"defeat": {
- "1": "Hey, c'mon! Get serious! You gotta put more out there!"
+ "1": "Hey, c'mon! Get serious! You gotta put more out there!",
+ "1_female": "Hey, c'mon! Get serious! You gotta put more out there!"
}
},
"olivia": {
@@ -1840,7 +1947,8 @@
},
"flint": {
"encounter": {
- "1": "Hope you're warmed up, cause here comes the Big Bang!"
+ "1": "Hope you're warmed up, cause here comes the Big Bang!",
+ "1_female": "Hope you're warmed up, cause here comes the Big Bang!"
},
"victory": {
"1": "Incredible! Your moves are so hot, they make mine look lukewarm!"
@@ -1862,7 +1970,8 @@
},
"caitlin": {
"encounter": {
- "1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!"
+ "1": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!",
+ "1_female": "It's me who appeared when the flower opened up. You who have been waiting…\n$You look like a Pokémon Trainer with refined strength and deepened kindness. \n$What I look for in my opponent is superb strength… \n$Please unleash your power to the fullest!"
},
"victory": {
"1": "My Pokémon and I learned so much! I offer you my thanks."
@@ -1884,13 +1993,16 @@
},
"wikstrom": {
"encounter": {
- "1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!"
+ "1": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!",
+ "1_female": "Well met, young challenger! Verily am I the famed blade of hardened steel, Duke Wikstrom! \n$Let the battle begin! En garde!"
},
"victory": {
- "1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!"
+ "1": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!",
+ "1_female": "Glorious! The trust that you share with your honorable Pokémon surpasses even mine!"
},
"defeat": {
- "1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!"
+ "1": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!",
+ "1_female": "What manner of magic is this? My heart, it doth hammer ceaselessly in my breast! \n$Winning against such a worthy opponent doth give my soul wings--thus do I soar!"
}
},
"acerola": {
@@ -1922,11 +2034,14 @@
},
"victory": {
"1": "You got me. You are magnificent!",
- "2": "I never expected another trainer to beat me… I'm surprised."
+ "1_female": "You got me. You are magnificent!",
+ "2": "I never expected another trainer to beat me… I'm surprised.",
+ "2_female": "I never expected another trainer to beat me… I'm surprised."
},
"defeat": {
"1": "That was close. Want to try again?",
- "2": "It's not that you are weak. Don't let it bother you."
+ "2": "It's not that you are weak. Don't let it bother you.",
+ "2_female": "It's not that you are weak. Don't let it bother you."
}
},
"karen": {
@@ -1951,7 +2066,8 @@
"1": "Sure seems like you understand Pokémon real well. \n$This is gonna be a doozy of a battle! \n$I'll have to Dynamax my Pokémon if I want to win!"
},
"victory": {
- "1": "The power of Grass has wilted… What an incredible Challenger!"
+ "1": "The power of Grass has wilted… What an incredible Challenger!",
+ "1_female": "The power of Grass has wilted… What an incredible Challenger!"
},
"defeat": {
"1": "This'll really leave you in shock and awe."
@@ -1970,7 +2086,8 @@
},
"drasna": {
"encounter": {
- "1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!"
+ "1": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!",
+ "1_female": "You must be a strong Trainer. Yes, quite strong indeed…\n$That's just wonderful news! Facing opponents like you and your team will make my Pokémon grow like weeds!"
},
"victory": {
"1": "Oh, dear me. That sure was a quick battle… I do hope you'll come back again sometime!"
@@ -2003,7 +2120,8 @@
},
"blue": {
"encounter": {
- "1": "You must be pretty good to get this far."
+ "1": "You must be pretty good to get this far.",
+ "1_female": "You must be pretty good to get this far."
},
"victory": {
"1": "I've only lost to him and now to you… Him? Hee, hee…"
@@ -2050,7 +2168,8 @@
"1": "I am still the Champion. I won't hold anything back."
},
"victory": {
- "1": "This is the emergence of a new Champion."
+ "1": "This is the emergence of a new Champion.",
+ "1_female": "This is the emergence of a new Champion."
},
"defeat": {
"1": "I successfully defended my Championship."
@@ -2138,7 +2257,8 @@
"1": "Hey! Don't you think Pokémon are, like, super cute?"
},
"victory": {
- "1": "Waaah! Waaah! You're so mean!"
+ "1": "Waaah! Waaah! You're so mean!",
+ "1_female": "Waaah! Waaah! You're so mean!"
},
"defeat": {
"1": "And that's that!"
@@ -2146,7 +2266,8 @@
},
"chuck": {
"encounter": {
- "1": "Hah! You want to challenge me? Are you brave or just ignorant?"
+ "1": "Hah! You want to challenge me? Are you brave or just ignorant?",
+ "1_female": "Hah! You want to challenge me? Are you brave or just ignorant?"
},
"victory": {
"1": "You're strong! Would you please make me your apprentice?"
@@ -2157,7 +2278,8 @@
},
"katy": {
"encounter": {
- "1": "Don't let your guard down unless you would like to find yourself knocked off your feet!"
+ "1": "Don't let your guard down unless you would like to find yourself knocked off your feet!",
+ "1_female": "Don't let your guard down unless you would like to find yourself knocked off your feet!"
},
"victory": {
"1": "All of my sweet little Pokémon dropped like flies!"
@@ -2190,7 +2312,8 @@
},
"maylene": {
"encounter": {
- "1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!"
+ "1": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!",
+ "1_female": "I've come to challenge you now, and I won't hold anything back. \n$Please prepare yourself for battle!"
},
"victory": {
"1": "I admit defeat…"
@@ -2212,7 +2335,8 @@
},
"byron": {
"encounter": {
- "1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!"
+ "1": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!",
+ "1_female": "Trainer! You're young, just like my son, Roark. \n$With more young Trainers taking charge, the future of Pokémon is bright! \n$So, as a wall for young people, I'll take your challenge!"
},
"victory": {
"1": "Hmm! My sturdy Pokémon--defeated!"
@@ -2234,7 +2358,8 @@
},
"volkner": {
"encounter": {
- "1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!"
+ "1": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!",
+ "1_female": "Since you've come this far, you must be quite strong…\n$I hope you're the Trainer who'll make me remember how fun it is to battle!"
},
"victory": {
"1": "You've got me beat…\n$Your desire and the noble way your Pokémon battled for you… \n$I even felt thrilled during our match. That was a very good battle."
@@ -2336,7 +2461,8 @@
},
"valerie": {
"encounter": {
- "1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong."
+ "1": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong.",
+ "1_female": "Oh, if it isn't a young Trainer… It is lovely to get to meet you like this. \n$Then I suppose you have earned yourself the right to a battle, as a reward for your efforts. \n$The elusive Fairy may appear frail as the breeze and delicate as a bloom, but it is strong."
},
"victory": {
"1": "I hope that you will find things worth smiling about tomorrow…"
@@ -2383,7 +2509,8 @@
"1": "Let me have a look at how you and your partner Pokémon behave!"
},
"victory": {
- "1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon."
+ "1": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon.",
+ "1_female": "Your pink is still lacking, but you're an excellent Trainer with excellent Pokémon."
},
"defeat": {
"1": "Too bad for you, I guess."
@@ -2391,7 +2518,8 @@
},
"bede": {
"encounter": {
- "1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am."
+ "1": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am.",
+ "1_female": "I suppose I should prove beyond doubt just how pathetic you are and how strong I am."
},
"victory": {
"1": "I see… Well, that's fine. I wasn't really trying all that hard anyway."
@@ -2435,7 +2563,8 @@
},
"brassius": {
"encounter": {
- "1": "I assume you are ready? Let our collaborative work of art begin!"
+ "1": "I assume you are ready? Let our collaborative work of art begin!",
+ "1_female": "I assume you are ready? Let our collaborative work of art begin!"
},
"victory": {
"1": "Ahhh…vant-garde!"
@@ -2446,10 +2575,12 @@
},
"iono": {
"encounter": {
- "1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!"
+ "1": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!",
+ "1_female": "How're ya feelin' about this battle?\n$...\n$Let's get this show on the road! How strong is our challenger? \n$I 'unno! Let's find out together!"
},
"victory": {
- "1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
+ "1": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!",
+ "1_female": "You're as flashy and bright as a 10,000,000-volt Thunderbolt, friendo!"
},
"defeat": {
"1": "Your eyeballs are MINE!"
@@ -2471,7 +2602,8 @@
"1": "Come on, baby! Rattle me down to the bone!"
},
"victory": {
- "1": "You're cool, my friend—you move my SOUL!"
+ "1": "You're cool, my friend—you move my SOUL!",
+ "1_female": "You're cool, my friend—you move my SOUL!"
},
"defeat": {
"1": "Later, baby!"
@@ -2505,7 +2637,9 @@
"nessa_elite": {
"encounter": {
"1": "The tides are turning in my favor. Ready to get swept away?",
- "2": "Let's make some waves with this battle! I hope you're prepared!"
+ "1_female": "The tides are turning in my favor. Ready to get swept away?",
+ "2": "Let's make some waves with this battle! I hope you're prepared!",
+ "2_female": "Let's make some waves with this battle! I hope you're prepared!"
},
"victory": {
"1": "You navigated those waters perfectly... Well done!",
@@ -2533,6 +2667,7 @@
"allister_elite": {
"encounter": {
"1": "Shadows fall... Are you ready to face your fears?",
+ "1_female": "Shadows fall... Are you ready to face your fears?",
"2": "Let's see if you can handle the darkness that I command."
},
"victory": {
@@ -2555,7 +2690,8 @@
},
"defeat": {
"1": "Another storm weathered, another victory claimed! Well fought!",
- "2": "You got caught in my storm! Better luck next time!"
+ "2": "You got caught in my storm! Better luck next time!",
+ "2_female": "You got caught in my storm! Better luck next time!"
}
},
"alder": {
diff --git a/src/locales/en/menu-ui-handler.json b/src/locales/en/menu-ui-handler.json
index 8230a675b39..0536fa12c2e 100644
--- a/src/locales/en/menu-ui-handler.json
+++ b/src/locales/en/menu-ui-handler.json
@@ -14,8 +14,8 @@
"importSlotSelect": "Select a slot to import to.",
"exportSession": "Export Session",
"exportSlotSelect": "Select a slot to export from.",
- "importRunHistory":"Import Run History",
- "exportRunHistory":"Export Run History",
+ "importRunHistory": "Import Run History",
+ "exportRunHistory": "Export Run History",
"importData": "Import Data",
"exportData": "Export Data",
"consentPreferences": "Consent Preferences",
@@ -24,6 +24,7 @@
"linkGoogle": "Link Google",
"unlinkGoogle": "Unlink Google",
"cancel": "Cancel",
+ "donate": "Donate",
"losingProgressionWarning": "You will lose any progress since the beginning of the battle. Proceed?",
"noEggs": "You are not hatching\nany eggs at the moment!"
}
\ No newline at end of file
diff --git a/src/locales/en/modifier-type.json b/src/locales/en/modifier-type.json
index ed1ef900878..f73a3dcccae 100644
--- a/src/locales/en/modifier-type.json
+++ b/src/locales/en/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Doubles the chance of an encounter being a double battle for {{battleCount}} battles."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Increases the {{tempBattleStatName}} of all party members by 1 stage for 5 battles."
+ "TempStatStageBoosterModifierType": {
+ "description": "Increases the {{stat}} of all party members by 1 stage for 5 battles."
},
"AttackTypeBoosterModifierType": {
"description": "Increases the power of a Pokémon's {{moveType}}-type moves by 20%."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Increases all party members' level by {{levels}}."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Increases the holder's base {{statName}} by 10%. The higher your IVs, the higher the stack limit."
+ "BaseStatBoosterModifierType": {
+ "description": "Increases the holder's base {{stat}} by 10%. The higher your IVs, the higher the stack limit."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Restores 100% HP for all Pokémon."
@@ -183,6 +183,7 @@
"SOOTHE_BELL": { "name": "Soothe Bell" },
"SCOPE_LENS": { "name": "Scope Lens", "description": "It's a lens for scoping out weak points. It boosts the holder's critical-hit ratio."},
+ "DIRE_HIT": { "name": "Dire Hit", "extra": { "raises": "Critical Hit Ratio" } },
"LEEK": { "name": "Leek", "description": "This very long and stiff stalk of leek boosts the critical-hit ratio of Farfetch'd's moves."},
"EVIOLITE": { "name": "Eviolite", "description": "This mysterious evolutionary lump boosts the Defense and Sp. Def stats when held by a Pokémon that can still evolve." },
@@ -250,28 +251,14 @@
"METAL_POWDER": { "name": "Metal Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Defense stat." },
"QUICK_POWDER": { "name": "Quick Powder", "description": "Extremely fine yet hard, this odd powder boosts Ditto's Speed stat." }
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "X Attack",
"x_defense": "X Defense",
"x_sp_atk": "X Sp. Atk",
"x_sp_def": "X Sp. Def",
"x_speed": "X Speed",
- "x_accuracy": "X Accuracy",
- "dire_hit": "Dire Hit"
+ "x_accuracy": "X Accuracy"
},
-
- "TempBattleStatBoosterStatName": {
- "ATK": "Attack",
- "DEF": "Defense",
- "SPATK": "Sp. Atk",
- "SPDEF": "Sp. Def",
- "SPD": "Speed",
- "ACC": "Accuracy",
- "CRIT": "Critical Hit Ratio",
- "EVA": "Evasiveness",
- "DEFAULT": "???"
- },
-
"AttackTypeBoosterItem": {
"silk_scarf": "Silk Scarf",
"black_belt": "Black Belt",
@@ -450,6 +437,6 @@
"DRAGON_MEMORY": "Dragon Memory",
"DARK_MEMORY": "Dark Memory",
"FAIRY_MEMORY": "Fairy Memory",
- "BLANK_MEMORY": "Blank Memory"
+ "NORMAL_MEMORY": "Normal Memory"
}
}
diff --git a/src/locales/en/modifier.json b/src/locales/en/modifier.json
index 473be0e8bfa..47944c8adb7 100644
--- a/src/locales/en/modifier.json
+++ b/src/locales/en/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} restored a little HP using\nits {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} was revived\nby its {{typeName}}!",
- "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
+ "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}'s lowered stats were restored\nby its {{typeName}}!",
"moneyInterestApply": "You received interest of ₽{{moneyAmount}}\nfrom the {{typeName}}!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was absorbed\nby {{pokemonName}}'s {{typeName}}!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} was snatched\nby {{pokemonName}}'s {{typeName}}!",
diff --git a/src/locales/en/move-trigger.json b/src/locales/en/move-trigger.json
index baddbaa34bf..e70fb9dcfb7 100644
--- a/src/locales/en/move-trigger.json
+++ b/src/locales/en/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} cut its own HP to power up its move!",
"absorbedElectricity": "{{pokemonName}} absorbed electricity!",
"switchedStatChanges": "{{pokemonName}} switched stat changes with the target!",
+ "switchedTwoStatChanges": "{{pokemonName}} switched all changes to its {{firstStat}}\nand {{secondStat}} with its target!",
+ "switchedStat": "{{pokemonName}} switched {{stat}} with its target!",
+ "sharedGuard": "{{pokemonName}} shared its guard with the target!",
+ "sharedPower": "{{pokemonName}} shared its power with the target!",
"goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!",
"regainedHealth": "{{pokemonName}} regained\nhealth!",
"keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!",
@@ -61,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}'s ability\nwas suppressed!",
"revivalBlessing": "{{pokemonName}} was revived!",
"swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!",
- "exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!"
-}
+ "exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!",
+ "safeguard": "{{targetName}} is protected by Safeguard!"
+}
\ No newline at end of file
diff --git a/src/locales/en/pokemon-info.json b/src/locales/en/pokemon-info.json
index 87d2f7ad17b..b79daaed621 100644
--- a/src/locales/en/pokemon-info.json
+++ b/src/locales/en/pokemon-info.json
@@ -1,7 +1,7 @@
{
"Stat": {
"HP": "Max. HP",
- "HPshortened": "MaxHP",
+ "HPshortened": "HP",
"ATK": "Attack",
"ATKshortened": "Atk",
"DEF": "Defense",
@@ -13,8 +13,7 @@
"SPD": "Speed",
"SPDshortened": "Spd",
"ACC": "Accuracy",
- "EVA": "Evasiveness",
- "HPStat": "HP"
+ "EVA": "Evasiveness"
},
"Type": {
"UNKNOWN": "Unknown",
@@ -38,4 +37,4 @@
"FAIRY": "Fairy",
"STELLAR": "Stellar"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/en/settings.json b/src/locales/en/settings.json
index 6528f0368fe..301ebea9b2b 100644
--- a/src/locales/en/settings.json
+++ b/src/locales/en/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "Move Touch Controls",
"shopOverlayOpacity": "Shop Overlay Opacity",
"shopCursorTarget": "Shop Cursor Target",
- "items": "Items",
+ "rewards": "Rewards",
"reroll": "Reroll",
"shop": "Shop",
"checkTeam": "Check Team"
diff --git a/src/locales/es/ability.json b/src/locales/es/ability.json
index 807cc755c94..598694f441e 100644
--- a/src/locales/es/ability.json
+++ b/src/locales/es/ability.json
@@ -1,1242 +1,1242 @@
{
"stench": {
- "name": "Hedor",
+ "name": "Hedor",
"description": "Puede amedrentar a un Pokémon al atacarlo debido al mal olor que emana."
},
"drizzle": {
- "name": "Llovizna",
+ "name": "Llovizna",
"description": "Hace que llueva al entrar en combate."
},
"speedBoost": {
- "name": "Impulso",
+ "name": "Impulso",
"description": "Aumenta su Velocidad en cada turno."
},
"battleArmor": {
- "name": "Armadura Batalla",
+ "name": "Armadura Batalla",
"description": "La robusta coraza que lo protege bloquea los golpes críticos."
},
"sturdy": {
- "name": "Robustez",
+ "name": "Robustez",
"description": "El Pokémon no puede debilitarse de un solo golpe cuando tiene los PS al máximo. También evita los movimientos fulminantes."
},
"damp": {
- "name": "Humedad",
+ "name": "Humedad",
"description": "Aumenta la humedad del entorno y evita que se puedan utilizar movimientos explosivos, tales como Autodestrucción."
},
"limber": {
- "name": "Flexibilidad",
+ "name": "Flexibilidad",
"description": "Evita ser paralizado gracias a la flexibilidad de su cuerpo."
},
"sandVeil": {
- "name": "Velo Arena",
+ "name": "Velo Arena",
"description": "Aumenta su Evasión durante las tormentas de arena."
},
"static": {
- "name": "Elec. Estática",
+ "name": "Elec. Estática",
"description": "La electricidad estática que lo envuelve puede paralizar al Pokémon que lo ataque con un movimiento de contacto."
},
"voltAbsorb": {
- "name": "Absorbe Elec",
+ "name": "Absorbe Elec",
"description": "Si lo alcanza un movimiento de tipo Eléctrico, recupera PS en vez de sufrir daño."
},
"waterAbsorb": {
- "name": "Absorbe Agua",
+ "name": "Absorbe Agua",
"description": "Si lo alcanza un movimiento de tipo Agua, recupera PS en vez de sufrir daño."
},
"oblivious": {
- "name": "Despiste",
+ "name": "Despiste",
"description": "Su indiferencia evita que sea provocado, caiga presa del enamoramiento o sufra los efectos de Intimidación."
},
"cloudNine": {
- "name": "Aclimatación",
+ "name": "Aclimatación",
"description": "Anula todos los efectos del tiempo atmosférico."
},
"compoundEyes": {
- "name": "Ojo Compuesto",
+ "name": "Ojo Compuesto",
"description": "Aumenta la precisión de sus movimientos."
},
"insomnia": {
- "name": "Insomnio",
+ "name": "Insomnio",
"description": "Su resistencia al sueño le impide quedarse dormido."
},
"colorChange": {
- "name": "Cambio Color",
+ "name": "Cambio Color",
"description": "Adopta el tipo del último movimiento del que es blanco."
},
"immunity": {
- "name": "Inmunidad",
+ "name": "Inmunidad",
"description": "Su sistema inmunitario evita el envenenamiento."
},
"flashFire": {
- "name": "Absorbe Fuego",
+ "name": "Absorbe Fuego",
"description": "Si lo alcanza algún movimiento de tipo Fuego, potencia sus propios movimientos de dicho tipo."
},
"shieldDust": {
- "name": "Polvo Escudo",
+ "name": "Polvo Escudo",
"description": "El polvo de escamas que lo envuelve lo protege de los efectos secundarios de los ataques recibidos."
},
"ownTempo": {
- "name": "Ritmo Propio",
+ "name": "Ritmo Propio",
"description": "Como le gusta hacer las cosas a su manera, no le afecta la confusión ni sufre los efectos de Intimidación."
},
"suctionCups": {
- "name": "Ventosas",
+ "name": "Ventosas",
"description": "Sus ventosas se aferran al suelo, con lo cual anula movimientos y objetos que fuercen el cambio de Pokémon."
},
"intimidate": {
- "name": "Intimidación",
+ "name": "Intimidación",
"description": "Al entrar en combate, amilana al rival de tal manera que reduce su Ataque."
},
"shadowTag": {
- "name": "Sombra Trampa",
+ "name": "Sombra Trampa",
"description": "Pisa la sombra del rival para impedir que huya o lo cambien por otro."
},
"roughSkin": {
- "name": "Piel Tosca",
+ "name": "Piel Tosca",
"description": "Hiere con su piel áspera al Pokémon que lo ataque con un movimiento de contacto."
},
"wonderGuard": {
- "name": "Superguarda",
+ "name": "Superguarda",
"description": "Gracias a un poder misterioso, solo le hacen daño los movimientos supereficaces."
},
"levitate": {
- "name": "Levitación",
+ "name": "Levitación",
"description": "Su capacidad de flotar sobre el suelo le proporciona inmunidad frente a los movimientos de tipo Tierra."
},
"effectSpore": {
- "name": "Efecto Espora",
+ "name": "Efecto Espora",
"description": "Puede dormir, envenenar o paralizar al Pokémon que lo ataque con un movimiento de contacto."
},
"synchronize": {
- "name": "Sincronía",
+ "name": "Sincronía",
"description": "Contagia el envenenamiento, las quemaduras o la parálisis al Pokémon que le cause ese estado."
},
"clearBody": {
- "name": "Cuerpo Puro",
+ "name": "Cuerpo Puro",
"description": "Evita que se reduzcan sus características a causa de movimientos o habilidades de otros Pokémon."
},
"naturalCure": {
- "name": "Cura Natural",
+ "name": "Cura Natural",
"description": "Sus problemas de estado desaparecen cuando se retira del combate."
},
"lightningRod": {
- "name": "Pararrayos",
+ "name": "Pararrayos",
"description": "Atrae y neutraliza los movimientos de tipo Eléctrico, que además le aumentan el Ataque Especial."
},
"sereneGrace": {
- "name": "Dicha",
+ "name": "Dicha",
"description": "Aumenta la probabilidad de que los movimientos causen efectos secundarios."
},
"swiftSwim": {
- "name": "Nado Rápido",
+ "name": "Nado Rápido",
"description": "Aumenta su Velocidad cuando llueve."
},
"chlorophyll": {
- "name": "Clorofila",
+ "name": "Clorofila",
"description": "Aumenta su Velocidad cuando hace sol."
},
"illuminate": {
- "name": "Iluminación",
+ "name": "Iluminación",
"description": "Al iluminar el entorno, evita que su Precisión se reduzca."
},
"trace": {
- "name": "Calco",
+ "name": "Calco",
"description": "Copia la habilidad del rival al entrar en combate."
},
"hugePower": {
- "name": "Potencia",
+ "name": "Potencia",
"description": "Duplica la potencia de sus ataques físicos."
},
"poisonPoint": {
- "name": "Punto Tóxico",
+ "name": "Punto Tóxico",
"description": "Puede envenenar al Pokémon que lo ataque con un movimiento de contacto."
},
"innerFocus": {
- "name": "Fuerza Mental",
+ "name": "Fuerza Mental",
"description": "Gracias a su profunda concentración, no se amedrenta ante los ataques de otros Pokémon ni sufre los efectos de Intimidación."
},
"magmaArmor": {
- "name": "Escudo Magma",
+ "name": "Escudo Magma",
"description": "Gracias al magma candente que lo envuelve, no puede ser congelado."
},
"waterVeil": {
- "name": "Velo Agua",
+ "name": "Velo Agua",
"description": "Evita las quemaduras gracias a la capa de agua que lo envuelve."
},
"magnetPull": {
- "name": "Imán",
+ "name": "Imán",
"description": "Su magnetismo atrae a los Pokémon de tipo Acero y les impide huir o ser cambiados por otros."
},
"soundproof": {
- "name": "Insonorizar",
+ "name": "Insonorizar",
"description": "Su aislamiento acústico lo protege de movimientos que usan sonido."
},
"rainDish": {
- "name": "Cura Lluvia",
+ "name": "Cura Lluvia",
"description": "Recupera PS de forma gradual cuando llueve."
},
"sandStream": {
- "name": "Chorro Arena",
+ "name": "Chorro Arena",
"description": "Crea una tormenta de arena al entrar en combate."
},
"pressure": {
- "name": "Presión",
+ "name": "Presión",
"description": "Presiona al rival de tal manera que este consume más PP al usar sus movimientos."
},
"thickFat": {
- "name": "Sebo",
+ "name": "Sebo",
"description": "Gracias a la gruesa capa de grasa que lo protege, reduce a la mitad el daño que recibe de ataques de tipo Fuego o Hielo."
},
"earlyBird": {
- "name": "Madrugar",
+ "name": "Madrugar",
"description": "Si se duerme, tardará la mitad de tiempo en despertarse."
},
"flameBody": {
- "name": "Cuerpo Llama",
+ "name": "Cuerpo Llama",
"description": "Puede quemar al Pokémon que lo ataque con un movimiento de contacto."
},
"runAway": {
- "name": "Fuga",
+ "name": "Fuga",
"description": "Puede escapar de cualquier Pokémon salvaje."
},
"keenEye": {
- "name": "Vista Lince",
+ "name": "Vista Lince",
"description": "Su aguda vista evita que su Precisión se reduzca."
},
"hyperCutter": {
- "name": "Corte Fuerte",
+ "name": "Corte Fuerte",
"description": "Evita que otros Pokémon le reduzcan el Ataque."
},
"pickup": {
- "name": "Recogida",
- "description": "Puede recoger objetos que otros Pokémon hayan usado, o bien aquellos que encuentre en plena aventura."
+ "name": "Recogida",
+ "description": "Puede que recoja un objeto del enemigo tras cada batalla, al azar."
},
"truant": {
- "name": "Pereza",
+ "name": "Pereza",
"description": "Al ejecutar un movimiento, descansará en el turno siguiente."
},
"hustle": {
- "name": "Entusiasmo",
- "description": "Aumenta su Ataque, pero reduce su Precisión."
+ "name": "Entusiasmo",
+ "description": "Aumenta su ataque, pero reduce su precisión."
},
"cuteCharm": {
- "name": "Gran Encanto",
+ "name": "Gran Encanto",
"description": "Puede causar enamoramiento al Pokémon que lo ataque con un movimiento de contacto."
},
"plus": {
- "name": "Más",
- "description": "Aumenta su Ataque Especial si un Pokémon aliado tiene la habilidad Más o la habilidad Menos."
+ "name": "Más",
+ "description": "Aumenta su ataque especial si un Pokémon aliado tiene la habilidad Más o la habilidad Menos."
},
"minus": {
- "name": "Menos",
- "description": "Aumenta su Ataque Especial si un Pokémon aliado tiene la habilidad Más o la habilidad Menos."
+ "name": "Menos",
+ "description": "Aumenta su ataque especial si un Pokémon aliado tiene la habilidad Más o la habilidad Menos."
},
"forecast": {
- "name": "Predicción",
+ "name": "Predicción",
"description": "Cambia a tipo Agua, Fuego o Hielo en función del tiempo atmosférico."
},
"stickyHold": {
- "name": "Viscosidad",
+ "name": "Viscosidad",
"description": "Los objetos se quedan pegados a su cuerpo, por lo que no pueden robárselos."
},
"shedSkin": {
- "name": "Mudar",
+ "name": "Mudar",
"description": "Puede curar sus problemas de estado al mudar la piel."
},
"guts": {
- "name": "Agallas",
- "description": "Si sufre un problema de estado, se arma de valor y aumenta su Ataque."
+ "name": "Agallas",
+ "description": "Si sufre un problema de estado, se arma de valor y aumenta su ataque."
},
"marvelScale": {
- "name": "Escama Especial",
- "description": "Si sufre un problema de estado, sus escamas especiales reaccionan y aumenta su Defensa."
+ "name": "Escama Especial",
+ "description": "Si sufre un problema de estado, sus escamas especiales reaccionan y aumenta su defensa."
},
"liquidOoze": {
- "name": "Viscosecreción",
+ "name": "Viscosecreción",
"description": "Exuda una secreción viscosa y tóxica de intenso hedor que hiere a quienes intentan drenarle PS."
},
"overgrow": {
- "name": "Espesura",
+ "name": "Espesura",
"description": "Potencia sus movimientos de tipo Planta cuando le quedan pocos PS."
},
"blaze": {
- "name": "Mar Llamas",
+ "name": "Mar Llamas",
"description": "Potencia sus movimientos de tipo Fuego cuando le quedan pocos PS."
},
"torrent": {
- "name": "Torrente",
+ "name": "Torrente",
"description": "Potencia sus movimientos de tipo Agua cuando le quedan pocos PS."
},
"swarm": {
- "name": "Enjambre",
+ "name": "Enjambre",
"description": "Potencia sus movimientos de tipo Bicho cuando le quedan pocos PS."
},
"rockHead": {
- "name": "Cabeza Roca",
+ "name": "Cabeza Roca",
"description": "No pierde PS al usar movimientos que también hieren al usuario."
},
"drought": {
- "name": "Sequía",
+ "name": "Sequía",
"description": "El tiempo pasa a ser soleado al entrar en combate."
},
"arenaTrap": {
- "name": "Trampa Arena",
+ "name": "Trampa Arena",
"description": "Evita que el rival huya o sea cambiado por otro."
},
"vitalSpirit": {
- "name": "Espíritu Vital",
+ "name": "Espíritu Vital",
"description": "Su determinación le impide quedarse dormido."
},
"whiteSmoke": {
- "name": "Humo Blanco",
+ "name": "Humo Blanco",
"description": "El humo blanco que lo protege evita que otros Pokémon le reduzcan las características."
},
"purePower": {
- "name": "Energía Pura",
+ "name": "Energía Pura",
"description": "Duplica la potencia de sus ataques físicos gracias al yoga."
},
"shellArmor": {
- "name": "Caparazón",
+ "name": "Caparazón",
"description": "La robusta coraza que lo protege bloquea los golpes críticos."
},
"airLock": {
- "name": "Esclusa de Aire",
+ "name": "Esclusa de Aire",
"description": "Neutraliza todos los efectos del tiempo atmosférico."
},
"tangledFeet": {
- "name": "Tumbos",
- "description": "Aumenta su Evasión si está confuso."
+ "name": "Tumbos",
+ "description": "Aumenta su evasión si está confuso."
},
"motorDrive": {
- "name": "Electromotor",
- "description": "Si lo alcanza un movimiento de tipo Eléctrico, aumenta su Velocidad en vez de sufrir daño."
+ "name": "Electromotor",
+ "description": "Si lo alcanza un movimiento de tipo Eléctrico, aumenta su velocidad en vez de sufrir daño."
},
"rivalry": {
- "name": "Rivalidad",
+ "name": "Rivalidad",
"description": "Si el objetivo es del mismo sexo, su competitividad le lleva a infligir más daño. Si es del sexo contrario, en cambio, el daño será menor."
},
"steadfast": {
- "name": "Impasible",
- "description": "Cada vez que se amedrenta, aumenta su Velocidad debido a su voluntad inquebrantable."
+ "name": "Impasible",
+ "description": "Cada vez que se amedrenta, aumenta su velocidad debido a su voluntad inquebrantable."
},
"snowCloak": {
- "name": "Manto Níveo",
- "description": "Aumenta su Evasión cuando nieva."
+ "name": "Manto Níveo",
+ "description": "Aumenta su evasión cuando nieva."
},
"gluttony": {
- "name": "Gula",
+ "name": "Gula",
"description": "Cuando sus PS se ven reducidos a la mitad, engulle la baya que normalmente solo se comería cuando le quedasen pocos PS."
},
"angerPoint": {
- "name": "Irascible",
- "description": "Si recibe un golpe crítico, monta en cólera y su Ataque aumenta al máximo."
+ "name": "Irascible",
+ "description": "Si recibe un golpe crítico, monta en cólera y su ataque aumenta al máximo."
},
"unburden": {
- "name": "Liviano",
- "description": "Aumenta su Velocidad si usa o pierde el objeto que lleva."
+ "name": "Liviano",
+ "description": "Aumenta su velocidad si usa o pierde el objeto que lleva."
},
"heatproof": {
- "name": "Ignífugo",
+ "name": "Ignífugo",
"description": "Su cuerpo, resistente al calor, reduce a la mitad el daño recibido por movimientos de tipo Fuego."
},
"simple": {
- "name": "Simple",
+ "name": "Simple",
"description": "Duplica los cambios en las características."
},
"drySkin": {
- "name": "Piel Seca",
+ "name": "Piel Seca",
"description": "Pierde PS si hace sol y los recupera si llueve o recibe un movimiento de tipo Agua. Los movimientos de tipo Fuego, por su parte, le hacen más daño de lo normal."
},
"download": {
- "name": "Descarga",
- "description": "Compara la Defensa y la Defensa Especial del rival para ver cuál es inferior y aumenta su propio Ataque o Ataque Especial según sea lo más eficaz."
+ "name": "Descarga",
+ "description": "Compara la defensa y la defensa especial del rival para ver cuál es inferior y aumenta su propio ataque o ataque especial según sea lo más eficaz."
},
"ironFist": {
- "name": "Puño Férreo",
+ "name": "Puño Férreo",
"description": "Aumenta la potencia de los movimientos con los puños."
},
"poisonHeal": {
- "name": "Antídoto",
+ "name": "Antídoto",
"description": "Si resulta envenenado, recupera PS en vez de perderlos."
},
"adaptability": {
- "name": "Adaptable",
+ "name": "Adaptable",
"description": "Potencia aún más los movimientos cuyo tipo coincida con el suyo."
},
"skillLink": {
- "name": "Encadenado",
+ "name": "Encadenado",
"description": "Ejecuta siempre los movimientos de ataque múltiple con el número máximo de golpes."
},
"hydration": {
- "name": "Hidratación",
+ "name": "Hidratación",
"description": "Cura los problemas de estado si está lloviendo."
},
"solarPower": {
- "name": "Poder Solar",
- "description": "Si hace sol, aumenta su Ataque Especial, pero pierde PS en cada turno."
+ "name": "Poder Solar",
+ "description": "Si hace sol, aumenta su ataque especial, pero pierde PS en cada turno."
},
"quickFeet": {
- "name": "Pies Rápidos",
- "description": "Aumenta su Velocidad si sufre problemas de estado."
+ "name": "Pies Rápidos",
+ "description": "Aumenta su velocidad si sufre problemas de estado."
},
"normalize": {
- "name": "Normalidad",
+ "name": "Normalidad",
"description": "Hace que todos sus movimientos se vuelvan de tipo Normal y aumenta ligeramente su potencia."
},
"sniper": {
- "name": "Francotirador",
+ "name": "Francotirador",
"description": "Potencia los golpes críticos que asesta aún más de lo normal."
},
"magicGuard": {
- "name": "Muro Mágico",
+ "name": "Muro Mágico",
"description": "Solo recibe daño de ataques."
},
"noGuard": {
- "name": "Indefenso",
+ "name": "Indefenso",
"description": "Al quedar ambos expuestos, tanto sus movimientos como los del Pokémon que lo ataque acertarán siempre."
},
"stall": {
- "name": "Rezagado",
+ "name": "Rezagado",
"description": "Ejecuta su movimiento tras todos los demás."
},
"technician": {
- "name": "Experto",
+ "name": "Experto",
"description": "Aumenta la potencia de sus movimientos débiles."
},
"leafGuard": {
- "name": "Defensa Hoja",
+ "name": "Defensa Hoja",
"description": "Evita los problemas de estado si hace sol."
},
"klutz": {
- "name": "Zoquete",
+ "name": "Zoquete",
"description": "No puede usar objetos equipados."
},
"moldBreaker": {
- "name": "Rompemoldes",
+ "name": "Rompemoldes",
"description": "Sus movimientos no se ven afectados por la habilidad del objetivo."
},
"superLuck": {
- "name": "Afortunado",
+ "name": "Afortunado",
"description": "Su buena suerte aumenta la probabilidad de asestar golpes críticos."
},
"aftermath": {
- "name": "Detonación",
+ "name": "Detonación",
"description": "Daña al Pokémon que le ha dado el golpe de gracia con un movimiento de contacto."
},
"anticipation": {
- "name": "Anticipación",
+ "name": "Anticipación",
"description": "Prevé los movimientos peligrosos del rival."
},
"forewarn": {
- "name": "Alerta",
+ "name": "Alerta",
"description": "Revela uno de los movimientos del rival al entrar en combate."
},
"unaware": {
- "name": "Ignorante",
+ "name": "Ignorante",
"description": "Pasa por alto los cambios en las características de un Pokémon al atacarlo o recibir daño."
},
"tintedLens": {
- "name": "Cromolente",
+ "name": "Cromolente",
"description": "Potencia los movimientos que no son muy eficaces, que infligen ahora un daño normal."
},
"filter": {
- "name": "Filtro",
+ "name": "Filtro",
"description": "Mitiga el daño que le infligen los movimientos supereficaces."
},
"slowStart": {
- "name": "Inicio Lento",
- "description": "Reduce a la mitad su Ataque y su Velocidad durante cinco turnos."
+ "name": "Inicio Lento",
+ "description": "Reduce a la mitad su ataque y su velocidad durante cinco turnos."
},
"scrappy": {
- "name": "Intrépido",
+ "name": "Intrépido",
"description": "Alcanza a Pokémon de tipo Fantasma con movimientos de tipo Normal o Lucha. Además, no sufre los efectos de Intimidación."
},
"stormDrain": {
- "name": "Colector",
- "description": "Atrae y neutraliza los movimientos de tipo Agua, que además le aumentan el Ataque Especial."
+ "name": "Colector",
+ "description": "Atrae y neutraliza los movimientos de tipo Agua, que además le aumentan el ataque especial."
},
"iceBody": {
- "name": "Gélido",
+ "name": "Gélido",
"description": "Recupera PS de forma gradual cuando nieva."
},
"solidRock": {
- "name": "Roca Sólida",
+ "name": "Roca Sólida",
"description": "Mitiga el daño que le infligen los movimientos supereficaces."
},
"snowWarning": {
- "name": "Nevada",
+ "name": "Nevada",
"description": "Invoca una nevada al entrar en combate."
},
"honeyGather": {
- "name": "Recogemiel",
- "description": "The Pokémon gathers Honey after a battle. The Honey is then sold for money."
+ "name": "Recogemiel",
+ "description": "El Pokémon recoge miel tras cada batalla. La miel se vende inmediatamente por ₽."
},
"frisk": {
- "name": "Cacheo",
+ "name": "Cacheo",
"description": "Cuando entra en combate, el Pokémon puede comprobar la habilidad de un Pokémon rival."
},
"reckless": {
- "name": "Audaz",
+ "name": "Audaz",
"description": "Potencia los movimientos que también dañan al usuario."
},
"multitype": {
- "name": "Multitipo",
+ "name": "Multitipo",
"description": "Cambia su tipo al de la tabla que lleve."
},
"flowerGift": {
- "name": "Don Floral",
- "description": "Si hace sol, aumenta su Ataque y su Defensa Especial, así como los de sus aliados."
+ "name": "Don Floral",
+ "description": "Si hace sol, aumenta su ataque y su defensa Especial, así como los de sus aliados."
},
"badDreams": {
- "name": "Mal Sueño",
+ "name": "Mal Sueño",
"description": "Inflige daño a cualquier rival que esté dormido."
},
"pickpocket": {
- "name": "Hurto",
+ "name": "Hurto",
"description": "Roba el objeto del Pokémon que lo ataque con un movimiento de contacto."
},
"sheerForce": {
- "name": "Potencia Bruta",
+ "name": "Potencia Bruta",
"description": "Aumenta la potencia de sus movimientos en detrimento de los efectos secundarios, que se ven anulados."
},
"contrary": {
- "name": "Respondón",
+ "name": "Respondón",
"description": "Invierte los cambios en las características: bajan cuando les toca subir y suben cuando les toca bajar."
},
"unnerve": {
- "name": "Nerviosismo",
+ "name": "Nerviosismo",
"description": "Pone nervioso al rival y le impide comer bayas."
},
"defiant": {
- "name": "Competitivo",
- "description": "Aumenta mucho su Ataque cuando el rival le reduce cualquiera de sus características."
+ "name": "Competitivo",
+ "description": "Aumenta mucho su ataque cuando el rival le reduce cualquiera de sus características."
},
"defeatist": {
- "name": "Flaqueza",
- "description": "Cuando sus PS se ven reducidos a la mitad, se cansa tanto que su Ataque y su Ataque Especial también se ven reducidos a la mitad."
+ "name": "Flaqueza",
+ "description": "Cuando sus PS se ven reducidos a la mitad, se cansa tanto que su ataque y su ataque Especial también se ven reducidos a la mitad."
},
"cursedBody": {
- "name": "Cuerpo Maldito",
+ "name": "Cuerpo Maldito",
"description": "Puede anular el movimiento usado en su contra."
},
"healer": {
- "name": "Alma Cura",
+ "name": "Alma Cura",
"description": "A veces cura los problemas de estado de un aliado."
},
"friendGuard": {
- "name": "Compiescolta",
+ "name": "Compiescolta",
"description": "Reduce el daño que sufren los aliados."
},
"weakArmor": {
- "name": "Armadura Frágil",
- "description": "Al recibir daño de un ataque físico, se reduce su Defensa, pero aumenta mucho su Velocidad."
+ "name": "Armadura Frágil",
+ "description": "Al recibir daño de un ataque físico, se reduce su defensa, pero aumenta mucho su velocidad."
},
"heavyMetal": {
- "name": "Metal Pesado",
+ "name": "Metal Pesado",
"description": "Duplica su peso."
},
"lightMetal": {
- "name": "Metal Liviano",
+ "name": "Metal Liviano",
"description": "Reduce a la mitad su peso."
},
"multiscale": {
- "name": "Multiescamas",
+ "name": "Multiescamas",
"description": "Reduce el daño que sufre si sus PS están al máximo."
},
"toxicBoost": {
- "name": "Ímpetu Tóxico",
+ "name": "Ímpetu Tóxico",
"description": "Aumenta la potencia de sus ataques físicos cuando está envenenado."
},
"flareBoost": {
- "name": "Ímpetu Ardiente",
+ "name": "Ímpetu Ardiente",
"description": "Aumenta la potencia de sus ataques especiales cuando sufre quemaduras."
},
"harvest": {
- "name": "Cosecha",
+ "name": "Cosecha",
"description": "Puede reutilizar varias veces una misma baya."
},
"telepathy": {
- "name": "Telepatía",
+ "name": "Telepatía",
"description": "Elude los ataques de los aliados durante el combate."
},
"moody": {
- "name": "Veleta",
+ "name": "Veleta",
"description": "Aumenta mucho una característica en cada turno, pero reduce otra."
},
"overcoat": {
- "name": "Funda",
+ "name": "Funda",
"description": "No recibe daño de las tormentas de arena ni sufre los efectos causados por polvos o esporas."
},
"poisonTouch": {
- "name": "Toque Tóxico",
+ "name": "Toque Tóxico",
"description": "Puede envenenar al Pokémon al que ataque con un movimiento de contacto."
},
"regenerator": {
- "name": "Regeneración",
+ "name": "Regeneración",
"description": "Recupera unos pocos PS cuando se retira del combate."
},
"bigPecks": {
- "name": "Sacapecho",
- "description": "Impide que otros Pokémon le reduzcan la Defensa."
+ "name": "Sacapecho",
+ "description": "Impide que otros Pokémon le reduzcan la defensa."
},
"sandRush": {
- "name": "Ímpetu Arena",
- "description": "Aumenta su Velocidad durante las tormentas de arena."
+ "name": "Ímpetu Arena",
+ "description": "Aumenta su velocidad durante las tormentas de arena."
},
"wonderSkin": {
- "name": "Piel Milagro",
+ "name": "Piel Milagro",
"description": "Presenta una mayor resistencia ante los movimientos de estado."
},
"analytic": {
- "name": "Cálculo Final",
+ "name": "Cálculo Final",
"description": "Aumenta la potencia de su movimiento si es el último en atacar."
},
"illusion": {
- "name": "Ilusión",
+ "name": "Ilusión",
"description": "Adopta el aspecto del último Pokémon del equipo al entrar en combate para desconcertar al rival."
},
"imposter": {
- "name": "Impostor",
+ "name": "Impostor",
"description": "Se transforma en el Pokémon que tiene enfrente."
},
"infiltrator": {
- "name": "Allanamiento",
+ "name": "Allanamiento",
"description": "Ataca sorteando las barreras o el sustituto del objetivo."
},
"mummy": {
- "name": "Momia",
+ "name": "Momia",
"description": "Contagia la habilidad Momia al Pokémon que lo ataque con un movimiento de contacto."
},
"moxie": {
- "name": "Autoestima",
- "description": "Al debilitar a un objetivo, su confianza se refuerza de tal manera que aumenta su Ataque."
+ "name": "Autoestima",
+ "description": "Al debilitar a un objetivo, su confianza se refuerza de tal manera que aumenta su ataque."
},
"justified": {
- "name": "Justiciero",
- "description": "Si lo alcanza un movimiento de tipo Siniestro, aumenta el Ataque debido a su integridad."
+ "name": "Justiciero",
+ "description": "Si lo alcanza un movimiento de tipo Siniestro, aumenta el ataque debido a su integridad."
},
"rattled": {
- "name": "Cobardía",
- "description": "Si lo alcanza un ataque de tipo Siniestro, Bicho o Fantasma, o si sufre los efectos de Intimidación, el miedo hace que aumente su Velocidad."
+ "name": "Cobardía",
+ "description": "Si lo alcanza un ataque de tipo Siniestro, Bicho o Fantasma, o si sufre los efectos de Intimidación, el miedo hace que aumente su velocidad."
},
"magicBounce": {
- "name": "Espejo Mágico",
+ "name": "Espejo Mágico",
"description": "Puede devolver los movimientos de estado sin verse afectado por ellos."
},
"sapSipper": {
- "name": "Herbívoro",
- "description": "Si lo alcanza un movimiento de tipo Planta, aumenta su Ataque en vez de sufrir daño."
+ "name": "Herbívoro",
+ "description": "Si lo alcanza un movimiento de tipo Planta, aumenta su ataque en vez de sufrir daño."
},
"prankster": {
- "name": "Bromista",
+ "name": "Bromista",
"description": "Sus movimientos de estado tienen prioridad alta."
},
"sandForce": {
- "name": "Poder Arena",
+ "name": "Poder Arena",
"description": "Potencia los movimientos de tipo Tierra, Acero y Roca durante las tormentas de arena."
},
"ironBarbs": {
- "name": "Punta Acero",
+ "name": "Punta Acero",
"description": "Inflige daño con sus púas de acero al Pokémon que lo ataque con un movimiento de contacto."
},
"zenMode": {
- "name": "Modo Daruma",
+ "name": "Modo Daruma",
"description": "Cambia de forma si sus PS se ven reducidos a la mitad o menos."
},
"victoryStar": {
- "name": "Tinovictoria",
- "description": "Aumenta su Precisión y la de sus aliados."
+ "name": "Tinovictoria",
+ "description": "Aumenta su precisión y la de sus aliados."
},
"turboblaze": {
- "name": "Turbollama",
+ "name": "Turbollama",
"description": "Sus movimientos no se ven afectados por la habilidad del objetivo."
},
"teravolt": {
- "name": "Terravoltaje",
+ "name": "Terravoltaje",
"description": "Sus movimientos no se ven afectados por la habilidad del objetivo."
},
"aromaVeil": {
- "name": "Velo Aroma",
+ "name": "Velo Aroma",
"description": "Se protege a sí mismo y a sus aliados de efectos que impiden usar movimientos."
},
"flowerVeil": {
- "name": "Velo Flor",
+ "name": "Velo Flor",
"description": "Evita que los Pokémon de tipo Planta aliados sufran problemas de estado o que les reduzcan sus características."
},
"cheekPouch": {
- "name": "Carrillo",
+ "name": "Carrillo",
"description": "Recupera PS al comer cualquier baya."
},
"protean": {
- "name": "Mutatipo",
+ "name": "Mutatipo",
"description": "Al entrar en combate, cambia su tipo al del primer movimiento que va a usar."
},
"furCoat": {
- "name": "Pelaje Recio",
+ "name": "Pelaje Recio",
"description": "Reduce a la mitad el daño que recibe de ataques físicos."
},
"magician": {
- "name": "Prestidigitador",
+ "name": "Prestidigitador",
"description": "Roba el objeto del Pokémon al que alcance con un movimiento."
},
"bulletproof": {
- "name": "Antibalas",
+ "name": "Antibalas",
"description": "No le afectan las bombas ni algunos proyectiles."
},
"competitive": {
- "name": "Tenacidad",
- "description": "Aumenta mucho su Ataque Especial cuando el rival le reduce cualquiera de sus características."
+ "name": "Tenacidad",
+ "description": "Aumenta mucho su ataque especial cuando el rival le reduce cualquiera de sus características."
},
"strongJaw": {
- "name": "Mandíbula Fuerte",
+ "name": "Mandíbula Fuerte",
"description": "Su robusta mandíbula le confiere una mordedura mucho más potente."
},
"refrigerate": {
- "name": "Piel Helada",
+ "name": "Piel Helada",
"description": "Convierte los movimientos de tipo Normal en tipo Hielo y aumenta ligeramente su potencia."
},
"sweetVeil": {
- "name": "Velo Dulce",
+ "name": "Velo Dulce",
"description": "No cae dormido y evita también que sus aliados se duerman."
},
"stanceChange": {
- "name": "Cambio Táctico",
+ "name": "Cambio Táctico",
"description": "Adopta la Forma Filo al lanzar un ataque, o bien la Forma Escudo si usa el movimiento Escudo Real."
},
"galeWings": {
- "name": "Alas Vendaval",
+ "name": "Alas Vendaval",
"description": "Da prioridad a los movimientos de tipo Volador si sus PS están al máximo."
},
"megaLauncher": {
- "name": "Megadisparador",
+ "name": "Megadisparador",
"description": "Aumenta la potencia de algunos movimientos de pulsos y auras."
},
"grassPelt": {
- "name": "Manto Frondoso",
- "description": "Aumenta su Defensa si hay un campo de hierba en el terreno de combate."
+ "name": "Manto Frondoso",
+ "description": "Aumenta su defensa si hay un campo de hierba en el terreno de combate."
},
"symbiosis": {
- "name": "Simbiosis",
+ "name": "Simbiosis",
"description": "Pasa su objeto a un aliado cuando este use el suyo."
},
"toughClaws": {
- "name": "Garra Dura",
+ "name": "Garra Dura",
"description": "Aumenta la potencia de los movimientos de contacto."
},
"pixilate": {
- "name": "Piel Feérica",
+ "name": "Piel Feérica",
"description": "Convierte los movimientos de tipo Normal en tipo Hada y aumenta ligeramente su potencia."
},
"gooey": {
- "name": "Baba",
- "description": "Reduce la Velocidad del Pokémon que lo ataque con un movimiento de contacto."
+ "name": "Baba",
+ "description": "Reduce la velocidad del Pokémon que lo ataque con un movimiento de contacto."
},
"aerilate": {
- "name": "Piel Celeste",
+ "name": "Piel Celeste",
"description": "Convierte los movimientos de tipo Normal en tipo Volador y aumenta ligeramente su potencia."
},
"parentalBond": {
- "name": "Amor Filial",
+ "name": "Amor Filial",
"description": "Une fuerzas con su cría y ataca dos veces."
},
"darkAura": {
- "name": "Aura Oscura",
+ "name": "Aura Oscura",
"description": "Aumenta la potencia de los movimientos de tipo Siniestro de todos los Pokémon."
},
"fairyAura": {
- "name": "Aura Feérica",
+ "name": "Aura Feérica",
"description": "Aumenta la potencia de los movimientos de tipo Hada de todos los Pokémon."
},
"auraBreak": {
- "name": "Rompeaura",
+ "name": "Rompeaura",
"description": "Invierte los efectos de las habilidades de auras, por lo que reduce la potencia de ciertos movimientos en vez de aumentarla."
},
"primordialSea": {
- "name": "Mar del Albor",
+ "name": "Mar del Albor",
"description": "Altera el clima para anular los ataques de tipo Fuego."
},
"desolateLand": {
- "name": "Tierra del Ocaso",
+ "name": "Tierra del Ocaso",
"description": "Altera el clima para anular los ataques de tipo Agua."
},
"deltaStream": {
- "name": "Ráfaga Delta",
+ "name": "Ráfaga Delta",
"description": "Altera el clima para anular las vulnerabilidades del tipo Volador."
},
"stamina": {
- "name": "Firmeza",
- "description": "Aumenta su Defensa al recibir un ataque."
+ "name": "Firmeza",
+ "description": "Aumenta su defensa al recibir un ataque."
},
"wimpOut": {
- "name": "Huida",
+ "name": "Huida",
"description": "Se asusta y abandona el terreno de combate cuando sus PS se ven reducidos a la mitad."
},
"emergencyExit": {
- "name": "Retirada",
+ "name": "Retirada",
"description": "Abandona el terreno de combate cuando sus PS se ven reducidos a la mitad para evitar males mayores."
},
"waterCompaction": {
- "name": "Hidrorrefuerzo",
- "description": "Aumenta mucho su Defensa si lo alcanza un movimiento de tipo Agua."
+ "name": "Hidrorrefuerzo",
+ "description": "Aumenta mucho su defensa si lo alcanza un movimiento de tipo Agua."
},
"merciless": {
- "name": "Ensañamiento",
+ "name": "Ensañamiento",
"description": "Hace que sus movimientos asesten siempre un golpe crítico si el objetivo está envenenado."
},
"shieldsDown": {
- "name": "Escudo Limitado",
+ "name": "Escudo Limitado",
"description": "Rompe su coraza cuando sus PS se ven reducidos a la mitad y adopta una forma ofensiva."
},
"stakeout": {
- "name": "Vigilante",
+ "name": "Vigilante",
"description": "Si el objetivo de su ataque es sustituido por otro, duplica el daño que infligirá."
},
"waterBubble": {
- "name": "Pompa",
+ "name": "Pompa",
"description": "Reduce el daño que le provocan los movimientos de tipo Fuego y es inmune a las quemaduras."
},
"steelworker": {
- "name": "Acero Templado",
+ "name": "Acero Templado",
"description": "Potencia los movimientos de tipo Acero."
},
"berserk": {
- "name": "Cólera",
- "description": "Aumenta su Ataque Especial si sus PS se ven reducidos a la mitad debido a algún ataque."
+ "name": "Cólera",
+ "description": "Aumenta su ataque especial si sus PS se ven reducidos a la mitad debido a algún ataque."
},
"slushRush": {
- "name": "Quitanieves",
- "description": "Aumenta su Velocidad cuando nieva."
+ "name": "Quitanieves",
+ "description": "Aumenta su velocidad cuando nieva."
},
"longReach": {
- "name": "Remoto",
+ "name": "Remoto",
"description": "Puede usar cualquier movimiento sin entrar en contacto con su objetivo."
},
"liquidVoice": {
- "name": "Voz Fluida",
+ "name": "Voz Fluida",
"description": "Hace que todos sus movimientos que usan sonido pasen a ser de tipo Agua."
},
"triage": {
- "name": "Primer Auxilio",
+ "name": "Primer Auxilio",
"description": "Da prioridad a los movimientos que restauran PS."
},
"galvanize": {
- "name": "Piel Eléctrica",
+ "name": "Piel Eléctrica",
"description": "Convierte los movimientos de tipo Normal en tipo Eléctrico y aumenta ligeramente su potencia."
},
"surgeSurfer": {
- "name": "Cola Surf",
- "description": "Duplica su Velocidad si hay un campo eléctrico en el terreno de combate."
+ "name": "Cola Surf",
+ "description": "Duplica su velocidad si hay un campo eléctrico en el terreno de combate."
},
"schooling": {
- "name": "Banco",
+ "name": "Banco",
"description": "Forma bancos con sus congéneres cuando tiene muchos PS, lo cual le otorga más fuerza. Cuando le quedan pocos PS, el banco se dispersa."
},
"disguise": {
- "name": "Disfraz",
+ "name": "Disfraz",
"description": "Puede eludir un ataque valiéndose de la tela que le cubre el cuerpo una vez por combate."
},
"battleBond": {
- "name": "Fuerte Afecto",
- "description": "Al derrotar a un Pokémon, los vínculos con su Entrenador se refuerzan y aumentan su Ataque, su Ataque Especial y su Velocidad."
+ "name": "Fuerte Afecto",
+ "description": "Al derrotar a un Pokémon, los vínculos con su Entrenador se refuerzan y aumentan su ataque, su ataque especial y su velocidad."
},
"powerConstruct": {
- "name": "Agrupamiento",
+ "name": "Agrupamiento",
"description": "Cuando sus PS se ven reducidos a la mitad, las células se reagrupan y adopta su Forma Completa."
},
"corrosion": {
- "name": "Corrosión",
+ "name": "Corrosión",
"description": "Puede envenenar incluso a Pokémon de tipo Acero o Veneno."
},
"comatose": {
- "name": "Letargo Perenne",
+ "name": "Letargo Perenne",
"description": "No despierta jamás de su profundo letargo e incluso ataca dormido."
},
"queenlyMajesty": {
- "name": "Regia Presencia",
+ "name": "Regia Presencia",
"description": "Intimida al rival y le impide usar movimientos con prioridad contra él y sus aliados."
},
"innardsOut": {
- "name": "Revés",
+ "name": "Revés",
"description": "Al caer debilitado, inflige al atacante un daño equivalente a los PS que le quedaran antes de recibir el golpe de gracia."
},
"dancer": {
- "name": "Pareja de Baile",
+ "name": "Pareja de Baile",
"description": "Puede copiar inmediatamente cualquier movimiento de baile que haya usado otro Pokémon presente en el combate."
},
"battery": {
- "name": "Batería",
+ "name": "Batería",
"description": "Potencia los ataques especiales de los aliados."
},
"fluffy": {
- "name": "Peluche",
+ "name": "Peluche",
"description": "Reduce a la mitad el daño recibido por los movimientos de contacto, pero duplica el que le infligen los de tipo Fuego."
},
"dazzling": {
- "name": "Cuerpo Vívido",
+ "name": "Cuerpo Vívido",
"description": "Desconcierta al rival y le impide usar movimientos con prioridad contra él y sus aliados."
},
"soulHeart": {
- "name": "Coránima",
- "description": "Aumenta su Ataque Especial cada vez que un Pokémon cae debilitado."
+ "name": "Coránima",
+ "description": "Aumenta su ataque especial cada vez que un Pokémon cae debilitado."
},
"tanglingHair": {
- "name": "Rizos Rebeldes",
- "description": "Reduce la Velocidad del Pokémon que lo ataque con un movimiento de contacto."
+ "name": "Rizos Rebeldes",
+ "description": "Reduce la velocidad del Pokémon que lo ataque con un movimiento de contacto."
},
"receiver": {
- "name": "Receptor",
+ "name": "Receptor",
"description": "Adquiere la habilidad de un aliado debilitado."
},
"powerOfAlchemy": {
- "name": "Reacción Química",
+ "name": "Reacción Química",
"description": "Reacciona copiando la habilidad de un aliado debilitado."
},
"beastBoost": {
- "name": "Ultraimpulso",
+ "name": "Ultraimpulso",
"description": "Al derrotar a un Pokémon, aumenta su característica más fuerte."
},
"rksSystem": {
- "name": "Sistema Alfa",
+ "name": "Sistema Alfa",
"description": "Cambia su tipo según el disco que lleve instalado."
},
"electricSurge": {
- "name": "Electrogénesis",
+ "name": "Electrogénesis",
"description": "Crea un campo eléctrico al entrar en combate."
},
"psychicSurge": {
- "name": "Psicogénesis",
+ "name": "Psicogénesis",
"description": "Crea un campo psíquico al entrar en combate."
},
"mistySurge": {
- "name": "Nebulogénesis",
+ "name": "Nebulogénesis",
"description": "Crea un campo de niebla al entrar en combate."
},
"grassySurge": {
- "name": "Herbogénesis",
+ "name": "Herbogénesis",
"description": "Crea un campo de hierba al entrar en combate."
},
"fullMetalBody": {
- "name": "Guardia Metálica",
+ "name": "Guardia Metálica",
"description": "Evita que se reduzcan sus características a causa de movimientos o habilidades de otros Pokémon."
},
"shadowShield": {
- "name": "Guardia Espectro",
+ "name": "Guardia Espectro",
"description": "Reduce el daño que sufre si sus PS están al máximo."
},
"prismArmor": {
- "name": "Armadura Prisma",
+ "name": "Armadura Prisma",
"description": "Mitiga el daño que le infligen los movimientos supereficaces."
},
"neuroforce": {
- "name": "Fuerza Cerebral",
+ "name": "Fuerza Cerebral",
"description": "Potencia los ataques supereficaces."
},
"intrepidSword": {
- "name": "Espada Indómita",
- "description": "Aumenta su Ataque al entrar en combate por primera vez."
+ "name": "Espada Indómita",
+ "description": "Aumenta su ataque al entrar en combate por primera vez."
},
"dauntlessShield": {
- "name": "Escudo Recio",
- "description": "Aumenta su Defensa al entrar en combate por primera vez."
+ "name": "Escudo Recio",
+ "description": "Aumenta su defensa al entrar en combate por primera vez."
},
"libero": {
- "name": "Líbero",
+ "name": "Líbero",
"description": "Al entrar en combate, cambia su tipo al del primer movimiento que va a usar."
},
"ballFetch": {
- "name": "Recogebolas",
- "description": "Si no lleva equipado ningún objeto, recupera la Poké Ball del primer intento de captura fallido."
+ "name": "Recogebolas",
+ "description": "Recupera la Poké Ball del primer intento de captura fallido."
},
"cottonDown": {
- "name": "Pelusa",
- "description": "Al ser alcanzado por un ataque, suelta una pelusa de algodón que reduce la Velocidad de todos los demás Pokémon."
+ "name": "Pelusa",
+ "description": "Al ser alcanzado por un ataque, suelta una pelusa de algodón que reduce la velocidad de todos los demás Pokémon."
},
"propellerTail": {
- "name": "Hélice Caudal",
+ "name": "Hélice Caudal",
"description": "Ignora los efectos de las habilidades o los movimientos que permiten a un Pokémon centrar la atención sobre sí."
},
"mirrorArmor": {
- "name": "Coraza Reflejo",
+ "name": "Coraza Reflejo",
"description": "Refleja los efectos que reducen las características."
},
"gulpMissile": {
- "name": "Tragamisil",
+ "name": "Tragamisil",
"description": "Tras usar Surf o Buceo, emerge con una presa en la boca. Al recibir daño, ataca escupiéndola."
},
"stalwart": {
- "name": "Acérrimo",
+ "name": "Acérrimo",
"description": "Ignora los efectos de las habilidades o los movimientos que permiten a un Pokémon centrar la atención sobre sí."
},
"steamEngine": {
- "name": "Combustible",
- "description": "Si lo alcanza un movimiento de tipo Fuego o Agua, aumenta muchísimo su Velocidad."
+ "name": "Combustible",
+ "description": "Si lo alcanza un movimiento de tipo Fuego o Agua, aumenta muchísimo su velocidad."
},
"punkRock": {
- "name": "Punk Rock",
+ "name": "Punk Rock",
"description": "Potencia los movimientos que usan sonido y reduce a la mitad el daño que le infligen dichos movimientos."
},
"sandSpit": {
- "name": "Expulsarena",
+ "name": "Expulsarena",
"description": "Provoca una tormenta de arena al recibir un ataque."
},
"iceScales": {
- "name": "Escama de Hielo",
+ "name": "Escama de Hielo",
"description": "Las gélidas escamas que protegen su cuerpo reducen a la mitad el daño que le infligen los ataques especiales."
},
"ripen": {
- "name": "Maduración",
+ "name": "Maduración",
"description": "Hace madurar las bayas, por lo que duplica sus efectos."
},
"iceFace": {
- "name": "Cara de Hielo",
+ "name": "Cara de Hielo",
"description": "Absorbe el daño de un ataque físico con el hielo de la cabeza, tras lo cual cambia de forma. El hielo se regenerará la próxima vez que nieve."
},
"powerSpot": {
- "name": "Fuente Energía",
+ "name": "Fuente Energía",
"description": "Potencia los movimientos de los Pokémon adyacentes."
},
"mimicry": {
- "name": "Mimetismo",
+ "name": "Mimetismo",
"description": "Cambia su tipo según el campo que haya en el terreno de combate."
},
"screenCleaner": {
- "name": "Antibarrera",
+ "name": "Antibarrera",
"description": "Anula los efectos de Pantalla de Luz, Reflejo y Velo Aurora tanto de rivales como de aliados al entrar en combate."
},
"steelySpirit": {
- "name": "Alma Acerada",
+ "name": "Alma Acerada",
"description": "Potencia los movimientos de tipo Acero del Pokémon y sus aliados."
},
"perishBody": {
- "name": "Cuerpo Mortal",
+ "name": "Cuerpo Mortal",
"description": "Si lo alcanza un movimiento de contacto, se debilitará al cabo de 3 turnos, así como el atacante, a menos que abandonen el terreno de combate."
},
"wanderingSpirit": {
- "name": "Alma Errante",
+ "name": "Alma Errante",
"description": "Si lo alcanza un movimiento de contacto, intercambia su habilidad con la del atacante."
},
"gorillaTactics": {
- "name": "Monotema",
- "description": "Aumenta su Ataque, pero solo puede usar el primer movimiento escogido."
+ "name": "Monotema",
+ "description": "Aumenta su ataque, pero solo puede usar el primer movimiento escogido."
},
"neutralizingGas": {
- "name": "Gas Reactivo",
+ "name": "Gas Reactivo",
"description": "Anula los efectos de las habilidades de los demás Pokémon presentes mientras esté en el terreno de combate."
},
"pastelVeil": {
- "name": "Velo Pastel",
+ "name": "Velo Pastel",
"description": "Se protege a sí mismo y a sus aliados del envenenamiento."
},
"hungerSwitch": {
- "name": "Mutapetito",
+ "name": "Mutapetito",
"description": "Alterna entre su Forma Saciada y Forma Voraz al final de cada turno."
},
"quickDraw": {
- "name": "Mano Rápida",
+ "name": "Mano Rápida",
"description": "A veces, puede atacar el primero."
},
"unseenFist": {
- "name": "Puño Invisible",
+ "name": "Puño Invisible",
"description": "Si usa un movimiento de contacto, puede infligir daño al objetivo aunque este se proteja."
},
"curiousMedicine": {
- "name": "Medicina Extraña",
+ "name": "Medicina Extraña",
"description": "Al entrar en combate, rezuma una substancia medicinal por la caracola que revierte los cambios en las características de los aliados."
},
"transistor": {
- "name": "Transistor",
+ "name": "Transistor",
"description": "Potencia los movimientos de tipo Eléctrico."
},
"dragonsMaw": {
- "name": "Mandíbula Dragón",
+ "name": "Mandíbula Dragón",
"description": "Potencia los movimientos de tipo Dragón."
},
"chillingNeigh": {
- "name": "Relincho Blanco",
- "description": "Al derrotar a un objetivo, emite un relincho gélido y aumenta su Ataque."
+ "name": "Relincho Blanco",
+ "description": "Al derrotar a un objetivo, emite un relincho gélido y aumenta su ataque."
},
"grimNeigh": {
- "name": "Relincho Negro",
- "description": "Al derrotar a un objetivo, emite un relincho aterrador y aumenta su Ataque Especial."
+ "name": "Relincho Negro",
+ "description": "Al derrotar a un objetivo, emite un relincho aterrador y aumenta su ataque especial."
},
"asOneGlastrier": {
- "name": "Unidad Ecuestre",
+ "name": "Unidad Ecuestre",
"description": "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex."
},
"asOneSpectrier": {
- "name": "Unidad Ecuestre",
+ "name": "Unidad Ecuestre",
"description": "El Pokémon tiene dos habilidades: Relincho Negro de Spectrier y Nerviosismo de Calyrex."
},
"lingeringAroma": {
- "name": "Olor Persistente",
+ "name": "Olor Persistente",
"description": "Contagia la habilidad Olor Persistente al Pokémon que lo ataque con un movimiento de contacto."
},
"seedSower": {
- "name": "Disemillar",
+ "name": "Disemillar",
"description": "Crea un campo de hierba al recibir un ataque."
},
"thermalExchange": {
- "name": "Termoconversión",
- "description": "Evita las quemaduras y, si lo alcanza un movimiento de tipo Fuego, aumenta su Ataque."
+ "name": "Termoconversión",
+ "description": "Evita las quemaduras y, si lo alcanza un movimiento de tipo Fuego, aumenta su ataque."
},
"angerShell": {
- "name": "Coraza Ira",
- "description": "Cuando un ataque reduce sus PS a la mitad, un arrebato de cólera reduce su Defensa y su Defensa Especial, pero aumenta su Ataque, su Ataque Especial y su Velocidad."
+ "name": "Coraza Ira",
+ "description": "Cuando un ataque reduce sus PS a la mitad, un arrebato de cólera reduce su defensa y su defensa especial, pero aumenta su ataque, su ataque especial y su velocidad."
},
"purifyingSalt": {
- "name": "Sal Purificadora",
+ "name": "Sal Purificadora",
"description": "Su sal pura lo protege de los problemas de estado y reduce a la mitad el daño que recibe de ataques de tipo Fantasma."
},
"wellBakedBody": {
- "name": "Cuerpo Horneado",
- "description": "Si lo alcanza un movimiento de tipo Fuego, aumenta mucho su Defensa en vez de sufrir daño."
+ "name": "Cuerpo Horneado",
+ "description": "Si lo alcanza un movimiento de tipo Fuego, aumenta mucho su defensa en vez de sufrir daño."
},
"windRider": {
- "name": "Surcavientos",
- "description": "Si sopla un Viento Afín o lo alcanza un movimiento que usa viento, aumenta su Ataque. Tampoco recibe daño de este último."
+ "name": "Surcavientos",
+ "description": "Si sopla un Viento Afín o lo alcanza un movimiento que usa viento, aumenta su ataque. Tampoco recibe daño de este último."
},
"guardDog": {
- "name": "Perro Guardián",
- "description": "Aumenta su Ataque si sufre los efectos de Intimidación. También anula movimientos y objetos que fuercen el cambio de Pokémon."
+ "name": "Perro Guardián",
+ "description": "Aumenta su ataque si sufre los efectos de Intimidación. También anula movimientos y objetos que fuercen el cambio de Pokémon."
},
"rockyPayload": {
- "name": "Transportarrocas",
+ "name": "Transportarrocas",
"description": "Potencia los movimientos de tipo Roca."
},
"windPower": {
- "name": "Energía Eólica",
+ "name": "Energía Eólica",
"description": "Su cuerpo se carga de electricidad si lo alcanza un movimiento que usa viento, lo que potencia su siguiente movimiento de tipo Eléctrico."
},
"zeroToHero": {
- "name": "Cambio Heroico",
+ "name": "Cambio Heroico",
"description": "Adopta la Forma Heroica cuando se retira del combate."
},
"commander": {
- "name": "Comandar",
+ "name": "Comandar",
"description": "Si al entrar en combate coincide con un Dondozo aliado, se cuela en el interior de su boca para tomar el control."
},
"electromorphosis": {
- "name": "Dinamo",
+ "name": "Dinamo",
"description": "Su cuerpo se carga de electricidad al recibir daño, lo que potencia su siguiente movimiento de tipo Eléctrico."
},
"protosynthesis": {
- "name": "Paleosíntesis",
+ "name": "Paleosíntesis",
"description": "Si hace sol o lleva un tanque de Energía Potenciadora, aumenta su característica más alta."
},
"quarkDrive": {
- "name": "Carga Cuark",
+ "name": "Carga Cuark",
"description": "Si hay un campo eléctrico en el terreno de combate o lleva un tanque de Energía Potenciadora, aumenta su característica más alta."
},
"goodAsGold": {
- "name": "Cuerpo Áureo",
+ "name": "Cuerpo Áureo",
"description": "Su robusto cuerpo de oro inoxidable lo hace inmune frente a movimientos de estado de otros Pokémon."
},
"vesselOfRuin": {
- "name": "Caldero Debacle",
- "description": "Reduce el Ataque Especial de todos los demás Pokémon con el poder de su caldero maldito."
+ "name": "Caldero Debacle",
+ "description": "Reduce el ataque especial de todos los demás Pokémon con el poder de su caldero maldito."
},
"swordOfRuin": {
- "name": "Espada Debacle",
- "description": "Reduce la Defensa de todos los demás Pokémon con el poder de su espada maldita."
+ "name": "Espada Debacle",
+ "description": "Reduce la defensa de todos los demás Pokémon con el poder de su espada maldita."
},
"tabletsOfRuin": {
- "name": "Tablilla Debacle",
- "description": "Reduce el Ataque de todos los demás Pokémon con el poder de sus tablillas malditas."
+ "name": "Tablilla Debacle",
+ "description": "Reduce el ataque de todos los demás Pokémon con el poder de sus tablillas malditas."
},
"beadsOfRuin": {
- "name": "Abalorio Debacle",
- "description": "Reduce la Defensa Especial de todos los demás Pokémon con el poder de sus abalorios malditos."
+ "name": "Abalorio Debacle",
+ "description": "Reduce la defensa especial de todos los demás Pokémon con el poder de sus abalorios malditos."
},
"orichalcumPulse": {
- "name": "Latido Oricalco",
- "description": "El tiempo pasa a ser soleado cuando entra en combate. Si hace mucho sol, su Ataque aumenta gracias a su pulso primigenio."
+ "name": "Latido Oricalco",
+ "description": "El tiempo pasa a ser soleado cuando entra en combate. Si hace mucho sol, su ataque aumenta gracias a su pulso primigenio."
},
"hadronEngine": {
- "name": "Motor Hadrónico",
- "description": "Crea un campo eléctrico al entrar en combate. Si hay un campo eléctrico, su Ataque Especial aumenta gracias a su motor futurista."
+ "name": "Motor Hadrónico",
+ "description": "Crea un campo eléctrico al entrar en combate. Si hay un campo eléctrico, su ataque especial aumenta gracias a su motor futurista."
},
"opportunist": {
- "name": "Oportunista",
+ "name": "Oportunista",
"description": "Copia las mejoras en las características del rival, aprovechándose de la situación."
},
"cudChew": {
- "name": "Rumia",
+ "name": "Rumia",
"description": "Cuando ingiere una baya, la regurgita al final del siguiente turno y se la come por segunda vez."
},
"sharpness": {
- "name": "Cortante",
+ "name": "Cortante",
"description": "Aumenta la potencia de los movimientos cortantes."
},
"supremeOverlord": {
- "name": "General Supremo",
- "description": "Al entrar en combate, su Ataque y su Ataque Especial aumentan un poco por cada miembro del equipo que haya sido derrotado hasta el momento."
+ "name": "General Supremo",
+ "description": "Al entrar en combate, su ataque y su ataque especial aumentan un poco por cada miembro del equipo que haya sido derrotado hasta el momento."
},
"costar": {
- "name": "Unísono",
+ "name": "Unísono",
"description": "Al entrar en combate, copia los cambios en las características de su aliado."
},
"toxicDebris": {
- "name": "Capa Tóxica",
+ "name": "Capa Tóxica",
"description": "Al recibir daño de un ataque físico, lanza una trampa de púas tóxicas a los pies del rival."
},
"armorTail": {
- "name": "Cola Armadura",
+ "name": "Cola Armadura",
"description": "La extraña cola que le envuelve la cabeza impide al rival usar movimientos con prioridad contra él y sus aliados."
},
"earthEater": {
- "name": "Geofagia",
+ "name": "Geofagia",
"description": "Si lo alcanza un movimiento de tipo Tierra, recupera PS en vez de sufrir daño."
},
"myceliumMight": {
- "name": "Poder Fúngico",
+ "name": "Poder Fúngico",
"description": "El Pokémon siempre actúa con lentitud cuando usa movimientos de estado, pero estos no se ven afectados por la habilidad del objetivo."
},
"mindsEye": {
- "name": "Ojo Mental",
- "description": "Alcanza a Pokémon de tipo Fantasma con movimientos de tipo Normal o Lucha. Su Precisión no se puede reducir e ignora los cambios en la Evasión del objetivo."
+ "name": "Ojo Mental",
+ "description": "Alcanza a Pokémon de tipo Fantasma con movimientos de tipo Normal o Lucha. Su precisión no se puede reducir e ignora los cambios en la evasión del objetivo."
},
"supersweetSyrup": {
- "name": "Néctar Dulce",
- "description": "Al entrar en combate por primera vez, esparce un aroma dulzón a néctar que reduce la Evasión del rival."
+ "name": "Néctar Dulce",
+ "description": "Al entrar en combate por primera vez, esparce un aroma dulzón a néctar que reduce la evasión del rival."
},
"hospitality": {
- "name": "Hospitalidad",
+ "name": "Hospitalidad",
"description": "Al entrar en combate, restaura algunos PS de su aliado como muestra de hospitalidad."
},
"toxicChain": {
- "name": "Cadena Tóxica",
+ "name": "Cadena Tóxica",
"description": "Gracias al poder de su cadena impregnada de toxinas, puede envenenar gravemente al Pokémon al que ataque."
},
"embodyAspectTeal": {
- "name": "Evocarrecuerdos",
- "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa."
+ "name": "Evocarrecuerdos",
+ "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la máscara turquesa y aumenta su velocidad."
},
"embodyAspectWellspring": {
- "name": "Evocarrecuerdos",
- "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa."
+ "name": "Evocarrecuerdos",
+ "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la máscara fuente y aumenta su defensa especial."
},
"embodyAspectHearthflame": {
- "name": "Evocarrecuerdos",
- "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa."
+ "name": "Evocarrecuerdos",
+ "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la máscara horno y aumenta su ataque."
},
"embodyAspectCornerstone": {
- "name": "Evocarrecuerdos",
- "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la Máscara Cimiento y aumenta su Defensa."
+ "name": "Evocarrecuerdos",
+ "description": "Al evocar viejos recuerdos, el Pokémon hace brillar la máscara cimiento y aumenta su defensa."
},
"teraShift": {
- "name": "Teracambio",
+ "name": "Teracambio",
"description": "Al entrar en combate, adopta la Forma Teracristal tras absorber la energía de su alrededor."
},
"teraShell": {
- "name": "Teracaparazón",
+ "name": "Teracaparazón",
"description": "Su caparazón encierra energía de todos los tipos. Gracias a ello, si sus PS están al máximo, el movimiento que lo alcance no será muy eficaz."
},
"teraformZero": {
- "name": "Teraformación 0",
+ "name": "Teraformación 0",
"description": "Cuando Terapagos adopta la Forma Astral, anula todos los efectos del tiempo atmosférico y de los campos que haya en el terreno gracias a su poder oculto."
},
"poisonPuppeteer": {
- "name": "Títere Tóxico",
+ "name": "Títere Tóxico",
"description": "Los rivales que Pecharunt envenene con sus movimientos también sufrirán confusión."
}
}
diff --git a/src/locales/es/achv.json b/src/locales/es/achv.json
index c3a22c566d0..14501dbdb6b 100644
--- a/src/locales/es/achv.json
+++ b/src/locales/es/achv.json
@@ -91,7 +91,7 @@
"name": "Campeón Liga Master",
"name_female": "Campeona Liga Master"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Trabajo en Equipo",
"description": "Haz relevo a otro miembro del equipo con al menos una estadística al máximo."
},
@@ -170,5 +170,9 @@
"CLASSIC_VICTORY": {
"name": "Imbatible",
"description": "Completa el juego en modo clásico."
+ },
+ "INVERSE_BATTLE": {
+ "name": "Espejo ojepsE",
+ "description": "Completa el reto de Combate Inverso.\n.osrevnI etabmoC ed oter le atelpmoC"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/arena-flyout.json b/src/locales/es/arena-flyout.json
index b2881b5de76..e3ec1dc6d4a 100644
--- a/src/locales/es/arena-flyout.json
+++ b/src/locales/es/arena-flyout.json
@@ -1,21 +1,21 @@
{
- "activeBattleEffects": "Efectos de Terreno Activos",
+ "activeBattleEffects": "Efectos de terreno activos",
"player": "Jugador",
"neutral": "Neutral",
"enemy": "Enemigo",
"sunny": "Sol",
"rain": "Lluvia",
- "sandstorm": "Tormenta de Arena",
+ "sandstorm": "Tormenta de arena",
"hail": "Granizo",
"snow": "Nieve",
"fog": "Niebla",
"heavyRain": "Diluvio",
- "harshSun": "Sol Abrasador",
+ "harshSun": "Sol abrasador",
"strongWinds": "Turbulencias",
- "misty": "Campo de Niebla",
- "electric": "Campo Eléctrico",
- "grassy": "Campo de Hierba",
- "psychic": "Campo Psíquico",
+ "misty": "Campo de niebla",
+ "electric": "Campo eléctrico",
+ "grassy": "Campo de hierba",
+ "psychic": "Campo psíquico",
"mudSport": "Chapoteo Lodo",
"waterSport": "Hidrochorro",
"spikes": "Púas",
@@ -37,4 +37,4 @@
"craftyShield": "Truco Defensa",
"tailwind": "Viento Afín",
"happyHour": "Paga Extra"
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/arena-tag.json b/src/locales/es/arena-tag.json
index 9e26dfeeb6e..0f63b62e784 100644
--- a/src/locales/es/arena-tag.json
+++ b/src/locales/es/arena-tag.json
@@ -1 +1,57 @@
-{}
\ No newline at end of file
+{
+ "yourTeam": "tu equipo",
+ "opposingTeam": "el equipo rival",
+ "arenaOnRemove": "Los efectos de {{moveName}} desaparecieron.",
+ "arenaOnRemovePlayer": "Los efectos de {{moveName}}\ndesaparecieron en tu bando.",
+ "arenaOnRemoveEnemy": "Los efectos de {{moveName}}\ndesaparecieron en el bando rival.",
+ "mistOnAdd": "¡Neblina de {{pokemonNameWithAffix}}\nha cubierto a su equipo!",
+ "mistApply": "¡La neblina evita los cambios de estadísticas!",
+ "reflectOnAdd": "¡Reflejo redujo el daño físico!",
+ "reflectOnAddPlayer": "¡Reflejo redujo el daño físico en tu bando!",
+ "reflectOnAddEnemy": "Reflejo redujo el daño físico en el bando rival.",
+ "lightScreenOnAdd": "¡Pantalla de Luz redujo el daño físico!",
+ "lightScreenOnAddPlayer": "¡Pantalla de Luz redujo el daño físico en tu bando!",
+ "lightScreenOnAddEnemy": "¡Pantalla de Luz redujo el daño físico en el bando enemigo!",
+ "auroraVeilOnAdd": "¡Velo Aurora redujo el daño físico!",
+ "auroraVeilOnAddPlayer": "¡Velo Aurora redujo el daño físico en tu bando!",
+ "auroraVeilOnAddEnemy": "¡Velo Aurora redujo el daño físico en el bando rival!",
+ "conditionalProtectOnAdd": "¡{{moveName}} protege a su bando!",
+ "conditionalProtectOnAddPlayer": "¡{{moveName}} protege a tu bando!",
+ "conditionalProtectOnAddEnemy": "¡{{moveName}} protege al bando rival!",
+ "conditionalProtectApply": "¡{{pokemonNameWithAffix}} ha sido protegido por {{moveName}}!",
+ "matBlockOnAdd": "¡{{pokemonNameWithAffix}} va a usar un tatami para bloquear ataques!",
+ "noCritOnAddPlayer": "¡{{moveName}} protege a tu bando de golpes críticos!",
+ "noCritOnAddEnemy": "¡{{moveName}} protege al bando rival de golpes críticos!",
+ "noCritOnRemove": "¡Los efectos de {{moveName}} de {{pokemonNameWithAffix}} se han disipado!",
+ "wishTagOnAdd": "¡El deseo de {{pokemonNameWithAffix}} se ha hecho realidad!",
+ "mudSportOnAdd": "¡Se han debilitado los ataques de tipo Eléctrico!",
+ "mudSportOnRemove": "Chapoteo Lodo ha dejado de surtir efecto.",
+ "waterSportOnAdd": "¡Se han debilitado los ataques\nde tipo Fuego!",
+ "waterSportOnRemove": "Hidrochorro ha dejado de surtir efecto.",
+ "spikesOnAdd": "¡El equipo de {{opponentDesc}} ha sido rodeado por {{moveName}}!",
+ "spikesActivateTrap": "¡Las púas han herido a {{pokemonNameWithAffix}}!",
+ "toxicSpikesOnAdd": "¡El equipo de {{opponentDesc}} ha sido rodeado por {{moveName}}!",
+ "toxicSpikesActivateTrapPoison": "¡{{pokemonNameWithAffix}} ha sido herido por {{moveName}}!",
+ "stealthRockOnAdd": "¡El equipo de {{opponentDesc}} ha sido rodeado por piedras puntiagudas!",
+ "stealthRockActivateTrap": "¡Unas piedras puntiagudas han dañado a {{pokemonNameWithAffix}}!",
+ "stickyWebOnAdd": "¡Una {{moveName}} se extiende a los pies del bando rival!",
+ "stickyWebActivateTrap": "¡{{pokemonName}} ha caído en una red viscosa!",
+ "trickRoomOnAdd": "¡{{pokemonNameWithAffix}} ha alterado las dimensiones!",
+ "trickRoomOnRemove": "Se han restaurado las dimensiones alteradas.",
+ "gravityOnAdd": "¡La gravedad se ha incrementado!",
+ "gravityOnRemove": "La gravedad ha vuelto a su estado normal.",
+ "tailwindOnAdd": "¡Sopla un viento afín!",
+ "tailwindOnAddPlayer": "¡El viento sopla a favor de tu bando!",
+ "tailwindOnAddEnemy": "¡El viento sopla a favor del bando rival!",
+ "tailwindOnRemove": "Ha dejado de soplar el viento afín.",
+ "tailwindOnRemovePlayer": "Ha dejado de soplar el viento que favorecía a tu equipo.",
+ "tailwindOnRemoveEnemy": "Ha dejado de soplar el viento que favorecía al bando rival.",
+ "happyHourOnAdd": "¡La felicidad se respira en el aire!",
+ "happyHourOnRemove": "La felicidad ya no se respira en el aire.",
+ "safeguardOnAdd": "¡Todos los Pokémon están protegidos por Velo Sagrado!",
+ "safeguardOnAddPlayer": "¡Tu equipo se ha protegido con Velo Sagrado!",
+ "safeguardOnAddEnemy": "¡El equipo enemigo se ha protegido con Velo Sagrado!",
+ "safeguardOnRemove": "¡Velo Sagrado dejó de hacer efecto!",
+ "safeguardOnRemovePlayer": "El efecto de Velo Sagrado en tu equipo se ha disipado.",
+ "safeguardOnRemoveEnemy": "El efecto de Velo Sagrado en el equipo enemigo se ha disipado."
+}
\ No newline at end of file
diff --git a/src/locales/es/battler-tags.json b/src/locales/es/battler-tags.json
index 9e26dfeeb6e..d917b6c74b5 100644
--- a/src/locales/es/battler-tags.json
+++ b/src/locales/es/battler-tags.json
@@ -1 +1,71 @@
-{}
\ No newline at end of file
+{
+ "trappedDesc": "trampa",
+ "flinchedDesc": "retroceso",
+ "confusedDesc": "confusión",
+ "infatuatedDesc": "enamoramiento",
+ "seedDesc": "drenado",
+ "nightmareDesc": "pesadillas",
+ "ingrainDesc": "raíces",
+ "drowsyDesc": "sueño",
+ "rechargingLapse": "¡{{pokemonNameWithAffix}} necesita\nrecuperarse de su ataque!",
+ "trappedOnAdd": "¡{{pokemonNameWithAffix}} no puede escapar!",
+ "trappedOnRemove": "¡{{pokemonNameWithAffix}} se ha\nliberado de {{moveName}}!",
+ "flinchedLapse": "¡{{pokemonNameWithAffix}} se amedrentó!",
+ "confusedOnAdd": "¡{{pokemonNameWithAffix}} se encuentra confuso!",
+ "confusedOnRemove": "¡{{pokemonNameWithAffix}} ya no está confuso!",
+ "confusedOnOverlap": "¡{{pokemonNameWithAffix}} ya está confuso!",
+ "confusedLapse": "¡{{pokemonNameWithAffix}} está confuso!",
+ "confusedLapseHurtItself": "¡Está tan confuso que se ha herido a sí mismo!",
+ "destinyBondLapseIsBoss": "Mismo Destino no afecta a {{pokemonNameWithAffix}}.",
+ "destinyBondLapse": "¡{{pokemonNameWithAffix2}} ha sufrido\nel mismo destino que {{pokemonNameWithAffix}}!",
+ "infatuatedOnAdd": "¡{{pokemonNameWithAffix}} se ha enamorado\nde {{sourcePokemonName}}!",
+ "infatuatedOnOverlap": "¡{{pokemonNameWithAffix}} ya está enamorado!",
+ "infatuatedLapse": "¡{{pokemonNameWithAffix}} se ha enamorado\ndebido a {{sourcePokemonName}}!",
+ "infatuatedLapseImmobilize": "¡El enamoramiento impide que\n{{pokemonNameWithAffix}} reaccione!",
+ "infatuatedOnRemove": "{{pokemonNameWithAffix}} ya no está enamorado.",
+ "seededOnAdd": "¡{{pokemonNameWithAffix}} ha sido infectado!",
+ "seededLapse": "¡Las drenadoras han restado salud a {{pokemonNameWithAffix}}!",
+ "seededLapseShed": "¡{{pokemonNameWithAffix}} ha absorbido el lodo líquido!",
+ "nightmareOnAdd": "¡{{pokemonNameWithAffix}} se ha sumido en una pesadilla!",
+ "nightmareOnOverlap": "¡{{pokemonNameWithAffix}} ya está teniendo pesadillas!",
+ "nightmareLapse": "¡{{pokemonNameWithAffix}} sufre pesadillas!",
+ "encoreOnAdd": "¡{{pokemonNameWithAffix}} sufre los efectos de Otra Vez!",
+ "encoreOnRemove": "¡{{pokemonNameWithAffix}} ya no sufre los efectos de Otra Vez!",
+ "helpingHandOnAdd": "¡{{pokemonNameWithAffix}} se prepara\npara ayudar a {{pokemonName}}!",
+ "ingrainLapse": "¡{{pokemonNameWithAffix}} ha absorbido\nnutrientes a través de sus raíces!",
+ "ingrainOnTrap": "¡{{pokemonNameWithAffix}} ha echado raíces!",
+ "aquaRingOnAdd": "¡{{pokemonNameWithAffix}} se ha rodeado de un manto de agua!",
+ "aquaRingLapse": "¡{{pokemonName}} restauró sus PS con {{moveName}}!",
+ "drowsyOnAdd": "¡{{pokemonNameWithAffix}} empieza a tener sueño!",
+ "damagingTrapLapse": "¡{{moveName}} hiere a {{pokemonNameWithAffix}}!",
+ "bindOnTrap": "¡{{moveName}} de {{sourcePokemonName}} oprime a {{pokemonNameWithAffix}}!",
+ "wrapOnTrap": "¡{{sourcePokemonName}} ha atrapado a {{pokemonNameWithAffix}} con una constricción!",
+ "vortexOnTrap": "¡{{pokemonNameWithAffix}} no puede salir del torbellino!",
+ "clampOnTrap": "¡{{sourcePokemonNameWithAffix}} ha atenazado a \n{{pokemonName}}!",
+ "sandTombOnTrap": "¡{{pokemonNameWithAffix}} ha sido atrapado por {{moveName}}!",
+ "magmaStormOnTrap": "¡La lluvia ígnea cae sobre {{pokemonNameWithAffix}}!",
+ "snapTrapOnTrap": "¡{{pokemonNameWithAffix}} cayó en un cepo!",
+ "thunderCageOnTrap": "¡{{sourcePokemonNameWithAffix}} ha enjaulado a {{pokemonNameWithAffix}}!",
+ "infestationOnTrap": "¡{{pokemonNameWithAffix}} es presa del acoso de {{sourcePokemonNameWithAffix}}!",
+ "protectedOnAdd": "{{pokemonNameWithAffix}}\nse está protegiendo.",
+ "protectedLapse": "¡{{pokemonNameWithAffix}}\nse ha protegido!",
+ "enduringOnAdd": "{{pokemonNameWithAffix}} se prepara para resistir los ataques...",
+ "enduringLapse": "¡{{pokemonNameWithAffix}} ha encajado el golpe!",
+ "sturdyLapse": "¡{{pokemonNameWithAffix}} ha encajado el golpe!",
+ "perishSongLapse": "La cuenta atrás de Canto Mortal de\n{{pokemonNameWithAffix}} ha bajado a {{turnCount}}.",
+ "centerOfAttentionOnAdd": "¡{{pokemonNameWithAffix}} es el centro de atención!",
+ "truantLapse": "{{pokemonNameWithAffix}} está holgazaneando...",
+ "slowStartOnAdd": "¡{{pokemonNameWithAffix}} no está dando todo de sí!",
+ "slowStartOnRemove": "¡{{pokemonNameWithAffix}} ya puede darlo todo!",
+ "highestStatBoostOnAdd": "¡{{pokemonNameWithAffix}} ha reforzado su {{statName}}!",
+ "highestStatBoostOnRemove": "¡Los efectos de {{abilityName}}\nde {{pokemonNameWithAffix}} han desaparecido!",
+ "magnetRisenOnAdd": "¡{{pokemonNameWithAffix}} levita gracias a un campo electromagnético!",
+ "magnetRisenOnRemove": "¡El campo electromagnético de {{pokemonNameWithAffix}} se ha disipado!",
+ "critBoostOnAdd": "¡{{pokemonNameWithAffix}} se está preparando para luchar!",
+ "critBoostOnRemove": "{{pokemonNameWithAffix}} se ha relajado.",
+ "saltCuredOnAdd": "¡{{pokemonNameWithAffix}} está en salazón!",
+ "saltCuredLapse": "¡{{moveName}} ha herido a {{pokemonNameWithAffix}}!",
+ "cursedOnAdd": "¡{{pokemonNameWithAffix}} sacrifica algunos PS y maldice a {{pokemonName}}!",
+ "cursedLapse": "¡{{pokemonNameWithAffix}} es víctima de una maldición!",
+ "stockpilingOnAdd": "¡{{pokemonNameWithAffix}} ha reservado energía por {{stockpiledCount}}ª vez!"
+}
diff --git a/src/locales/es/bgm-name.json b/src/locales/es/bgm-name.json
index be617b79567..f0e0ab7e852 100644
--- a/src/locales/es/bgm-name.json
+++ b/src/locales/es/bgm-name.json
@@ -1,95 +1,99 @@
{
"music": "Música: ",
"missing_entries": "{{name}}",
- "battle_kanto_champion": "B2W2 - ¡Vs Campeón de Kanto!",
- "battle_johto_champion": "B2W2 - ¡Vs Campeón de Johto!",
- "battle_hoenn_champion_g5": "B2W2 - ¡Vs Campeón de Hoenn!",
- "battle_hoenn_champion_g6": "ORAS - ¡Vs Campeón de Hoenn!",
- "battle_sinnoh_champion": "B2W2 - ¡Vs Campeón de Sinnoh!",
- "battle_champion_alder": "BW - ¡Vs Campeón de Teselia!",
- "battle_champion_iris": "B2W2 - ¡Vs Campeón de Teselia!",
- "battle_kalos_champion": "XY - ¡Vs Campeón de Kalos!",
- "battle_alola_champion": "USUM - ¡Vs Campeón de Alola!",
- "battle_galar_champion": "SWSH - ¡Vs Campeón de Galar!",
- "battle_champion_geeta": "SV - ¡Vs Campeona Ságita!",
- "battle_champion_nemona": "SV - ¡Vs Campeona Mencía!",
- "battle_champion_kieran": "SV - ¡Vs Campeón Cass!",
- "battle_hoenn_elite": "ORAS - ¡Vs Alto Mando!",
- "battle_unova_elite": "BW - ¡Vs Alto Mando!",
- "battle_kalos_elite": "XY - ¡Vs Alto Mando!",
- "battle_alola_elite": "SM - ¡Vs Alto Mando!",
- "battle_galar_elite": "SWSH - Torneo de Finalistas",
- "battle_paldea_elite": "SV - ¡Vs Alto Mando!",
- "battle_bb_elite": "SV - ¡Vs Alto Mando de la Academia Arándano!",
+ "battle_kanto_champion": "B2W2 - ¡Vs. Campeón de Kanto!",
+ "battle_johto_champion": "B2W2 - ¡Vs. Campeón de Johto!",
+ "battle_hoenn_champion_g5": "B2W2 - ¡Vs. Campeón de Hoenn!",
+ "battle_hoenn_champion_g6": "ORAS - ¡Vs. Campeón de Hoenn!",
+ "battle_sinnoh_champion": "B2W2 - ¡Vs. Campeón de Sinnoh!",
+ "battle_champion_alder": "BW - ¡Vs. Campeón de Teselia!",
+ "battle_champion_iris": "B2W2 - ¡Vs. Campeón de Teselia!",
+ "battle_kalos_champion": "XY - ¡Vs. Campeón de Kalos!",
+ "battle_alola_champion": "USUM - ¡Vs. Campeón de Alola!",
+ "battle_galar_champion": "SWSH - ¡Vs. Campeón de Galar!",
+ "battle_champion_geeta": "SV - ¡Vs. Campeona Ságita!",
+ "battle_champion_nemona": "SV - ¡Vs. Campeona Mencía!",
+ "battle_champion_kieran": "SV - ¡Vs. Campeón Cass!",
+ "battle_hoenn_elite": "ORAS - ¡Vs. Alto Mando!",
+ "battle_unova_elite": "BW - ¡Vs. Alto Mando!",
+ "battle_kalos_elite": "XY - ¡Vs. Alto Mando!",
+ "battle_alola_elite": "SM - ¡Vs. Alto Mando!",
+ "battle_galar_elite": "SWSH - Torneo de finalistas",
+ "battle_paldea_elite": "SV - ¡Vs. Alto Mando!",
+ "battle_bb_elite": "SV - ¡Vs. Alto Mando de la Academia Arándano!",
"battle_final_encounter": "PMD RTDX - Dominio de Rayquaza",
- "battle_final": "BW - ¡Vs Ghechis!",
- "battle_kanto_gym": "B2W2 - ¡Vs Líder de Kanto!",
- "battle_johto_gym": "B2W2 - ¡Vs Líder de Johto!",
- "battle_hoenn_gym": "B2W2 - ¡Vs Líder de Hoenn!",
- "battle_sinnoh_gym": "B2W2 - ¡Vs Líder de Sinnoh!",
- "battle_unova_gym": "BW - ¡Vs Líder de Teselia!",
- "battle_kalos_gym": "XY - ¡Vs Líder de Kalos!",
- "battle_galar_gym": "SWSH - ¡Vs Líder de Galar!",
- "battle_paldea_gym": "SV - ¡Vs Líder de Paldea!",
- "battle_legendary_kanto": "XY - ¡Vs Legendarios de Kanto!",
- "battle_legendary_raikou": "HGSS - ¡Vs Raikou!",
- "battle_legendary_entei": "HGSS - ¡Vs Entei!",
- "battle_legendary_suicune": "HGSS - ¡Vs Suicune!",
- "battle_legendary_lugia": "HGSS - ¡Vs Lugia!",
- "battle_legendary_ho_oh": "HGSS - ¡Vs Ho-oh!",
- "battle_legendary_regis_g5": "B2W2 - ¡Vs Regis!",
- "battle_legendary_regis_g6": "ORAS - ¡Vs Regis!",
- "battle_legendary_gro_kyo": "ORAS - ¡Vs Groudon/Kyogre!",
- "battle_legendary_rayquaza": "ORAS - ¡Vs Rayquaza!",
- "battle_legendary_deoxys": "ORAS - ¡Vs Deoxys!",
- "battle_legendary_lake_trio": "ORAS - ¡Vs Trío del Lago!",
- "battle_legendary_sinnoh": "ORAS - ¡Vs Legendarios de Sinnoh!",
- "battle_legendary_dia_pal": "ORAS - ¡Vs Dialga/Palkia!",
- "battle_legendary_giratina": "ORAS - ¡Vs Giratina!",
- "battle_legendary_arceus": "HGSS - ¡Vs Arceus!",
- "battle_legendary_unova": "BW - ¡Vs Legendarios de Teselia!",
- "battle_legendary_kyurem": "BW - ¡Vs Kyurem!",
- "battle_legendary_res_zek": "BW - ¡Vs Reshiram/Zekrom!",
- "battle_legendary_xern_yvel": "XY - ¡Vs Xerneas/Yveltal!",
- "battle_legendary_tapu": "SM - ¡Vs Tapus!",
- "battle_legendary_sol_lun": "SM - ¡Vs Solgaleo/Lunala!",
- "battle_legendary_ub": "SM - ¡Vs Ultraentes!",
- "battle_legendary_dusk_dawn": "USUM - ¡Vs Necrozma Melena Crepuscular/Alas del Alba!",
- "battle_legendary_ultra_nec": "USUM - ¡Vs Ultra-Necrozma!",
- "battle_legendary_zac_zam": "SWSH - ¡Vs Zacian/Zamazenta!",
- "battle_legendary_glas_spec": "SWSH - ¡Vs Glastrier/Spectrier!",
- "battle_legendary_calyrex": "SWSH - ¡Vs Calyrex!",
- "battle_legendary_birds_galar": "SWSH - ¡Vs Aves Legendarias de Galar!",
- "battle_legendary_ruinous": "SV - ¡Vs Tesoros Funestos!",
- "battle_legendary_kor_mir": "SV Depths of Area Zero Battle",
- "battle_legendary_loyal_three": "SV - ¡Vs Compatrones!",
- "battle_legendary_ogerpon": "SV - ¡Vs Ogerpon!",
- "battle_legendary_terapagos": "SV - ¡Vs Terapagos!",
- "battle_legendary_pecharunt": "SV - ¡Vs Pecharunt!",
- "battle_rival": "BW - ¡Vs Rival!",
+ "battle_final": "BW - ¡Vs. Ghechis!",
+ "battle_kanto_gym": "B2W2 - ¡Vs. Líder de Kanto!",
+ "battle_johto_gym": "B2W2 - ¡Vs. Líder de Johto!",
+ "battle_hoenn_gym": "B2W2 - ¡Vs. Líder de Hoenn!",
+ "battle_sinnoh_gym": "B2W2 - ¡Vs. Líder de Sinnoh!",
+ "battle_unova_gym": "BW - ¡Vs. Líder de Teselia!",
+ "battle_kalos_gym": "XY - ¡Vs. Líder de Kalos!",
+ "battle_galar_gym": "SWSH - ¡Vs. Líder de Galar!",
+ "battle_paldea_gym": "SV - ¡Vs. Líder de Paldea!",
+ "battle_legendary_kanto": "XY - ¡Vs. Legendarios de Kanto!",
+ "battle_legendary_raikou": "HGSS - ¡Vs. Raikou!",
+ "battle_legendary_entei": "HGSS - ¡Vs. Entei!",
+ "battle_legendary_suicune": "HGSS - ¡Vs. Suicune!",
+ "battle_legendary_lugia": "HGSS - ¡Vs. Lugia!",
+ "battle_legendary_ho_oh": "HGSS - ¡Vs. Ho-oh!",
+ "battle_legendary_regis_g5": "B2W2 - ¡Vs. Regis!",
+ "battle_legendary_regis_g6": "ORAS - ¡Vs. Regis!",
+ "battle_legendary_gro_kyo": "ORAS - ¡Vs. Groudon/Kyogre!",
+ "battle_legendary_rayquaza": "ORAS - ¡Vs. Rayquaza!",
+ "battle_legendary_deoxys": "ORAS - ¡Vs. Deoxys!",
+ "battle_legendary_lake_trio": "ORAS - ¡Vs. trío del Lago!",
+ "battle_legendary_sinnoh": "ORAS - ¡Vs. legendarios de Sinnoh!",
+ "battle_legendary_dia_pal": "ORAS - ¡Vs. Dialga/Palkia!",
+ "battle_legendary_origin_forme": "LA - ¡Vs. Dialga & Palkia, Forma Origen!",
+ "battle_legendary_giratina": "ORAS - ¡Vs. Giratina!",
+ "battle_legendary_arceus": "HGSS - ¡Vs. Arceus!",
+ "battle_legendary_unova": "BW - ¡Vs. legendarios de Teselia!",
+ "battle_legendary_kyurem": "BW - ¡Vs. Kyurem!",
+ "battle_legendary_res_zek": "BW - ¡Vs. Reshiram/Zekrom!",
+ "battle_legendary_xern_yvel": "XY - ¡Vs. Xerneas/Yveltal!",
+ "battle_legendary_tapu": "SM - ¡Vs. Tapus!",
+ "battle_legendary_sol_lun": "SM - ¡Vs. Solgaleo/Lunala!",
+ "battle_legendary_ub": "SM - ¡Vs. Ultraentes!",
+ "battle_legendary_dusk_dawn": "USUM - ¡Vs. Necrozma Melena Crepuscular/Alas del Alba!",
+ "battle_legendary_ultra_nec": "USUM - ¡Vs. Ultra-Necrozma!",
+ "battle_legendary_zac_zam": "SWSH - ¡Vs. Zacian/Zamazenta!",
+ "battle_legendary_glas_spec": "SWSH - ¡Vs. Glastrier/Spectrier!",
+ "battle_legendary_calyrex": "SWSH - ¡Vs. Calyrex!",
+ "battle_legendary_riders": "SWSH - ¡Vs. Calyrex Jinete!",
+ "battle_legendary_birds_galar": "SWSH - ¡Vs. Aves Legendarias de Galar!",
+ "battle_legendary_ruinous": "SV - ¡Vs. Tesoros Funestos!",
+ "battle_legendary_kor_mir": "SV - ¡Batalla en el área Zero!",
+ "battle_legendary_loyal_three": "SV - ¡Vs. Compatrones!",
+ "battle_legendary_ogerpon": "SV - ¡Vs. Ogerpon!",
+ "battle_legendary_terapagos": "SV - ¡Vs. Terapagos!",
+ "battle_legendary_pecharunt": "SV - ¡Vs. Pecharunt!",
+ "battle_rival": "BW - ¡Vs. Rival!",
"battle_rival_2": "BW - ¡Vs N!",
- "battle_rival_3": "BW - ¡Vs N (Liga Pokémon)!",
- "battle_trainer": "BW - ¡Vs Entrenador!",
- "battle_wild": "BW - ¡Vs Pokémon Salvaje!",
- "battle_wild_strong": "BW - ¡Vs Pokémon Salvaje Raro!",
- "end_summit": "PMD RTDX - Techo del Cielo",
- "battle_rocket_grunt": "HGSS Team Rocket Battle",
- "battle_aqua_magma_grunt": "ORAS Team Aqua & Magma Battle",
- "battle_galactic_grunt": "BDSP Team Galactic Battle",
+ "battle_rival_3": "BW - ¡Vs. N (Liga Pokémon)!",
+ "battle_trainer": "BW - ¡Vs. entrenador!",
+ "battle_wild": "BW - ¡Vs. Pokémon salvaje!",
+ "battle_wild_strong": "BW - ¡Vs. Pokémon salvaje raro!",
+ "end_summit": "PMD RTDX - Techo del cielo",
+ "battle_rocket_grunt": "HGSS - ¡Vs. Team Rocket!",
+ "battle_aqua_magma_grunt": "ORAS - ¡Vs. Equipo Aqua & Magma!",
+ "battle_galactic_grunt": "BDSP - ¡Vs. Equipo Galaxia!",
"battle_plasma_grunt": "BW - ¡Vs Equipo Plasma!",
- "battle_flare_grunt": "XY Team Flare Battle",
- "battle_aether_grunt": "SM Aether Foundation Battle",
- "battle_skull_grunt": "SM Team Skull Battle",
- "battle_macro_grunt": "SWSH Trainer Battle",
- "battle_galactic_admin": "BDSP Team Galactic Admin Battle",
- "battle_skull_admin": "SM Team Skull Admin Battle",
- "battle_oleana": "SWSH Oleana Battle",
- "battle_rocket_boss": "USUM Giovanni Battle",
- "battle_aqua_magma_boss": "ORAS Archie & Maxie Battle",
- "battle_galactic_boss": "BDSP Cyrus Battle",
- "battle_plasma_boss": "B2W2 Ghetsis Battle",
- "battle_flare_boss": "XY Lysandre Battle",
-
+ "battle_flare_grunt": "XY - ¡Vs. Team Flare!",
+ "battle_aether_grunt": "SM - ¡Vs. Fundación Æther!",
+ "battle_skull_grunt": "SM - ¡Vs. Team Skull!",
+ "battle_macro_grunt": "SWSH - ¡Vs. entrenador!",
+ "battle_galactic_admin": "BDSP - ¡Vs. Comandante del Equipo Galaxia!",
+ "battle_skull_admin": "SM - ¡Vs. Comandante del Team Skull!",
+ "battle_oleana": "SWSH - ¡Vs. Olivia!",
+ "battle_rocket_boss": "USUM - ¡Vs. Giovanni!",
+ "battle_aqua_magma_boss": "ORAS - ¡Vs. Aquiles & Magno!",
+ "battle_galactic_boss": "BDSP - ¡Vs. Helio!",
+ "battle_plasma_boss": "B2W2 - ¡Vs. Ghechis Armonia!",
+ "battle_flare_boss": "XY - ¡Vs. Lysson!",
+ "battle_aether_boss": "SM - ¡Vs. Samina!",
+ "battle_skull_boss": "SM - ¡Vs. Guzmán!",
+ "battle_macro_boss": "SWSH - ¡Vs. Rose!",
"abyss": "PMD EoS - Cráter Oscuro",
"badlands": "PMD EoS - Valle Desolado",
"beach": "PMD EoS - Risco Calado",
@@ -105,40 +109,40 @@
"graveyard": "PMD EoS - Bosque Misterio",
"ice_cave": "PMD EoS - Gran Iceberg",
"island": "PMD EoS - Costa Escarpada",
- "jungle": "Lmz - Jungle",
- "laboratory": "Firel - Laboratory",
+ "jungle": "Lmz - Jungla",
+ "laboratory": "Firel - Laboratorio",
"lake": "PMD EoS - Cueva Cristal",
"meadow": "PMD EoS - Bosque de la Cumbre del Cielo",
- "metropolis": "Firel - Metropolis",
+ "metropolis": "Firel - Metrópolis",
"mountain": "PMD EoS - Monte Cuerno",
"plains": "PMD EoS - Pradera de la Cumbre del Cielo",
"power_plant": "PMD EoS - Pradera Destello",
"ruins": "PMD EoS - Sima Hermética",
- "sea": "Andr06 - Marine Mystique",
- "seabed": "Firel - Seabed",
- "slum": "Andr06 - Sneaky Snom",
+ "sea": "Andr06 - Misticismo marino",
+ "seabed": "Firel - Lecho del mar",
+ "slum": "Andr06 - Snom sigiloso",
"snowy_forest": "PMD EoS - Campo nevado de la Cumbre del Cielo",
- "space": "Firel - Aether",
+ "space": "Firel - Æther ",
"swamp": "PMD EoS - Mar Circundante",
"tall_grass": "PMD EoS - Bosque Niebla",
"temple": "PMD EoS - Cueva Regia",
"town": "PMD EoS - Tema del territorio aleatorio 3",
"volcano": "PMD EoS - Cueva Vapor",
"wasteland": "PMD EoS - Corazón Tierra Oculta",
- "encounter_ace_trainer": "BW - Desafío Combate (Entrenador Guay)",
- "encounter_backpacker": "BW - Desafío Combate (Mochilero)",
- "encounter_clerk": "BW - Desafío Combate (Empresario)",
- "encounter_cyclist": "BW - Desafío Combate (Ciclista)",
- "encounter_lass": "BW - Desafío Combate (Chica)",
- "encounter_parasol_lady": "BW - Desafío Combate (Dama parasol)",
- "encounter_pokefan": "BW - Desafío Combate (Pokéfan)",
- "encounter_psychic": "BW - Desafío Combate (Médium)",
- "encounter_rich": "BW - Desafío Combate (Aristócrata)",
- "encounter_rival": "BW - Desafío Combate (Cheren)",
- "encounter_roughneck": "BW - Desafío Combate (Calvo)",
- "encounter_scientist": "BW - Desafío Combate (Científico)",
- "encounter_twins": "BW - Desafío Combate (Gemelas)",
- "encounter_youngster": "BW - Desafío Combate (Joven)",
+ "encounter_ace_trainer": "BW - ¡Vs. entrenador guay!",
+ "encounter_backpacker": "BW - ¡Vs. mochilero!",
+ "encounter_clerk": "BW - ¡Vs. empresario!",
+ "encounter_cyclist": "BW - ¡Vs. ciclista!",
+ "encounter_lass": "BW - ¡Vs. chica joven!",
+ "encounter_parasol_lady": "BW - ¡Vs. dama parasol!",
+ "encounter_pokefan": "BW - ¡Vs. poké-fan!",
+ "encounter_psychic": "BW -¡Vs. médium!",
+ "encounter_rich": "BW - ¡Vs. aristócrata!",
+ "encounter_rival": "BW - ¡Vs. Cheren!",
+ "encounter_roughneck": "BW - ¡Vs. tío chungo!",
+ "encounter_scientist": "BW - ¡Vs. científico!",
+ "encounter_twins": "BW - ¡Vs. gemelas!",
+ "encounter_youngster": "BW - ¡Vs. chico joven!",
"heal": "BW - Cura Pokémon",
"menu": "PMD EoS - ¡Bienvenidos al mundo de los Pokémon!",
"title": "PMD EoS - Tema del menú principal"
diff --git a/src/locales/es/challenges.json b/src/locales/es/challenges.json
index a855f3dbc2b..6a7db8c10c3 100644
--- a/src/locales/es/challenges.json
+++ b/src/locales/es/challenges.json
@@ -18,5 +18,12 @@
"name": "Monotipo",
"desc": "Solo puedes usar Pokémon with the {{type}} type.",
"desc_default": "Solo puedes usar Pokémon del tipo elegido."
+ },
+ "inverseBattle": {
+ "name": "Combate Inverso",
+ "shortName": "Inverso",
+ "desc": "La efectividad de los tipos es invertida. No hay inmunidades entre tipos.\nEste reto deshabilita logros de otros retos.",
+ "value.0": "Desactivado",
+ "value.1": "Activado"
}
}
\ No newline at end of file
diff --git a/src/locales/es/config.ts b/src/locales/es/config.ts
index edc7dd8b0d7..8f75c08f3f6 100644
--- a/src/locales/es/config.ts
+++ b/src/locales/es/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const esConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/ca_ES/dialogue-final-boss-male.json b/src/locales/es/dialogue-double-battle.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-final-boss-male.json
rename to src/locales/es/dialogue-double-battle.json
diff --git a/src/locales/ca_ES/dialogue-male.json b/src/locales/es/dialogue-final-boss.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-male.json
rename to src/locales/es/dialogue-final-boss.json
diff --git a/src/locales/es/dialogue-male.json b/src/locales/es/dialogue-male.json
deleted file mode 100644
index cbd7dbf39ad..00000000000
--- a/src/locales/es/dialogue-male.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "aether_grunt": {
- "encounter": {
- "1": "¡Lucharé con toda mi fuerza para detenerte!",
- "2": "Me da igual que seas un crío. Eres una amenaza y debes irte.",
- "3": "Me dijeron que mandara a todos los entrenadores por donde venían, ¡sin excepciones!",
- "4": "¡Te mostraré el poder del Paraíso Æther!",
- "5": "Ahora que conoces la oscuridad en lo profundo del Paraíso Æther, es hora de que vayas desapareciendo..."
- },
- "victory": {
- "1": "¡Vaya! Demuestras habilidad.",
- "2": "¿Qué quiere decir esto? ¿Eh?",
- "3": "¡Vaya! Con esa fuerza, ¡no creo que pueda detenerte!",
- "4": "Vaya... parece que puede que haya perdido.",
- "5": "¡Mira, te hago una mueca!: ¡Aiyee!"
- }
- },
- "faba": {
- "encounter": {
- "1": "¡Yo, Subdirector Fabio, te mostraré la cruda realidad del mundo!",
- "2": "¿Yo, la última línea de defensa de Æther, battallando a un mero crío?",
- "3": "Yo, Fabio, soy el Subdirector de la Fundación Æther. Soy el único en el mundo, soy irremplazable."
- },
- "victory": {
- "1": "¡Aaaah!",
- "2": "¿C-c-cómo puede ser? Eres tan solo un niño...",
- "3": "Este... este es el motivo por el que odio a los niños."
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "¡Vas a asustar a mi pobre criatura! Parece que tendré que silenciarte cuanto antes."
- },
- "victory": {
- "1": "¿Cómo?¿Cómo puedes ser tan terrible?"
- },
- "defeat": {
- "1": "Buff."
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "¡¿Por qué me sigues molestando?! Estoy cansada de ti. ¡Hasta las narices!\n$Se acabó esta charla innecesaria. Este es el poder de Nihilego, ¡te demostraré cuánto te equivocas al venir aquí!"
- },
- "victory": {
- "1": "¡¡¡Aaauuuggghhhhhhhhh!!!"
- },
- "defeat": {
- "1": "¡Todo lo que quiero es a esta preciosa criatura! ¡Los demás no me importáis!"
- }
- }
-}
diff --git a/src/locales/ca_ES/dialogue-misc-female.json b/src/locales/es/dialogue-misc.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-misc-female.json
rename to src/locales/es/dialogue-misc.json
diff --git a/src/locales/es/dialogue-female.json b/src/locales/es/dialogue.json
similarity index 100%
rename from src/locales/es/dialogue-female.json
rename to src/locales/es/dialogue.json
diff --git a/src/locales/es/game-mode.json b/src/locales/es/game-mode.json
index e7925900253..0dbccb45e1f 100644
--- a/src/locales/es/game-mode.json
+++ b/src/locales/es/game-mode.json
@@ -1,8 +1,8 @@
{
- "classic": "Clásica",
- "endless": "Infinita",
- "endlessSpliced": "Infinita (Fusión)",
- "dailyRun": "Diaria",
- "unknown": "Desconicido",
+ "classic": "Clásico",
+ "endless": "Infinito",
+ "endlessSpliced": "Infinito (Fusión)",
+ "dailyRun": "Diario",
+ "unknown": "Desconocido",
"challenge": "Desafío"
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/modifier-type.json b/src/locales/es/modifier-type.json
index 95325788bf4..e18cb19244d 100644
--- a/src/locales/es/modifier-type.json
+++ b/src/locales/es/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Duplica la posibilidad de que un encuentro sea una combate doble durante {{battleCount}} combates."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Aumenta la est. {{tempBattleStatName}} de todos los miembros del equipo en 1 nivel durante 5 combates."
+ "TempStatStageBoosterModifierType": {
+ "description": "Aumenta la est. {{stat}} de todos los miembros del equipo en 1 nivel durante 5 combates."
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta la potencia de los movimientos de tipo {{moveType}} de un Pokémon en un 20%."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Aumenta el nivel de todos los miembros del equipo en {{levels}}."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Aumenta la est. {{statName}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación."
+ "BaseStatBoosterModifierType": {
+ "description": "Aumenta la est. {{stat}} base del portador en un 10%.\nCuanto mayores sean tus IVs, mayor será el límite de acumulación."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Restaura el 100% de los PS de todos los Pokémon."
@@ -248,6 +248,12 @@
"name": "Periscopio",
"description": "Aumenta la probabilidad de asestar un golpe crítico."
},
+ "DIRE_HIT": {
+ "name": "Crítico X",
+ "extra": {
+ "raises": "Critical Hit Ratio"
+ }
+ },
"LEEK": {
"name": "Puerro",
"description": "Puerro muy largo y duro que aumenta la probabilidad de asestar un golpe crítico. Debe llevarlo Farfetch'd."
@@ -411,25 +417,13 @@
"description": "Polvo muy fino, pero a la vez poderoso, que aumenta la Velocidad. Debe llevarlo Ditto."
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "Ataque X",
"x_defense": "Defensa X",
"x_sp_atk": "Ataq. Esp. X",
"x_sp_def": "Def. Esp. X",
"x_speed": "Velocidad X",
- "x_accuracy": "Precisión X",
- "dire_hit": "Crítico X"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "Ataque",
- "DEF": "Defensa",
- "SPATK": "Ataq. Esp.",
- "SPDEF": "Def. Esp.",
- "SPD": "Velocidad",
- "ACC": "Precisión",
- "CRIT": "Tasa de crítico",
- "EVA": "Evasión",
- "DEFAULT": "???"
+ "x_accuracy": "Precisión X"
},
"AttackTypeBoosterItem": {
"silk_scarf": "Pañuelo seda",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "Disco dragón",
"DARK_MEMORY": "Disco siniestro",
"FAIRY_MEMORY": "Disco hada",
- "BLANK_MEMORY": "Disco en blanco"
+ "NORMAL_MEMORY": "Disco normal"
}
}
diff --git a/src/locales/es/modifier.json b/src/locales/es/modifier.json
index 593b3df2f0f..a94e41a4574 100644
--- a/src/locales/es/modifier.json
+++ b/src/locales/es/modifier.json
@@ -1,3 +1,12 @@
{
- "bypassSpeedChanceApply": "¡Gracias {{itemName}} {{pokemonName}} puede tener prioridad!"
-}
\ No newline at end of file
+ "surviveDamageApply": "{{pokemonNameWithAffix}} ha usado {{typeName}} y ha logrado resistir!",
+ "turnHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
+ "hitHealApply": "{{pokemonNameWithAffix}} ha recuperado unos pocos PS gracias a {{typeName}}!",
+ "pokemonInstantReviveApply": "{{pokemonNameWithAffix}} ha sido revivido gracias a su {{typeName}}!",
+ "pokemonResetNegativeStatStageApply": "Las estadísticas bajadas de {{pokemonNameWithAffix}} fueron restauradas gracias a {{typeName}}!",
+ "moneyInterestApply": "Recibiste intereses de ₽{{moneyAmount}}\ngracias a {{typeName}}!",
+ "turnHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue absorbido\npor {{pokemonName}}'s {{typeName}}!",
+ "contactHeldItemTransferApply": "{{pokemonNameWithAffix}}'s {{itemName}} fue robado por {{pokemonName}}'s {{typeName}}!",
+ "enemyTurnHealApply": "¡{{pokemonNameWithAffix}}\nrecuperó algunos PS!",
+ "bypassSpeedChanceApply": "¡Gracias a su {{itemName}}, {{pokemonName}} puede tener prioridad!"
+}
diff --git a/src/locales/es/move-trigger.json b/src/locales/es/move-trigger.json
index b570f029377..f92b7950a07 100644
--- a/src/locales/es/move-trigger.json
+++ b/src/locales/es/move-trigger.json
@@ -1,4 +1,8 @@
{
+ "switchedTwoStatChanges": "{{pokemonName}} ha intercambiado los cambios en {{firstStat}} y {{secondStat}} con los del objetivo!",
+ "switchedStat": "{{pokemonName}} cambia su {{stat}} por la de su objetivo!",
+ "sharedGuard": "{{pokemonName}} suma su capacidad defensiva a la del objetivo y la reparte equitativamente!",
+ "sharedPower": "{{pokemonName}} suma su capacidad ofensiva a la del objetivo y la reparte equitativamente!",
"isChargingPower": "¡{{pokemonName}} está acumulando energía!",
"burnedItselfOut": "¡El fuego interior de {{pokemonName}} se ha extinguido!",
"startedHeatingUpBeak": "¡{{pokemonName}} empieza\na calentar su pico!",
@@ -7,5 +11,6 @@
"usedUpAllElectricity": "¡{{pokemonName}} ha descargado toda su electricidad!",
"stoleItem": "¡{{pokemonName}} robó el objeto\n{{itemName}} de {{targetName}}!",
"statEliminated": "¡Los cambios en estadísticas fueron eliminados!",
- "revivalBlessing": "¡{{pokemonName}} ha revivido!"
-}
\ No newline at end of file
+ "revivalBlessing": "¡{{pokemonName}} ha revivido!",
+ "safeguard": "¡{{targetName}} está protegido por Velo Sagrado!"
+}
diff --git a/src/locales/es/party-ui-handler.json b/src/locales/es/party-ui-handler.json
index 65552a1e1d5..0e59aee6fd1 100644
--- a/src/locales/es/party-ui-handler.json
+++ b/src/locales/es/party-ui-handler.json
@@ -1,4 +1,9 @@
{
+ "SEND_OUT": "Enviar",
+ "SUMMARY": "Resumen",
+ "CANCEL": "Cancelar",
+ "RELEASE": "Liberar",
+ "APPLY": "Aplicar",
"TEACH": "Enseñar",
"SPLICE": "Fusionar",
"UNSPLICE": "Separar",
@@ -7,23 +12,23 @@
"TRANSFER": "Transferir",
"ALL": "Todo",
"PASS_BATON": "Relevo",
- "UNPAUSE_EVOLUTION": "Reanudar Evolución",
+ "UNPAUSE_EVOLUTION": "Reanudar evolución",
"REVIVE": "Revivir",
"RENAME": "Rename",
"choosePokemon": "Elige a un Pokémon.",
"doWhatWithThisPokemon": "¿Que quieres hacer con este Pokémon?",
- "noEnergy": "¡A {{pokemonName}} no le quedan\nfuerzas para luchar!",
- "hasEnergy": "¡A {{pokemonName}} le quedan\nfuerzas para luchar!",
- "cantBeUsed": "¡{{pokemonName}} no puede usarse\nen este desafío!",
- "tooManyItems": "¡{{pokemonName}} tiene demasiados\nde este objeto!",
+ "noEnergy": "¡A {{pokemonName}} no le\nquedan fuerzas para luchar!",
+ "hasEnergy": "¡A {{pokemonName}} le\nquedan fuerzas para luchar!",
+ "cantBeUsed": "¡{{pokemonName}} no puede usarse en este desafío!",
+ "tooManyItems": "¡{{pokemonName}} tiene\ndemasiado de este objeto!",
"anyEffect": "No tendría ningún efecto.",
- "unpausedEvolutions": "Se reanudó las evoluciones de {{pokemonName}}.",
+ "unpausedEvolutions": "Se reanudaron las evoluciones de {{pokemonName}}.",
"unspliceConfirmation": "¿Seguro que quiere separar a {{fusionName}}\nde {{pokemonName}}? {{fusionName}} se perderá.",
"wasReverted": "{{fusionName}} se revirtió a {{pokemonName}}.",
"releaseConfirmation": "¿Quieres liberar a {{pokemonName}}?",
"releaseInBattle": "¡No puedes liberar un Pokémon que está en batalla!",
"selectAMove": "Selecciona un movimiento.",
- "changeQuantity": "Selecciona un objeto equipado para transferir.\nUsa < y > para cambiar la cantidad.",
+ "changeQuantity": "Selecciona un ítem para transferir.\nUsa < y > para calibrar.",
"selectAnotherPokemonToSplice": "Selecciona otro Pokémon para fusionar.",
"cancel": "Salir",
"able": "Apto",
@@ -36,7 +41,7 @@
"thisIsWhereWePart": "¡Aquí es donde nos despedimos, {{pokemonName}}!",
"illMissYou": "¡Te echaré de menos, {{pokemonName}}!",
"illNeverForgetYou": "¡Nunca te olvidaré, {{pokemonName}}!",
- "untilWeMeetAgain": "¡Hasta que nos volvamos a encontrar, {{pokemonName}}!",
+ "untilWeMeetAgain": "¡Hasta que nos volvamos a\nencontrar, {{pokemonName}}!",
"sayonara": "¡Sayonara, {{pokemonName}}!",
"smellYaLater": "¡Nos vemos luego, {{pokemonName}}!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/pokemon-form-battle.json b/src/locales/es/pokemon-form-battle.json
index 7af01f8f093..d6eed9e93cc 100644
--- a/src/locales/es/pokemon-form-battle.json
+++ b/src/locales/es/pokemon-form-battle.json
@@ -4,5 +4,11 @@
"mega-y": "Mega {{pokemonName}} Y",
"primal": "{{pokemonName}} Primigenio",
"gigantamax": "G-Max {{pokemonName}}",
- "eternamax": "E-Max {{pokemonName}}"
-}
\ No newline at end of file
+ "eternamax": "E-Max {{pokemonName}}",
+ "megaChange": "¡{{preName}} ha mega-evolucionado a {{pokemonName}}!",
+ "gigantamaxChange": "¡{{preName}} ha gigamaxizado a {{pokemonName}}!",
+ "eternamaxChange": "¡{{preName}} ha eternamaxizado a {{pokemonName}}!",
+ "revertChange": "¡{{pokemonName}} ha revertido a su forma original!",
+ "formChange": "¡{{preName}} ha cambiado de forma!",
+ "disguiseChange": "¡El disfraz ha actuado como señuelo!"
+}
diff --git a/src/locales/es/pokemon-form.json b/src/locales/es/pokemon-form.json
index c46521d78da..2f70038ad2d 100644
--- a/src/locales/es/pokemon-form.json
+++ b/src/locales/es/pokemon-form.json
@@ -7,6 +7,7 @@
"pikachuToughCosplay": "Enmascarada",
"pikachuPartner": "Compañero",
"eeveePartner": "Compañero",
+ "pichuSpiky": "Picoreja",
"unownA": "A",
"unownB": "B",
"unownC": "C",
@@ -49,6 +50,8 @@
"rotomFrost": "Frío",
"rotomFan": "Ventilador",
"rotomMow": "Corte",
+ "giratinaAltered": "Modificada",
+ "shayminLand": "Tierra",
"basculinRedStriped": "Raya Roja",
"basculinBlueStriped": "Raya Azul",
"basculinWhiteStriped": "Raya Blanca",
@@ -56,6 +59,10 @@
"deerlingSummer": "Verano",
"deerlingAutumn": "Otoño",
"deerlingWinter": "Invierno",
+ "tornadusIncarnate": "Avatar",
+ "thundurusIncarnate": "Avatar",
+ "landorusIncarnate": "Avatar",
+ "keldeoOrdinary": "Habitual",
"meloettaAria": "Lírica",
"meloettaPirouette": "Danza",
"froakieBattleBond": "Fuerte Afecto",
@@ -87,12 +94,12 @@
"furfrouHeart": "Corazón",
"furfrouStar": "Estrella",
"furfrouDiamond": "Diamante",
- "furfrouDebutante": "Debutante",
- "furfrouMatron": "Matrón",
- "furfrouDandy": "Dandi",
- "furfrouLaReine": "La Reine",
+ "furfrouDebutante": "Señorita",
+ "furfrouMatron": "Dama",
+ "furfrouDandy": "Caballero",
+ "furfrouLaReine": "Aristócrata",
"furfrouKabuki": "Kabuki",
- "furfrouPharaoh": "Faraón",
+ "furfrouPharaoh": "Faraónico",
"pumpkabooSmall": "Pequeño",
"pumpkabooLarge": "Grande",
"pumpkabooSuper": "Enorme",
@@ -127,11 +134,15 @@
"magearnaOriginal": "Vetusto",
"marshadowZenith": "Cénit",
"sinisteaPhony": "Falsificada",
- "sinisteaAntique": "Auténtica",
+ "sinisteaAntique": "Genuina",
"eiscueNoIce": "Cara Deshielo",
"indeedeeMale": "Macho",
"indeedeeFemale": "Hembra",
+ "morpekoFullBelly": "Saciada",
+ "zacianHeroOfManyBattles": "Guerrero avezado",
+ "zamazentaHeroOfManyBattles": "Guerrero avezado",
"zarudeDada": "Papá",
+ "enamorusIncarnate": "Avatar",
"squawkabillyGreenPlumage": "Plumaje Verde",
"squawkabillyBluePlumage": "Plumaje Azul",
"squawkabillyYellowPlumage": "Plumaje Amarillo",
@@ -141,9 +152,19 @@
"tatsugiriStretchy": "Estirada",
"gimmighoulChest": "Cofre",
"gimmighoulRoaming": "Andante",
- "poltchageistCounterfeit": "Imitación",
- "poltchageistArtisan": "Original",
+ "koraidonApexBuild": "Forma Plena",
+ "koraidonLimitedBuild": "Forma Limitada",
+ "koraidonSprintingBuild": "Forma Carrera",
+ "koraidonSwimmingBuild": "Forma Nado",
+ "koraidonGlidingBuild": "Forma Planeo",
+ "miraidonUltimateMode": "Modo Pleno",
+ "miraidonLowPowerMode": "Modo Limitado",
+ "miraidonDriveMode": "Modo Conducción",
+ "miraidonAquaticMode": "Modo Flote",
+ "miraidonGlideMode": "Modo Planeo",
+ "poltchageistCounterfeit": "Fraudulenta",
+ "poltchageistArtisan": "Opulenta",
"paldeaTaurosCombat": "Combatiente",
"paldeaTaurosBlaze": "Ardiente",
"paldeaTaurosAqua": "Acuático"
-}
\ No newline at end of file
+}
diff --git a/src/locales/es/settings.json b/src/locales/es/settings.json
index 9c16fbb0fd6..dc441d48eb8 100644
--- a/src/locales/es/settings.json
+++ b/src/locales/es/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "Controles táctiles",
"shopOverlayOpacity": "Opacidad de la fase de compra",
"shopCursorTarget": "Cursor de la tienda",
- "items": "Objetos",
+ "rewards": "Objetos",
"reroll": "Actualizar",
"shop": "Tienda",
"checkTeam": "Ver equipo"
diff --git a/src/locales/es/splash-messages.json b/src/locales/es/splash-messages.json
index 90ce3593b89..b1d4820b06e 100644
--- a/src/locales/es/splash-messages.json
+++ b/src/locales/es/splash-messages.json
@@ -3,12 +3,12 @@
"joinTheDiscord": "¡Únete al Discord!",
"infiniteLevels": "¡Niveles infinitos!",
"everythingStacks": "¡Todo se acumula!",
- "optionalSaveScumming": "¡Trampas guardando (¡opcionales!)!",
+ "optionalSaveScumming": "¡Trampas de guardado opcionales!",
"biomes": "¡35 biomas!",
"openSource": "¡Código abierto!",
"playWithSpeed": "¡Juega a velocidad 5x!",
- "liveBugTesting": "¡Arreglo de bugs sobre la marcha!",
- "heavyInfluence": "¡Influencia Alta en RoR2!",
+ "liveBugTesting": "¡Testeo de bugs en directo!",
+ "heavyInfluence": "¡Mucha Influencia de RoR2!",
"pokemonRiskAndPokemonRain": "¡Pokémon Risk y Pokémon Rain!",
"nowWithMoreSalt": "¡Con un 33% más de polémica!",
"infiniteFusionAtHome": "¡Infinite Fusion en casa!",
@@ -17,16 +17,16 @@
"mubstitute": "¡Mubstituto!",
"thatsCrazy": "¡De locos!",
"oranceJuice": "¡Zumo de narancia!",
- "questionableBalancing": "¡Balance cuestionable!",
+ "questionableBalancing": "¡Cambios en balance cuestionables!",
"coolShaders": "¡Shaders impresionantes!",
"aiFree": "¡Libre de IA!",
"suddenDifficultySpikes": "¡Saltos de dificultad repentinos!",
"basedOnAnUnfinishedFlashGame": "¡Basado en un juego Flash inacabado!",
- "moreAddictiveThanIntended": "¡Más adictivo de la cuenta!",
+ "moreAddictiveThanIntended": "¡Más adictivo de lo previsto!",
"mostlyConsistentSeeds": "¡Semillas CASI consistentes!",
"achievementPointsDontDoAnything": "¡Los Puntos de Logro no hacen nada!",
"youDoNotStartAtLevel": "¡No empiezas al nivel 2000!",
- "dontTalkAboutTheManaphyEggIncident": "¡No hablen del incidente del Huevo Manaphy!",
+ "dontTalkAboutTheManaphyEggIncident": "¡No se habla del Incidente Manaphy!",
"alsoTryPokengine": "¡Prueba también Pokéngine!",
"alsoTryEmeraldRogue": "¡Prueba también Emerald Rogue!",
"alsoTryRadicalRed": "¡Prueba también Radical Red!",
diff --git a/src/locales/es/terrain.json b/src/locales/es/terrain.json
index 9e26dfeeb6e..912f5186180 100644
--- a/src/locales/es/terrain.json
+++ b/src/locales/es/terrain.json
@@ -1 +1,16 @@
-{}
\ No newline at end of file
+{
+ "misty": "Niebla",
+ "mistyStartMessage": "¡La niebla ha envuelto el terreno de combate!",
+ "mistyClearMessage": "La niebla se ha disipado.",
+ "mistyBlockMessage": "¡El campo de niebla ha protegido a {{pokemonNameWithAffix}} ",
+ "electric": "Eléctrico",
+ "electricStartMessage": "¡Se ha formado un campo de corriente eléctrica en el terreno\nde combate!",
+ "electricClearMessage": "El campo de corriente eléctrica ha desaparecido.\t",
+ "grassy": "Hierba",
+ "grassyStartMessage": "¡El terreno de combate se ha cubierto de hierba!",
+ "grassyClearMessage": "La hierba ha desaparecido.",
+ "psychic": "Psíquico",
+ "psychicStartMessage": "¡El terreno de combate se ha vuelto muy extraño!",
+ "psychicClearMessage": "Ha desaparecido la extraña sensación que se percibía en el terreno\nde combate.",
+ "defaultBlockMessage": "¡El campo {{terrainName}} ha protegido a {{pokemonNameWithAffix}} "
+}
diff --git a/src/locales/es/trainer-names.json b/src/locales/es/trainer-names.json
index c6758366db7..ce09a0c9037 100644
--- a/src/locales/es/trainer-names.json
+++ b/src/locales/es/trainer-names.json
@@ -1,7 +1,7 @@
{
"brock": "Brock",
"misty": "Misty",
- "lt_surge": "Tt. Surge",
+ "lt_surge": "Teniente Surge",
"erika": "Erika",
"janine": "Sachiko",
"sabrina": "Sabrina",
@@ -23,7 +23,7 @@
"winona": "Alana",
"tate": "Vito",
"liza": "Leti",
- "juan": "Galán",
+ "juan": "Galano",
"roark": "Roco",
"gardenia": "Gardenia",
"maylene": "Brega",
@@ -34,7 +34,7 @@
"volkner": "Lectro",
"cilan": "Millo",
"chili": "Zeo",
- "cress": "Maiz",
+ "cress": "Maíz",
"cheren": "Cheren",
"lenora": "Aloe",
"roxie": "Hiedra",
@@ -57,7 +57,7 @@
"nessa": "Cathy",
"kabu": "Naboru",
"bea": "Judith",
- "allister": "Allistair",
+ "allister": "Alistair",
"opal": "Sally",
"bede": "Berto",
"gordie": "Morris",
@@ -123,30 +123,28 @@
"leon": "Lionel",
"rival": "Finn",
"rival_female": "Ivy",
- "archer": "Archer",
- "ariana": "Ariana",
- "proton": "Proton",
+ "archer": "Atlas",
+ "ariana": "Atenea",
+ "proton": "Protón",
"petrel": "Petrel",
- "tabitha": "Tabitha",
- "courtney": "Courtney",
- "shelly": "Shelly",
- "matt": "Matt",
- "mars": "Mars",
- "jupiter": "Jupiter",
- "saturn": "Saturn",
- "zinzolin": "Zinzolin",
- "rood": "Rood",
- "xerosic": "Xerosic",
- "bryony": "Bryony",
+ "tabitha": "Tatiano",
+ "courtney": "Carola",
+ "shelly": "Silvina",
+ "matt": "Matías",
+ "mars": "Venus",
+ "jupiter": "Ceres",
+ "saturn": "Saturno",
+ "zinzolin": "Menek",
+ "rood": "Ruga",
+ "xerosic": "Xero",
+ "bryony": "Begonia",
+ "maxie": "Magno",
+ "archie": "Aquiles",
+ "cyrus": "Helio",
+ "ghetsis": "Ghechis",
+ "lysandre": "Lysson",
"faba": "Fabio",
-
- "maxie": "Maxie",
- "archie": "Archie",
- "cyrus": "Cyrus",
- "ghetsis": "Ghetsis",
- "lysandre": "Lysandre",
"lusamine": "Samina",
-
"blue_red_double": "Azul y Rojo",
"red_blue_double": "Rojo y Azul",
"tate_liza_double": "Vito y Leti",
diff --git a/src/locales/fr/achv.json b/src/locales/fr/achv.json
index f83fa3079f2..3e95f9326ca 100644
--- a/src/locales/fr/achv.json
+++ b/src/locales/fr/achv.json
@@ -92,7 +92,7 @@
"name": "Master Maitre de la Ligue",
"name_female": "Master Maitresse de la Ligue"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Travail d’équipe",
"description": "Utiliser Relais avec au moins une statistique montée à fond."
},
@@ -274,5 +274,9 @@
"FRESH_START": {
"name": "Du premier coup !",
"description": "Terminer un challenge « Nouveau départ »."
+ },
+ "INVERSE_BATTLE": {
+ "name": "La teuté à verlan",
+ "description": "Terminer un challenge en Combat Inversé.\nMineter un lenjcha en Ba-con Versin."
}
}
diff --git a/src/locales/fr/arena-tag.json b/src/locales/fr/arena-tag.json
index 16355816ae4..c3c705290fa 100644
--- a/src/locales/fr/arena-tag.json
+++ b/src/locales/fr/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "Le vent arrière soufflant\nsur votre équipe s’arrête !",
"tailwindOnRemoveEnemy": "Le vent arrière soufflant\nsur l’équipe ennemie s’arrête !",
"happyHourOnAdd": "L’ambiance est euphorique !",
- "happyHourOnRemove": "L’ambiance se calme !"
+ "happyHourOnRemove": "L’ambiance se calme !",
+ "safeguardOnAdd": "Un voile mystérieux recouvre\ntout le terrain !",
+ "safeguardOnAddPlayer": "Un voile mystérieux recouvre\nvotre équipe !",
+ "safeguardOnAddEnemy": "Un voile mystérieux recouvre\nl’équipe ennemie !",
+ "safeguardOnRemove": "Le terrain n’est plus protégé\npar le voile mystérieux !",
+ "safeguardOnRemovePlayer": "Votre équipe n’est plus protégée\npar le voile mystérieux !",
+ "safeguardOnRemoveEnemy": "L’équipe ennemie n’est plus protégée\npar le voile mystérieux !"
}
\ No newline at end of file
diff --git a/src/locales/fr/battle.json b/src/locales/fr/battle.json
index 1c108c89ded..b8da3a953ae 100644
--- a/src/locales/fr/battle.json
+++ b/src/locales/fr/battle.json
@@ -94,5 +94,6 @@
"retryBattle": "Voulez-vous réessayer depuis le début du combat ?",
"unlockedSomething": "{{unlockedThing}}\na été débloqué.",
"congratulations": "Félicitations !",
- "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !"
-}
\ No newline at end of file
+ "beatModeFirstTime": "{{speciesName}} a battu le mode {{gameMode}} pour la première fois !\nVous avez reçu {{newModifier}} !",
+ "eggSkipPrompt": "Aller directement au résumé des Œufs éclos ?"
+}
diff --git a/src/locales/fr/challenges.json b/src/locales/fr/challenges.json
index 50a8e34f298..a83ec2e0be4 100644
--- a/src/locales/fr/challenges.json
+++ b/src/locales/fr/challenges.json
@@ -25,5 +25,12 @@
"desc": "Vous ne pouvez choisir que les starters de base du jeu, comme si vous le recommenciez.",
"value.0": "Non",
"value.1": "Oui"
+ },
+ "inverseBattle": {
+ "name": "Combat Inversé",
+ "shortName": "Inversé",
+ "desc": "Les affinités de la table des types sont inversées et plus aucun type n’a d’immunité.\nDésactive les succès des autres challenges.",
+ "value.0": "Non",
+ "value.1": "Oui"
}
}
\ No newline at end of file
diff --git a/src/locales/fr/config.ts b/src/locales/fr/config.ts
index 668812e6432..f79374cd3b9 100644
--- a/src/locales/fr/config.ts
+++ b/src/locales/fr/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const frConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/fr/dialogue-double-battle-male.json b/src/locales/fr/dialogue-double-battle-male.json
deleted file mode 100644
index 188b27ca143..00000000000
--- a/src/locales/fr/dialogue-double-battle-male.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "Blue : Hé Red, montrons-lui de quel bois on se chauffe !\n$Red : …\n$Blue : Voilà la puissance du Bourg Palette !"
- },
- "victory": {
- "1": "Blue : C’était un magnifique combat !\n$Red : …"
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "Red : … !\n$Blue : Il est pas très loquace.\n$Blue : Mais ne te laisse pas avoir, ça reste un Maitre Pokémon !"
- },
- "victory": {
- "1": "Red : … !\n$Blue : La prochaine fois, on va te battre !"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "Lévy : Héhéhé… Tu en fais une drôle de tête.\n$Tatia : Tu ne t’attendais pas à rencontrer deux Champions, n’est-ce pas ?\n$Lévy : Nous sommes des jumeaux !\n$Tatia : Nous n’avons pas besoin de parler entre nous !\n$Lévy : Tu crois pouvoir briser…\n$Tatia : … Notre duo parfait ?"
- },
- "victory": {
- "1": "Lévy : Quoi ? Notre combinaison était parfaite !\n$Tatia : Nous avons encore besoin d’entrainement…"
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "Tatia : Hihih… Si tu voyais ta tête !\n$Lévy : Oui, nous sommes deux Champions en un !\n$Tatia : Voici mon frère, Lévy…\n$Lévy : … Et ma sœur, Tatia !\n$Tatia : Tu ne penses pas que notre combinaison est parfaite ?"
- },
- "victory": {
- "1": "Tatia : Quoi ? Notre combinaison…\n$Lévy : … a échoué !"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "Pierre R. : Marc, montrons-lui la puissance des Maitres !\n$Marc : Tu vas gouter au pouvoir de Hoenn !\n$Pierre R. : C’est parti !"
- },
- "victory": {
- "1": "Pierre R. : C’était un beau combat !\n$Marc : Ce sera notre tour la prochaine fois !"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "Pierre R. : Excuse-moi, aurais-tu des Pokémon rares ?\n$Marc : Pierre… Nous sommes là pour nous battre, pas pour frimer avec nos Pokémon.\n$Pierre R. : Oh… Je vois… Commençons alors !"
- },
- "victory": {
- "1": "Pierre R. : Bien, maintenant que ce combat est clos, montrons-nous nos Pokémon !\n$Marc : Pierre…"
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "Goyah : Nous sommes l’élite des Dresseurs d’Unys !\n$Iris : Rien de mieux que des combats contre des prodiges !"
- },
- "victory": {
- "1": "Goyah : INCROYABLE ! T’es trop doué !\n$Iris : On gagnera la prochaine fois !"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "Iris : Bienvenue, Dresseur ! Je suis LA Maitresse d’Unys !\n$Goyah : Iris, concentre-toi s’il te plait…"
- },
- "victory": {
- "1": "Iris : On a tout donné et pourtant…\n$Goyah : Cette défaite ne pourra que nous être bénéfique !"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "Rosemary : Frérot, montrons-lui la puissance de Smashings !\n$Peterson : Nous sommes les ténèbres !"
- },
- "victory": {
- "1": "Rosemary : T’as amené la lumière dans les ténèbres !\n$Peterson : P’têtre un peu trop…"
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…"
- },
- "victory": {
- "1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
- }
- }
-}
diff --git a/src/locales/fr/dialogue-double-battle-female.json b/src/locales/fr/dialogue-double-battle.json
similarity index 94%
rename from src/locales/fr/dialogue-double-battle-female.json
rename to src/locales/fr/dialogue-double-battle.json
index 55bb5da9800..d35e9d87ced 100644
--- a/src/locales/fr/dialogue-double-battle-female.json
+++ b/src/locales/fr/dialogue-double-battle.json
@@ -73,7 +73,8 @@
},
"marnie_piers_double": {
"encounter": {
- "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
+ "1": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Il est pas là pour chanter, mais se battre…",
+ "1_female": "Peterson : Chauds pour un concert ?\n$Rosemary : Frérot… Elle est pas là pour chanter, mais se battre…"
},
"victory": {
"1": "Peterson : Ça c’est du rock !\n$Rosemary : Frérot…"
diff --git a/src/locales/fr/dialogue-female.json b/src/locales/fr/dialogue-female.json
deleted file mode 100644
index 82e3a4efd46..00000000000
--- a/src/locales/fr/dialogue-female.json
+++ /dev/null
@@ -1,577 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "Hé ! Combat ?",
- "2": "Toi aussi tu débutes ?",
- "3": "Hé, j’me souviens pas de ta tête. Combat !",
- "4": "J’ai perdu, alors j’essaye de capturer d’autres Pokémon.\nHé, t’as l’air faible toi ! Allez, combat !",
- "5": "On s’connait ? J’ai comme un doute. Dans tous les cas, sympa de te rencontrer !",
- "6": "Allez, c’est parti !",
- "7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
- "8": "Coucou… Tu veux voir mes bô Pokémon ?",
- "9": "Trève de mondanités. Ramène-toi quand tu le sens !",
- "10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
- "11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
- "12": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
- "13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
- },
- "victory": {
- "1": "Hé, mais t’es trop forte !",
- "2": "En vrai j’avais aucune chance hein ?",
- "3": "J’te retrouverai un jour, et là j’te battrai !",
- "4": "Arg… J’ai plus aucun Pokémon.",
- "5": "Non… IMPOSSIBLE ! Pourquoi j’ai encore perdu…",
- "6": "Non ! J’ai perdu !",
- "7": "Waah ! T’es trop incroyable ! J’suis bouche bée !",
- "8": "Pourquoi… Comment… Pourtant on est les plus forts, mes Pokémon et moi…",
- "9": "J’perdrai pas la prochaine fois ! Remettons ça un jour !",
- "10": "Weeeesh ! Tu vois que j’suis qu’un gamin ? C’est pas juste de me bully comme ça !",
- "11": "Tes Pokémon sont trop incroyables !\n… P’tit échange ?",
- "12": "Je me suis fait un peu aider plus tôt, mais de quel taf je parlais ?",
- "13": "Ahaha ! Et voilà, ça y est !\nT’es déjà comme chez toi dans ce monde !"
- }
- },
- "lass": {
- "encounter": {
- "1": "Affrontons-nous, d’accord ?",
- "2": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
- "3": "Je te connais pas. Ça te dis de te battre ?",
- "4": "Prenons du bon temps avec ce combat Pokémon !",
- "5": "Je vais t’apprendre à te battre avec tes Pokémon !",
- "6": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
- "7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
- "8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
- "9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
- },
- "victory": {
- "1": "Wah, c’était impressionnant ! J’ai encore beaucoup à apprendre.",
- "2": "Je pensais pas que je perdrais comme ça…",
- "3": "J’espère que j’aurai ma revanche un jour.",
- "4": "C’était super amusant ! Mais ce combat m’a épuisée…",
- "5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
- "6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
- "7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
- "8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
- "9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "Qu’ils soient obéissants ou égoïstes… Les Pokémon ont des caractéristiques uniques.",
- "2": "Même si mes choix et ma personnalité ne sont pas fous, je pense quand même bien avoir élevé mes Pokémon.",
- "3": "Hum, t’es pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter n’est pas bon."
- },
- "victory": {
- "1": "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.",
- "2": "Contrairement à moi, ces Pokémon ont un bon fond.",
- "3": "Trop d’éloges peut ruiner les Pokémon et les gens."
- },
- "defeat": {
- "1": "Tu ne devrais pas t’énerver sur tes Pokémon, même après une défaite.",
- "2": "Alors ? Pas mal mes Pokémon, hein ? Je suis fait pour ça.",
- "3": "Peu importe à quel point t’aimes tes Pokémon, il faut toujours de la discipline s’ils se comportent mal."
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "Les Pokémon ne trahissent jamais. Ils te rendront toujours l’amour que tu leur donne.",
- "2": "Puis-je te donner une astuce pour mieux élever tes Pokémon ?",
- "3": "J’ai élevé mes Pokémon en utilisant une méthode très spéciale."
- },
- "victory": {
- "1": "Arg… C’était pas supposé se passer comme ça. Leur ai-je administré la mauvaise préparation ?",
- "2": "Comment ça a pu arriver…\nAvec quoi nourris-tu tes Pokémon ?",
- "3": "Si je perds, c’est juste pour te dire que je tuais le temps. Mon ego n’est absolument pas touché…"
- },
- "defeat": {
- "1": "C’est la preuve que mes Pokémon reconnaissent tout mon amour.",
- "2": "Le seul secret derrière des Pokémon bien entrainés, c’est surtout d’en capturer des bons.",
- "3": "La force des Pokémon dépend de ta capacité à savoir les élever correctement."
- }
- },
- "fisherman": {
- "encounter": {
- "1": "Aaah non ! J’avais une touche !\nTu comptes faire quoi pour arranger ça ?",
- "2": "Bouge de là ! Tu fais peur aux Pokémon !",
- "3": "Voyons si t’arrives à ferrer une victoire !"
- },
- "victory": {
- "1": "Vas-y là, oublie.",
- "2": "La prochaine fois, je vais me repêcher !",
- "3": "Je présume que j’ai sous-estimé les courants…"
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "Oh la belle prise !",
- "2": "Ma ligne est en place, prête à ferrer le succès !",
- "3": "Prête à faire des vagues !"
- },
- "victory": {
- "1": "Je suppose que je vais avoir besoin d’un plus gros hameçon.",
- "2": "La ligne s’est brisée, j’ai pas pu la ferrer…",
- "3": "Attends que j’aiguise mes hameçons pour la revanche !"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "C’est l’heure de plonger dans le vif !",
- "2": "C’est le moment de surfer sur les vagues de la victoire !",
- "3": "Je vais t’éclabousser de mon talent !"
- },
- "victory": {
- "1": "Tu m’as complètement séché",
- "2": "Il semblerait que ce soit celles de la défaite…",
- "3": "Retour sur la terre ferme je suppose"
- }
- },
- "backpacker": {
- "encounter": {
- "1": "Fais ton sac, on y va !",
- "2": "Voyons si t’arrives à garder le rythme !",
- "3": "Accélère le pas, camarade !",
- "4": "J’ai passé 20 ans à la recherche de moi-même…\nMais où suis-je ?"
- },
- "victory": {
- "1": "J’ai trébuché !",
- "2": "Ah, je crois que je me suis paumé.",
- "3": "Ah, une impasse !",
- "4": "Hé ! Attends une seconde…\nTu saurais pas qui je suis ?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "T’as l’air plutôt confiante.",
- "2": "Tes Pokémon… Montre-les-moi…",
- "3": "Les gens pensent que je suis fort par que je suis un Topdresseur.",
- "4": "T’es au courant de ce que ça signifie d’être un Topdresseur ?"
- },
- "victory": {
- "1": "Très bien… T’as de bons Pokémon…",
- "2": "Quoi ?! Mais c’est moi le génie des combats !",
- "3": "Évidemment que t’es le personnage principal !",
- "4": "OK ! OK ! Tu pourrais être une Topdresseuse !"
- },
- "defeat": {
- "1": "Je me dévoue corps et âme aux combats Pokémon !",
- "2": "Comme prévu… Vraiment aucune surprise…",
- "3": "Et moi qui pensais qu’en grandissant, j’allais rester frêle et fragile, à me briser à la moindre étreinte.",
- "4": "Évidemment que je suis fort et encore moins un perdant. C’est important de gagner avec grâce."
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "Honorons ce terrain de combat avec élégance et équilibre !"
- },
- "victory": {
- "2": "Mon élégance demeure inébranlable !"
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "Nous sommes de retour !",
- "2": "Ça bosse dur, ici ! Alors du balai !",
- "3": "File-nous tes Pokémon ou tu vas gouter à la colère de la Team Rocket !",
- "4": "Sois témoin de ce qu’est une vraie terreur de la Team Rocket!",
- "5": "Hé gamine ! Moi être guy member of la Team Rocket !"
- },
- "victory": {
- "1": "Une fois de plus la Team Rocket s’envole vers d’autres cieux !",
- "2": "Mince! J’ai laissé tomber\nla Clé Ascenseur !",
- "3": "J’ai tout foiré !",
- "4": "Mes compagnons vont me venger !",
- "5": "Toi dire quoi ? Forget que tu m’as vu !\nYou n’as rien seen !"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": "N’espère pas recevoir de la pitié si tu te mets sur le chemin de la Team Magma !",
- "2": "Ne te mêle pas de nos affaires ! On va rendre ce monde meilleur !",
- "3": "Hors de mon chemin ! La Team Magma n’a pas de temps pour les gamins !",
- "4": "J’espère que t’as quelques marshmallows, car ça va chauffer !",
- "5": "On va utiliser le puissance d’un volcan ! Ça va être… explosif ! Tu l’as… ? Héhé !"
- },
- "victory": {
- "1": "Je…?\nJ’ai perdu ?!",
- "2": "Je peux pas croire que j’ai pas pris mon déjeuner juste pour ça…",
- "3": "Impossible ! T’es qu’une gosse !",
- "4": "Aahhh…\nJ’aurais dû directement rentrer à la planque…",
- "5": "Tu m’as démoli… Tu crois que le boss va suspendre mon salaire ?"
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "Aucune pitié si tu te mets sur le chemin de la Team Aqua, même pour un gamin !",
- "2": "Grrr…\nTu as eu le culot de t’opposer à la Team Aqua !",
- "3": "Je vais te liquéfier !\nEt ce sera pas qu’à cause des mes Pokémon Eau !",
- "4": "Nous, la Team Aqua, existons pour le bien commun !",
- "5": "Prépare-toi à te faire emporter par le courant de…\nEuh… Mes Pokémon ! Oui, mes Pokémon !"
- },
- "victory": {
- "1": "Comment ça ?",
- "2": "Ah, j’avais pas prévu d’être gêné par un mouflet qui se mêle de tout !",
- "3": "J’ai perdu ?! Super, j’ai plus qu’à nager jusqu’à la planque maintenant…",
- "4": "Oh non quelle angoisse…\nLe boss va me démonter…",
- "5": "Je suis battu… Tu penses que le boss va me faire subir le supplice de la planche ?…"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "Ne te mets pas en travers de la Team Galaxie !",
- "2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !",
- "3": "Au nom de la Team Galaxie, j’éliminerai quiconque se mettera sur notre route !",
- "4": "Prépare ta défaite !",
- "5": "J’espère que t’es prête à te prendre une raclée de l’espace !"
- },
- "victory": {
- "1": "Désactivation…",
- "2": "Cet échec n’est qu’une poussière face à nos ambitions débordantes.",
- "3": "Notre projet est bien plus important que cette défaite.",
- "4": "Comment ?!",
- "5": "Note à moi-même :\nM’entrainer aux combats Pokémon. Ça urge…"
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "Pas de quatiers à ceux qui ne suivent pas notre idéal !",
- "2": "Si je gagne, tu relâches tous tes Pokémon !",
- "3": "Si tu te mets en travers de la Team Plasma, je m’occuperai de toi personnellement !",
- "4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !",
- "5": "Nos coupes sont lunaires… Mais en combat ?\nTu vas vite le découvrir."
- },
- "victory": {
- "1": "Plasmaaaaaaaaa !",
- "2": "Comment ai-je pu perdre…",
- "3": "… Ce Pokémon est nul, j’vais aller en voler de meilleurs !",
- "4": "Les plans ambitieux connaissent toujours leurs lots d’interruptions.",
- "5": "C’est mauvais… MAUVAIS MAUVAIS MAUVAIS MAUVAIS !\nVa falloir battre en retraite, c’est la méga cata !"
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "Tes Pokémon ne sont pas dignes de l’élégance de la Team Flare.",
- "2": "T’as des lunettes de soleil j’espère ?\nCar prépare-toi à être éblouie !",
- "3": "La Team Flare va purifier ce monde de toute imperfection !",
- "4": "Prépare-toi à découvrir l’indiscutable sens du style de la Team Flare !",
- "5": "La mode, c’est important !"
- },
- "victory": {
- "1": "Mon futur n’a pas l’air si radieux.",
- "2": "Les combats semblent être plus complexes que je le pensais.\nRetour aux planches à dessin.",
- "3": "Ehhhh ?! J’ai perdu ?!",
- "4": "Même dans la défaite, l’élégance de la Team Flare continue de rayonner sur ce monde.",
- "5": "J’appelle pas ça perdre, j’appelle ça échouer avec panache !"
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "Bien. Je dois admettre que je suis impressionné de te voir ici !"
- },
- "victory": {
- "1": "QUOI ? IMPOSSIBLE !"
- },
- "defeat": {
- "1": "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’une gamine."
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "Mes anciens collaborateurs m’attendent.\nComptes-tu m’en empêcher ?"
- },
- "victory": {
- "1": "Comment c’est possible… ? Le grand dessein de la Team Rocket n’est plus qu’une illusion…"
- },
- "defeat": {
- "1": "La Team Rocket renaitra, et je dominerai le monde !"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "Je vais t’enterrer de mes propres mains.\nJ’espère que t’apprécieras cet honneur !"
- },
- "victory": {
- "1": "Gnn… ! Tu… T’as du répondant…\nCe sentiment d’être à la traine, de si peu…"
- },
- "defeat": {
- "1": "La Team Magma vaincra !"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "T’es le dernier rempart entravant mes objectifs.\nPrépare-toi à mon ultime riposte ! Hahahaha !"
- },
- "victory": {
- "1": "Ce… Ce n’est pas… Gnn…"
- },
- "defeat": {
- "1": "L’heure est venue…\nJe vais transformer cette planète en paradis pour l’humanité."
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "Je suis le Leader de la Team Aqua.\nJ’ai bien peur que pour toi, ce soit fin de parcours."
- },
- "victory": {
- "1": "Retrouvons-nous.\nJe me souviendrai de ton visage."
- },
- "defeat": {
- "1": "Magnifique !\nPlus rien ne peut nous retenir !"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "J’ai attendu ce moment depuis si longtemps.\nVoici la vraie puissance de la Team Aqua !"
- },
- "victory": {
- "1": "Comme si j’y avait cru…"
- },
- "defeat": {
- "1": "Je rendrai à ce monde sa pureté originelle !"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "Tu t’es sentie obligée de venir ici dans un acte vide de sens. Je vais te le faire regretter."
- },
- "victory": {
- "1": "Intéressant. Et plutôt curieux."
- },
- "defeat": {
- "1": "Je le créerai, mon nouveau monde…"
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "Nous y revoilà. Il semblerait que nos destinées soient entremêlées. Il est l’heure d’y mettre un terme."
- },
- "victory": {
- "1": "Comment. Comment ?\nCOMMENT ?!"
- },
- "defeat": {
- "1": "Adieu."
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "Je n’accepterai pas qu’on me barre la route !\nPeu importe qui fait quoi !"
- },
- "victory": {
- "1": "Comment ? Je suis le leader de la Team Plasma !\nJe suis parfait !"
- },
- "defeat": {
- "1": "Je suis le parfait monarque d’un monde parfait !\nHahaha !"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "Viens ! Je veux voir ton visage à l’instant même où l’espoir quittera ton corps !"
- },
- "victory": {
- "1": "Mes calculs… Non ! Mes plans étaient parfaits !\nCe monde devrait être mien !"
- },
- "defeat": {
- "1": "Kyurem ! Fusiorption !!!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "Comptes-tu m’arrêter ? Prouve-le."
- },
- "victory": {
- "1": "T’es venu m’arrêter. Mais je te demande d’attendre."
- },
- "defeat": {
- "1": "Les Pokémon… Ne devraient plus exister."
- }
- },
- "brock": {
- "encounter": {
- "1": "Mon expertise des types Roche va te mettre au sol ! En garde !",
- "2": "Tu veux toujours te battre avec moi ? Même en sachant que tu vas perdre ?",
- "3": "Laisse-moi de montrer la véritable force de mes Pokémon Roche !"
- },
- "victory": {
- "1": "J’étais trop sûr de moi, c’est pour ça que j’ai perdu.",
- "2": "Ce monde est vaste ! Je suis honoré d’avoir pu t’affronter.",
- "3": "Peut-être bien que je n’aurais pas dû abandonner ma vocation d’Éleveur…"
- },
- "defeat": {
- "1": "La défense est la meilleure des attaques !\nTelle est ma méthode !",
- "2": "Viens étudier des roches avec moi la prochaine fois si tu veux apprendre à mieux les aborder !",
- "3": "Tout ce temps à voyager autour du monde paie enfin !"
- }
- },
- "misty": {
- "encounter": {
- "1": "Ma tactique ? Attaquer avec des Pokémon Eau !",
- "2": "Je vais te prouver le tsunami que sont mes Pokémon aquatiques !",
- "3": "Mon rêve, c’était de voyager et de défier des Dresseurs super forts. Seras-tu à la hauteur ?"
- },
- "victory": {
- "1": "OK. T’es pas naze… Je le reconnais…",
- "2": "Pfff… T’as juste eu de la chance hein ?!",
- "3": "Ouah ! T’es super balèze !"
- },
- "defeat": {
- "1": "Qu’en dis-tu? C’est ça, la puissance des Pokémon Eau !",
- "2": "J’espère que t’as pris note des élégantes techniques de nage de mes Pokémon !",
- "3": "Tes Pokémon ne jouent visiblement pas dans le même bassin…"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "T’as pas froid aux yeux, soldat ! Les combats Pokémon, c’est la guerre !",
- "2": "Tu as du guts pour venir me fight ici ! Je vais te shock !",
- "3": "Compte tes dents, tu vas morfler !\nMes Pokémon Électrik vont t’atomiser !"
- },
- "victory": {
- "1": "Whoo ! T’iras loin toi.",
- "2": "Oh noes ! Mes tricks électriques sont à plat…\nYou are very fortiche!",
- "3": "Tu es very costaud ! Je vais training very dur mes Pokémon, moi too, et on sera Number One !"
- },
- "defeat": {
- "1": "Oh yeah !\nMes Pokémon Électrik sont les best du monde !",
- "2": "Oh yeah, baby ! I am trop fort !",
- "3": "Une combat Pokémon, c’est comme une guerre et t’as eu droit à une bataille de premier ordre !"
- }
- },
- "erika": {
- "encounter": {
- "1": "Il fait beau, aujourd’hui, n’est-ce pas… ?\nQuoi un combat… ? Très bien…",
- "2": "L’arrangement floral est ma spécialité, et mes Pokémon sont de type Plante. Quoi ? Tu veux te battre ?",
- "3": "Il fait beau… Le soleil brille… Les plantes bourgeonnent… Je m’ennuie…",
- "4": "Voir un tel jardin rempli de fleurs est si apaisant…"
- },
- "victory": {
- "1": "Bien joué, c’est mértié.",
- "2": "Dommage, on s’amusait si bien…",
- "3": "Oh non, le combat est terminé…",
- "4": "Aaah, ça fait du bien !\nMerci, j’en avais besoin."
- },
- "defeat": {
- "1": "J’ai failli m’endormir…",
- "2": "Oh non… Mes Pokémon Plante ont l’air de t’avoir bien endormie…",
- "3": "Ce combat était si apaisant…",
- "4": "Oh non… C’est tout ?"
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "Ton futur ou le mien…\nVoyons lequel mérite plus d’aboutir."
- },
- "victory": {
- "1": "Ohhhh… !"
- },
- "defeat": {
- "1": "Les ignorants sans aucune vision n’auront donc de cesse de souiller ce monde."
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}Ah, te voilà ! Je t’ai cherchée partout ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
- },
- "victory": {
- "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}Ah, je te cherchais ! Je t’ai cherchée partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une conditon. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
- },
- "victory": {
- "1": "@c{shock}Tu viens de commencer et t’es déjà si forte ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
- },
- "victory": {
- "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincue. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
- },
- "victory": {
- "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’était le dernier, terminé les cadeaux après celui-là !\n$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !"
- },
- "defeat": {
- "1": "Je suppose que c’est parfois normal de perdre…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
- },
- "victory": {
- "1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}Ça fait une éternité ! Toujours debout hein ?\n@c{angry}Tu commences à me pousser à bout là. @c{smile_wave_wink}T’inquiètes j’déconne !\n$@c{smile_ehalf}Mais en vrai, ta maison te manque pas ? Ou… Moi ?\nJ… Je veux dire… Tu me manques vraiment beaucoup.\n$@c{smile_eclosed}Je te soutiendrai toujours dans tes ambitions, mais la vérité est que tu finiras par perdre un jour ou l’autre.\n$@c{smile}Quand ça arrivera, je serai là pour toi, comme toujours.\n@c{angry_mopen}Maintenant, montre-moi à quel point t’es devenue forte !"
- },
- "victory": {
- "1": "@c{shock}Après tout ça… Ça te suffit toujours pas… ?\nTu reviendras jamais à ce rythme…"
- },
- "defeat": {
- "1": "T’as fait de ton mieux.\nAllez, rentrons à la maison."
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
- },
- "victory": {
- "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}C’est moi ! Tu m’as pas encore oubliée… n’est-ce pas ?\n$@c{smile}Tu devrais être fière d’être arrivée aussi loin. GG !\nMais c’est certainement pas la fin de ton aventure.\n$@c{smile_eclosed}T’as éveillé en moi quelque chose que j’ignorais.\nTout mon temps passe dans l’entrainement.\n$@c{smile_ehalf}Je dors et je mange à peine, je m’entraine juste tous les jours, et deviens de plus en plus forte.\n$@c{neutral}En vrai, Je… J’ai de la peine à me reconnaitre.\n$Mais maintenant, je suis au top de mes capacités.\nJe doute que tu sois de nouveau capable de me battre.\n$Et tu sais quoi ? Tout ça, c’est de ta faute.\n@c{smile_ehalf}Et j’ignore si je dois te remercier ou te haïr.\n$@c{angry_mopen}Tiens-toi prête."
- },
- "victory": {
- "1": "@c{neutral}Que…@d{64} Qui es-tu ?"
- },
- "defeat": {
- "1": "$@c{smile}Tu devrais être fière d’être arrivé jusque là."
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens à pas me battre ici et maintenant, tu n’as aucune chance."
- },
- "victory": {
- "1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}C’est donc encore entre toi et moi.\n$@c{smile_eclosed}Tu sais, j’ai beau retouner ça dans tous les sens…\n$@c{smile_ehalf}Quelque chose peut expliquer tout ça, pourquoi tout semble si étrange…\n$@c{smile}T’as tes rêves, j’ai mes ambitions…\n$J’ai juste le sentiment qu’il y a un grand dessein derrière tout ça, derrière ce qu’on fait toi et moi.\n$@c{smile_eclosed}Je crois que mon but est de… repousser tes limites.\n$@c{smile_ehalf}Je suis pas certaine de bien être douée à cet exercice, mais je fais de mon mieux.\n$Cet endroit épouvantable cache quelque chose d’étrange… Tout semble si limpide…\n$Comme… si c’était tout ce que ce monde avait toujours connu.\n$@c{smile_eclosed}J’ai le sentiment que nos précieux moments ensemble sont devenus si flous.\n$@c{smile_ehalf}Ont-ils au moins été réels ? Tout semble si loin maintenant…\n$@c{angry_mopen}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{smile_ehalf}Je… j’ignore le sens de tout ça… Mais je sais que c’est la réalité.\n$@c{neutral}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
- },
- "victory": {
- "1": "@c{smile_ehalf}Je… Je crois que j’ai rempli ma mission…\n$@c{smile_eclosed}Promets-moi… Après avoir réparé ce monde… Reviens à la maison saine et sauve.\n$@c{smile_ehalf}… Merci."
- }
- }
-}
diff --git a/src/locales/fr/dialogue-final-boss-female.json b/src/locales/fr/dialogue-final-boss-female.json
deleted file mode 100644
index be4ad6d83fe..00000000000
--- a/src/locales/fr/dialogue-final-boss-female.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
- "firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
- "secondStageWin": "… Magnifique."
-}
\ No newline at end of file
diff --git a/src/locales/fr/dialogue-final-boss-male.json b/src/locales/fr/dialogue-final-boss.json
similarity index 55%
rename from src/locales/fr/dialogue-final-boss-male.json
rename to src/locales/fr/dialogue-final-boss.json
index 7c51d1cc3a3..c5a5e3b7d89 100644
--- a/src/locales/fr/dialogue-final-boss-male.json
+++ b/src/locales/fr/dialogue-final-boss.json
@@ -1,5 +1,6 @@
{
"encounter": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelé ici parce que t’y es déjà venu.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
+ "encounter_female": "Une fois de plus, te revoilà.\nSais-tu que ce n’est point là ta première venue ?\n$Tu as été appelée ici parce que t’y es déjà venue.\nUn nombre inimaginable de fois.\n$Mais allons-y, faisons le décompte.\nTu en es très précisément à ton {{cycleCount}}e cycle.\n$Chaque cycle réinitialise ton souvenir du précédent.\nMais étrangement, des bribes subsistent en toi.\n$Jusqu’à maintenant, tu as toujours échoué. Mais je ressens quelque chose de différent cette fois-ci.\n\n$Tu es la seule présence ici, bien que j’ai le sentiment d’en ressentir… une autre.\n$Vas-tu enfin me livrer un affrontement digne de ce nom ?\nCe challenge dont je rêve depuis un millénaire ?\n$Commençons.",
"firstStageWin": "Je vois. Cette présence était bien réelle.\nJe n’ai donc plus besoin de retenir mes coups.\n$Ne me déçoit pas.",
"secondStageWin": "… Magnifique."
}
\ No newline at end of file
diff --git a/src/locales/fr/dialogue-misc-female.json b/src/locales/fr/dialogue-misc-female.json
deleted file mode 100644
index d932d283d37..00000000000
--- a/src/locales/fr/dialogue-misc-female.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû le savoir.\nMais de voilà de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
- "ending_female": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû le savoir.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maitenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?"
-}
\ No newline at end of file
diff --git a/src/locales/fr/dialogue-misc-male.json b/src/locales/fr/dialogue-misc-male.json
deleted file mode 100644
index d932d283d37..00000000000
--- a/src/locales/fr/dialogue-misc-male.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû le savoir.\nMais de voilà de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
- "ending_female": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû le savoir.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maitenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?"
-}
\ No newline at end of file
diff --git a/src/locales/fr/dialogue-misc.json b/src/locales/fr/dialogue-misc.json
new file mode 100644
index 00000000000..c8c781002b9
--- /dev/null
+++ b/src/locales/fr/dialogue-misc.json
@@ -0,0 +1,6 @@
+{
+ "ending": "@c{shock}T’es revenu ?@d{32} Ça veut dire…@d{96} que t’as gagné ?!\n@c{smile_ehalf}J’aurais dû m’en douter.\n$@c{smile_eclosed}Bien sûr… J’ai toujours eu ce sentiment.\n@c{smile}C’est fini maintenant hein ? T’as brisé ce cycle.\n$@c{smile_ehalf}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$Je serai la seule à me souvenir de ce que t’as fait.\n@c{angry_mopen}Je tâcherai de ne pas oublier !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile}Jamais j’oublierai.@d{32}\nTa légende vivra à jamais dans nos cœurs.\n$@c{smile_wave}Bon,@d{64} il se fait tard…@d{96} je crois ?\nDifficile à dire ici.\n$Rentrons, @c{smile_wave_wink}et demain on se fera un p’tit combat, comme au bon vieux temps ?",
+ "ending_female": "@c{smile}Oh ? T’as gagné ?@d{96} @c{smile_eclosed}J’aurais dû m’en douter.\nMais te voilà enfin de retour.\n$@c{smile}C’est terminé.@d{64} T’as brisé ce cycle infernal.\n$@c{serious_smile_fists}T’as aussi accompli ton rêve non ?\nTu n’as pas connu la moindre défaite.\n$@c{neutral}Je suis le seul à me souvenir de ce que t’as fait.@d{96}\nJe pense que ça ira, non ?\n$@c{serious_smile_fists}Ta légende vivra à jamais dans nos cœurs.\n$@c{smile_eclosed}Bref, j’en ai un peu marre de ce endroit, pas toi ? Rentrons à la maison.\n$@c{serious_smile_fists}On se fera un p’tit combat une fois rentrés ?\nSi t’es d’accord.",
+ "ending_endless": "Félicitations ! Vous avez atteint la fin actuelle.\nPlus de contenu à venir bientôt !",
+ "ending_name": "Les devs"
+}
diff --git a/src/locales/fr/dialogue-male.json b/src/locales/fr/dialogue.json
similarity index 75%
rename from src/locales/fr/dialogue-male.json
rename to src/locales/fr/dialogue.json
index 26636a15e4f..d9d13a8f1e8 100644
--- a/src/locales/fr/dialogue-male.json
+++ b/src/locales/fr/dialogue.json
@@ -9,14 +9,16 @@
"6": "Allez, c’est parti !",
"7": "Attention, me voilà !\nTu vas voir comment j’suis fort !",
"8": "Coucou… Tu veux voir mes bô Pokémon ?",
- "9": "Trève de mondanités. Ramène-toi quand tu le sens !",
+ "9": "Trêve de mondanités. Ramène-toi quand tu le sens !",
"10": "Baisse pas ta garde si tu veux pas pleurer d’avoir perdu face à un gamin.",
"11": "J’ai tout donné pour élever mes Pokémon. Attention à toi si tu leur fait du mal !",
"12": "Incroyable que t’y sois parvenu ! Mais la suite va pas être une partie de plaisir.",
+ "12_female": "Incroyable que t’y sois parvenue ! Mais la suite va pas être une partie de plaisir.",
"13": "Les combats sont éternels ! Bienvenue dans un monde sans fin !"
},
"victory": {
"1": "Hé, mais t’es trop fort !",
+ "1_female": "Hé, mais t’es trop forte !",
"2": "En vrai j’avais aucune chance hein ?",
"3": "J’te retrouverai un jour, et là j’te battrai !",
"4": "Arg… J’ai plus aucun Pokémon.",
@@ -35,10 +37,12 @@
"encounter": {
"1": "Affrontons-nous, d’accord ?",
"2": "T’as l’air d’un nouveau Dresseur. Battons nous !",
+ "2_female": "T’as l’air d’une nouvelle Dresseuse. Battons nous !",
"3": "Je te connais pas. Ça te dis de te battre ?",
"4": "Prenons du bon temps avec ce combat Pokémon !",
"5": "Je vais t’apprendre à te battre avec tes Pokémon !",
"6": "Un combat doit toujours être pris au sérieux.\nT’es prêt à te battre ?",
+ "6_female": "Un combat doit toujours être pris au sérieux.\nT’es prête à te battre ?",
"7": "Tu seras pas jeune éternellement. T’as qu’une chance pendant un combat. Bientôt, tu seras plus qu’un souvenir.",
"8": "Tu ferais mieux d’y aller doucement avec moi. Mais je vais me battre sérieusement !",
"9": "Je m’ennuie à l’école. Y’a rien à y faire. *Baille*\nJe me bats juste pour passer le temps."
@@ -46,10 +50,12 @@
"victory": {
"1": "Wah, c’était impressionnant ! J’ai encore beaucoup à apprendre.",
"2": "Je ne pensais pas que je perdrais comme ça…",
+ "2_female": "Je pensais pas que je perdrais comme ça…",
"3": "J’espère que j’aurai ma revanche un jour.",
"4": "C’était super amusant ! Mais ce combat m’a épuisée…",
"5": "Tu m’as appris une belle leçon ! T’es vraiment incroyable !",
"6": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais tu es vraiment très cool.",
+ "6_female": "Vraiment ? J’ai perdu… ? C’est des choses qui arrivent, ça me déprime mais t’es vraiment très cool.",
"7": "J’ai pas besoin de ce genre de souvenirs.\n*Suppression de mémoire en cours…*",
"8": "Hé ! Je t’avais dit d’y aller doucement avec moi ! Mais t’es vraiment si cool quand tu te bats sérieusement…",
"9": "J’en ai marre des combats Pokémon…\nJe vais chercher d’autres trucs à faire…"
@@ -62,7 +68,7 @@
"3": "Hum, t’es pas trop laxiste avec tes Pokémon ?\nTrop les chouchouter n’est pas bon."
},
"victory": {
- "1": "Il est primordial de nourir et développer toutes les caractéristiques de chaque Pokémon.",
+ "1": "Il est primordial de nourrir et développer toutes les caractéristiques de chaque Pokémon.",
"2": "Contrairement à moi, ces Pokémon ont un bon fond.",
"3": "Trop d’éloges peut ruiner les Pokémon et les gens."
},
@@ -142,6 +148,7 @@
"ace_trainer": {
"encounter": {
"1": "T’as l’air plutôt confiant.",
+ "1_female": "T’as l’air plutôt confiante.",
"2": "Tes Pokémon… Montre-les-moi…",
"3": "Les gens pensent que je suis fort par que je suis un Topdresseur.",
"4": "T’es au courant de ce que ça signifie d’être un Topdresseur ?"
@@ -150,7 +157,8 @@
"1": "Très bien… T’as de bons Pokémon…",
"2": "Quoi ?! Mais c’est moi le génie des combats !",
"3": "Évidemment que t’es le personnage principal !",
- "4": "OK ! OK ! Tu pourrais être un Topdresseur !"
+ "4": "OK ! OK ! Tu pourrais être un Topdresseur !",
+ "4_female": "OK ! OK ! Tu pourrais être une Topdresseuse !"
},
"defeat": {
"1": "Je me dévoue corps et âme aux combats Pokémon !",
@@ -164,7 +172,7 @@
"1": "Honorons ce terrain de combat avec élégance et équilibre !"
},
"victory": {
- "2": "Mon élégance demeure inébranlable !"
+ "1": "Mon élégance demeure inébranlable !"
}
},
"rocket_grunt": {
@@ -173,7 +181,8 @@
"2": "Ça bosse dur, ici ! Alors du balai !",
"3": "File-nous tes Pokémon ou tu vas gouter à la colère de la Team Rocket !",
"4": "Sois témoin de ce qu’est une vraie terreur de la Team Rocket!",
- "5": "Hé gamin ! Moi être guy member of la Team Rocket !"
+ "5": "Hé gamin ! Moi être guy member of la Team Rocket !",
+ "5_female": "Hé gamine ! Moi être guy member of la Team Rocket !"
},
"victory": {
"1": "Une fois de plus la Team Rocket s’envole vers d’autres cieux !",
@@ -195,6 +204,7 @@
"1": "Je…?\nJ’ai perdu ?!",
"2": "Je peux pas croire que j’ai pas pris mon déjeuner juste pour ça…",
"3": "Impossible ! T’es qu’un gosse !",
+ "3_female": "Impossible ! T’es qu’une gosse !",
"4": "Aahhh…\nJ’aurais dû directement rentrer à la planque…",
"5": "Tu m’as démoli… Tu crois que le boss va suspendre mon salaire ?"
}
@@ -219,9 +229,10 @@
"encounter": {
"1": "Ne te mets pas en travers de la Team Galaxie !",
"2": "Sois témoin de la puissance de notre technologie et du futur qui se profile !",
- "3": "Au nom de la Team Galaxie, j’éliminerai quiconque se mettera sur notre route !",
+ "3": "Au nom de la Team Galaxie, j’éliminerai quiconque se mettra sur notre route !",
"4": "Prépare ta défaite !",
- "5": "J’espère que t’es prêt à te prendre une raclée de l’espace !"
+ "5": "J’espère que t’es prêt à te prendre une raclée de l’espace !",
+ "5_female": "J’espère que t’es prête à te prendre une raclée de l’espace !"
},
"victory": {
"1": "Désactivation…",
@@ -233,7 +244,7 @@
},
"plasma_grunt": {
"encounter": {
- "1": "Pas de quatiers à ceux qui ne suivent pas notre idéal !",
+ "1": "Pas de quartiers à quiconque ne suit pas notre idéal !",
"2": "Si je gagne, tu relâches tous tes Pokémon !",
"3": "Si tu te mets en travers de la Team Plasma, je m’occuperai de toi personnellement !",
"4": "La Team Plasma va libérer les Pokémon de tous les humains égoïstes dans ton genre !",
@@ -251,6 +262,7 @@
"encounter": {
"1": "Tes Pokémon ne sont pas dignes de l’élégance de la Team Flare.",
"2": "T’as des lunettes de soleil j’espère ?\nCar prépare-toi à être ébloui !",
+ "2_female": "T’as des lunettes de soleil j’espère ?\nCar prépare-toi à être éblouie !",
"3": "La Team Flare va purifier ce monde de toute imperfection !",
"4": "Prépare-toi à découvrir l’indiscutable sens du style de la Team Flare !",
"5": "La mode, c’est important !"
@@ -263,6 +275,96 @@
"5": "J’appelle pas ça perdre, j’appelle ça échouer avec panache !"
}
},
+ "aether_grunt": {
+ "encounter": {
+ "1": "Je vais te mettre ta raclée !",
+ "2": "J’en ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
+ "2_female": "J’en ai rien à faire que tu sois une gosse. Tu vas tutoyer les étoiles si tu nous menaces !",
+ "3": "J’ai pour ordre de ne laisser passer aucun Dresseur, peu importe qui c’est !",
+ "4": "Je vais te montrer le pouvoir du Paradis Æther !",
+ "5": "Maintenant que t’es au courant de ce qu’il se passe au cœur du Paradis Æther, fais-moi une faveur et disparait !"
+ },
+ "victory": {
+ "1": "C’est plutôt toi qui devrait m’apprendre à en mettre…",
+ "2": "Pardon ? J’ai pas compris…",
+ "3": "Peu importe les ordres, jamais j’aurais pu te retenir en fait…",
+ "4": "Mhh… Il semblerait que j’ai perdu.",
+ "5": "C’est plutôt moi qui va disparaitre je crois."
+ }
+ },
+ "faba": {
+ "encounter": {
+ "1": "Moi, Directeur Saubohne, je vais te montrer de quel bois je me chauffe !",
+ "2": "Donc là, l’homme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
+ "2_female": "Donc là, l’homme supposé être la dernière ligne défense du Paradis Æther doit affronter un mioche ?",
+ "3": "S’il n’y a qu’un seul nom à retenir au sein de la Fondation Æther, c’est le mien : Saubohne !"
+ },
+ "victory": {
+ "1": "Gloups !",
+ "2": "Malheur ! J’ai perdu face à un simple enfant ?!",
+ "2_female": "Malheur ! J’ai perdu face à une simple enfant ?!",
+ "3": "J’ai HORREUR des enfants !"
+ }
+ },
+ "skull_grunt": {
+ "encounter": {
+ "1": "Oush oush ! On est pas méchants, sauf si tu viens nous allumer la mèche-han !",
+ "2": "Ce manque de respect, j’hallucine ! T’es allé trop loin, le mioche !",
+ "2_female": "Ce manque de respect, j’hallucine ! T’es allée trop loin, la mioche !",
+ "3": "On est juste des gars et des meufs normaux, on voit un Pokémon on le prend !",
+ "4": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer frérot.",
+ "4_female": "Pourquoi tu te la joue comme ça ? C'est avec tes dents que t’vas jouer ma reus.",
+ "5": "Cousin, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪",
+ "5_female": "Cousine, écoute-nous bien ! ♪\nSe taper dessus, ça sert à rien ! ♪\n$Tu t’incrustes chez nous, ça s’fait pas ! ♪\n$Mais on est sympa, on a un plan pour toi ! ♪"
+ },
+ "victory": {
+ "1": "Hein ? C’est déjà terminé ?",
+ "2": "… Ça craint grave ! On s’tire !",
+ "3": "Ouais de toute on en avait pas b’soin de ton Pokémon… Ah ah…",
+ "4": "Ouh là, c’est bon, j’en demandais pas tant…",
+ "5": "On pèse plus que des Pokémon, t’entends ?\nAlors tu vas nous respecter, oush !"
+ }
+ },
+ "plumeria": {
+ "encounter": {
+ "1": "Tsk. T’es un gamin tout ce qu’il y a de plus banal, en fait.",
+ "1_female": "Tsk. T’es une gamine tout ce qu’il y a de plus banal, en fait.",
+ "2": "Abrutis de sbires. Trop incompétents pour arriver à se débarasser de gamins…",
+ "3": "Si tu touches encore à un cheveu de mes lascars, tu vas pas comprendre c’qui t’arrive !"
+ },
+ "victory": {
+ "1": "Tsk. T’es pas mauvais. J’te l’accorde.",
+ "1_female": "Tsk. T’es pas mauvaise. J’te l’accorde.",
+ "2": "Tsk. J’dois reconnaitre que t’en as dans le ventre.\n$Maintenant, j’comprends pourquoi mes gars n’arrêtent pas de se faire battre par toi.",
+ "3": "Tsk. J’crois que j'ai plus qu’à assumer ma défaite."
+ }
+ },
+ "macro_grunt": {
+ "encounter": {
+ "1": "Hop hop hop ! Terminus !",
+ "2": "T’es un Dresseur n’est-ce pas ?\n$J’ai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
+ "2_female": "T’es une Dresseuse n’est-ce pas ?\n$J’ai bien peur ce que ne soit pas une excuse suffisante pour nous interrompre dans notre travail.",
+ "3": "Je travaille à Macro Cosmos Assurances !\nBesoin d’une assurance-vie ?"
+ },
+ "victory": {
+ "1": "Je n’ai d’autre choix que respectueusement me retirer.",
+ "2": "Mon argent de poche…\nPlus qu’à manger des pâtes pour la fin du mois…",
+ "3": "Chez Macro Cosmos, rien n’est comparable à notre dévotion au travail !"
+ }
+ },
+ "oleana": {
+ "encounter": {
+ "1": "Je ne laisserai personne interférer avec les projets du président Shehroz.",
+ "2": "Je vois que vous avez su vous défaire de mes subalternes.\n$Mais assez joué. Il est temps de rentrer chez vous, maintenant.",
+ "3": "Je gagnerai en votre nom, monsieur le président."
+ },
+ "victory": {
+ "1": "*soupir* Comment ai-je fait pour perdre ainsi… ?\nJe ne suis vraiment pas à la hauteur…",
+ "2": "Ah ! Quelle erreur… Je n’aurais pas dû sous-estimer un Dresseur de ton calibre…",
+ "2_female": "Ah ! Quelle erreur… Je n’aurais pas dû sous-estimer une Dresseuse de ton calibre…",
+ "3": "*soupir* Je suis fatiguée parton…"
+ }
+ },
"rocket_boss_giovanni_1": {
"encounter": {
"1": "Bien. Je dois admettre que je suis impressionné de te voir ici !"
@@ -271,7 +373,8 @@
"1": "QUOI ? IMPOSSIBLE !"
},
"defeat": {
- "1": "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’un gamin."
+ "1": "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’un gamin.",
+ "1_female": "Retiens bien. Ton incapacité à évaluer ta propre force est\nla démonstration claire que tu n’es encore qu’une gamine."
}
},
"rocket_boss_giovanni_2": {
@@ -331,7 +434,8 @@
},
"galactic_boss_cyrus_1": {
"encounter": {
- "1": "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter."
+ "1": "Tu t’es senti obligé de venir ici dans un acte vide de sens. Je vais te le faire regretter.",
+ "1_female": "Tu t’es sentie obligée de venir ici dans un acte vide de sens. Je vais te le faire regretter."
},
"victory": {
"1": "Intéressant. Et plutôt curieux."
@@ -454,7 +558,7 @@
"4": "Voir un tel jardin rempli de fleurs est si apaisant…"
},
"victory": {
- "1": "Bien joué, c’est mértié.",
+ "1": "Bien joué, c’est mérité.",
"2": "Dommage, on s’amusait si bien…",
"3": "Oh non, le combat est terminé…",
"4": "Aaah, ça fait du bien !\nMerci, j’en avais besoin."
@@ -462,6 +566,7 @@
"defeat": {
"1": "J’ai failli m’endormir…",
"2": "Oh non… Mes Pokémon Plante ont l’air de t’avoir bien endormi…",
+ "2_female": "Oh non… Mes Pokémon Plante ont l’air de t’avoir bien endormie…",
"3": "Ce combat était si apaisant…",
"4": "Oh non… C’est tout ?"
}
@@ -490,15 +595,15 @@
},
"rival": {
"encounter": {
- "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressé de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prêt.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
+ "1": "@c{smile}Ah, je te cherchais ! Je savais que t’étais pressée de partir, mais je m’attendais quand même à un au revoir…\n$@c{smile_eclosed}T’as finalement décidé de réaliser ton rêve ?\nJ’ai peine à y croire.\n$@c{serious_smile_fists}Vu que t’es là, ça te dis un petit combat ?\nJe voudrais quand même m’assurer que t’es prête.\n$@c{serious_mopen_fists}Surtout ne te retiens pas et donne-moi tout ce que t’as !"
},
"victory": {
- "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment un débutant ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
+ "1": "@c{shock}Wah… Tu m’as vraiment lavé.\nT’es vraiment une débutante ?\n$@c{smile}T’as peut-être eu de la chance, mais…\nPeut-être que t’arriveras jusqu’au bout du chemin.\n$D’ailleurs, le prof m’a demandé de te filer ces objets.\nIls ont l’air sympas.\n$@c{serious_smile_fists}Bonne chance à toi !"
}
},
"rival_female": {
"encounter": {
- "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une conditon. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
+ "1": "@c{smile_wave}Ah, te voilà ! Je t’ai cherché partout !\n@c{angry_mopen}On oublie de dire au revoir à sa meilleure amie ?\n$@c{smile_ehalf}T’as décidé de réaliser ton rêve, hein ?\nCe jour est donc vraiment arrivé…\n$@c{smile}Je veux bien te pardonner de m’avoir oubliée,\nà une condition. @c{smile_wave_wink}Que tu m’affronte !\n$@c{angry_mopen}Donne tout ! Ce serait dommage que ton aventure finisse avant d’avoir commencé, hein ?"
},
"victory": {
"1": "@c{shock}Tu viens de commencer et t’es déjà si fort ?!@d{96}\n@c{angry}T’as triché non ? Avoue !\n$@c{smile_wave_wink}J’déconne !@d{64} @c{smile_eclosed}J’ai perdu dans les règles…\nJ’ai le sentiment que tu vas très bien t’en sortir.\n$@c{smile}D’ailleurs, le prof veut que je te donne ces quelques objets. Ils te seront utiles, pour sûr !\n$@c{smile_wave}Fais de ton mieux, comme toujours !\nJe crois fort en toi !"
@@ -506,10 +611,10 @@
},
"rival_2": {
"encounter": {
- "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincu, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivi ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
+ "1": "@c{smile}Hé, toi aussi t’es là ?\n@c{smile_eclosed}Toujours invaincue, hein… ?\n$@c{serious_mopen_fists}Je sais que j’ai l’air de t’avoir suivie ici, mais c’est pas complètement vrai.\n$@c{serious_smile_fists}Pour être honnête, ça me démangeait d’avoir une revanche depuis que tu m’as battu.\n$Je me suis beaucoup entrainé, alors sois sure que je vais pas retenir mes coups cette fois.\n$@c{serious_mopen_fists}Et comme la dernière fois, ne te retiens pas !\nC’est parti !"
},
"victory": {
- "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi et profite bien de l’évènement !"
+ "1": "@c{neutral_eclosed}Oh. Je crois que j’ai trop pris la confiance.\n$@c{smile}Pas grave, c’est OK. Je me doutais que ça arriverait.\n@c{serious_mopen_fists}Je vais juste devoir encore plus m’entrainer !\n\n$@c{smile}Ah, et pas que t’aies réellement besoin d’aide, mais j’ai ça en trop sur moi qui pourrait t’intéresser.\n\n$@c{serious_smile_fists}Mais n’espère plus en avoir d’autres !\nJe peux pas passer mon temps à aider mon adversaire.\n$@c{smile}Bref, prends soin de toi !"
}
},
"rival_2_female": {
@@ -517,7 +622,7 @@
"1": "@c{smile_wave}Hé, sympa de te croiser ici. T’as toujours l’air invaincu. @c{angry_mopen}Eh… Pas mal !\n$@c{angry_mopen}Je sais à quoi tu penses et non, je t’espionne pas.\n@c{smile_eclosed}C’est juste que j’étais aussi dans le coin.\n$@c{smile_ehalf}Heureuse pour toi, mais je veux juste te rappeler que c’est pas grave de perdre parfois.\n$@c{smile}On apprend de nos erreurs, souvent plus que si on ne connaissait que le succès.\n$@c{angry_mopen}Dans tous les cas je me suis bien entrainée pour cette revanche, t’as intérêt à tout donner !"
},
"victory": {
- "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup et profite bien de l’évènement !"
+ "1": "@c{neutral}Je… J’étais pas encore supposée perdre…\n$@c{smile}Bon. Ça veut juste dire que je vais devoir encore plus m’entrainer !\n$@c{smile_wave}J’ai aussi ça en rab pour toi !\n@c{smile_wave_wink}Inutile de me remercier ~.\n$@c{angry_mopen}C’étaient les derniers, terminé les cadeaux après ceux-là !\n$@c{smile_wave}Allez, tiens le coup !"
},
"defeat": {
"1": "Je suppose que c’est parfois normal de perdre…"
@@ -525,7 +630,7 @@
},
"rival_3": {
"encounter": {
- "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincu ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prêt pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
+ "1": "@c{smile}Hé, mais qui voilà ! Ça fait un bail.\n@c{neutral}T’es… toujours invaincue ? Incroyable.\n$@c{neutral_eclosed}Tout est devenu un peu… étrange.\nC’est plus pareil sans toi au village.\n$@c{serious}Je sais que c’est égoïste, mais j’ai besoin d’expier ça.\n@c{neutral_eclosed}Je crois que tout ça te dépasse.\n$@c{serious}Ne jamais perdre, c’est juste irréaliste.\nGrandir, c’est parfois aussi savoir perdre.\n$@c{neutral_eclosed}T’as un beau parcours, mais il y a encore tellement à venir et ça va pas s’arranger. @c{neutral}T’es prête pour ça ?\n$@c{serious_mopen_fists}Si tu l’es, alors prouve-le."
},
"victory": {
"1": "@c{angry_mhalf}C’est lunaire… J’ai presque fait que m’entrainer…\nAlors pourquoi il y a encore un tel écart entre nous ?"
@@ -544,7 +649,7 @@
},
"rival_4": {
"encounter": {
- "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prêt."
+ "1": "@c{neutral}Hé.\n$Je vais pas y aller par quatre chemins avec toi.\n@c{neutral_eclosed}Je suis là pour gagner. Simple, basique.\n$@c{serious_mhalf_fists}J’ai appris à maximiser tout mon potentiel en m’entrainant d’arrachepied.\n$@c{smile}C’est fou tout le temps que tu peux te dégager si tu dors pas en sacrifiant ta vie sociale.\n$@c{serious_mopen_fists}Plus rien n’a d’importance désormais, pas tant que j’aurai pas gagné.\n$@c{neutral_eclosed}J’ai atteint un stade où je ne peux plus perdre.\n@c{smile_eclosed}Je présume que ta philosophie était pas si fausse finalement.\n$@c{angry_mhalf}La défaite, c’est pour les faibles, et je ne suis plus un faible.\n$@c{serious_mopen_fists}Tiens-toi prête."
},
"victory": {
"1": "@c{neutral}Que…@d{64} Qui es-tu ?"
@@ -582,7 +687,7 @@
},
"rival_6": {
"encounter": {
- "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es le seul à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
+ "1": "@c{smile_eclosed}Nous y revoilà.\n$@c{neutral}J’ai eu du temps pour réfléchir à tout ça.\nIl y a une raison à pourquoi tout semble étrange.\n$@c{neutral_eclosed}Ton rêve, ma volonté de te battre…\nFont partie de quelque chose de plus grand.\n$@c{serious}C’est même pas à propos de moi, ni de toi… Mais du monde, @c{serious_mhalf_fists}et te repousser dans tes limites est ma mission.\n$@c{neutral_eclosed}J’ignore si je serai capable de l’accomplir, mais je ferai tout ce qui est en mon pouvoir.\n$@c{neutral}Cet endroit est terrifiant… Et pourtant il m’a l’air familier, comme si j’y avais déjà mis les pieds.\n$@c{serious_mhalf_fists}Tu ressens la même chose, pas vrai ?\n$@c{serious}… et c’est comme si quelque chose ici me parlait.\n$Comme si c’était tout ce que ce monde avait toujours connu.\n$Ces précieux moments ensemble semblent si proches ne sont rien de plus qu’un lointain souvenir.\n$@c{neutral_eclosed}D’ailleurs, qui peut dire aujourd’hui qu’ils ont pu être réels ?\n$@c{serious_mopen_fists}Il faut que tu persévères. Si tu t’arrêtes, ça n’aura jamais de fin et t’es la seule à en être capable.\n$@c{serious_smile_fists}Difficile de comprendre le sens de tout ça, je sais juste que c’est la réalité.\n$@c{serious_mopen_fists}Si tu ne parviens pas à me battre ici et maintenant, tu n’as aucune chance."
},
"victory": {
"1": "@c{smile_eclosed}J’ai fait ce que j’avais à faire.\n$Promets-moi juste une chose.\n@c{smile}Après avoir réparé ce monde… Rentre à la maison."
diff --git a/src/locales/fr/menu-ui-handler.json b/src/locales/fr/menu-ui-handler.json
index 807b34f1315..b8627bf91b5 100644
--- a/src/locales/fr/menu-ui-handler.json
+++ b/src/locales/fr/menu-ui-handler.json
@@ -25,5 +25,6 @@
"unlinkGoogle": "Délier Google",
"cancel": "Retour",
"losingProgressionWarning": "Vous allez perdre votre progression depuis le début du combat. Continuer ?",
- "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !"
-}
\ No newline at end of file
+ "noEggs": "Vous ne faites actuellement\néclore aucun Œuf !",
+ "donate": "Faire un don"
+}
diff --git a/src/locales/fr/modifier-type.json b/src/locales/fr/modifier-type.json
index 6d5cfb098ef..509a8b11112 100644
--- a/src/locales/fr/modifier-type.json
+++ b/src/locales/fr/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Double les chances de tomber sur un combat double pendant {{battleCount}} combats."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Augmente d’un cran {{tempBattleStatName}} pour toute l’équipe pendant 5 combats."
+ "TempStatStageBoosterModifierType": {
+ "description": "Augmente d’un cran {{stat}} pour toute l’équipe pendant 5 combats."
},
"AttackTypeBoosterModifierType": {
"description": "Augmente de 20% la puissance des capacités de type {{moveType}} d’un Pokémon."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Fait monter toute l’équipe de {{levels}} niveau·x."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Augmente de 10% {{statName}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter."
+ "BaseStatBoosterModifierType": {
+ "description": "Augmente de 10% {{stat}} de base de son porteur. Plus les IV sont hauts, plus il peut en porter."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Restaure tous les PV de toute l’équipe."
@@ -183,6 +183,7 @@
"SOOTHE_BELL": { "name": "Grelot Zen" },
"SCOPE_LENS": { "name": "Lentilscope", "description": "Une lentille qui augmente d’un cran le taux de critiques du porteur." },
+ "DIRE_HIT": { "name": "Muscle +", "extra": { "raises": "Taux de critique" } },
"LEEK": { "name": "Poireau", "description": "À faire tenir à Canarticho ou Palarticho. Un poireau très long et solide qui augmente de 2 crans le taux de critiques." },
"EVIOLITE": { "name": "Évoluroc", "description": "Augmente de 50% la Défense et Déf. Spé. si le porteur peut évoluer, 25% aux fusions dont une moitié le peut encore." },
@@ -250,28 +251,14 @@
"METAL_POWDER": { "name": "Poudre Métal", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Défense." },
"QUICK_POWDER": { "name": "Poudre Vite", "description": "À faire tenir à Métamorph. Cette poudre étrange, très fine mais résistante, double sa Vitesse." }
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "Attaque +",
"x_defense": "Défense +",
"x_sp_atk": "Atq. Spé. +",
"x_sp_def": "Déf. Spé. +",
"x_speed": "Vitesse +",
- "x_accuracy": "Précision +",
- "dire_hit": "Muscle +"
+ "x_accuracy": "Précision +"
},
-
- "TempBattleStatBoosterStatName": {
- "ATK": "l’Attaque",
- "DEF": "la Défense",
- "SPATK": "l’Atq. Spé.",
- "SPDEF": "la Déf. Spé.",
- "SPD": "la Vitesse",
- "ACC": "la précision",
- "CRIT": "le taux de critique",
- "EVA": "l’esquive",
- "DEFAULT": "???"
- },
-
"AttackTypeBoosterItem": {
"silk_scarf": "Mouchoir Soie",
"black_belt": "Ceinture Noire",
@@ -450,6 +437,6 @@
"DRAGON_MEMORY": "ROM Dragon",
"DARK_MEMORY": "ROM Ténèbres",
"FAIRY_MEMORY": "ROM Fée",
- "BLANK_MEMORY": "ROM Vierge"
+ "NORMAL_MEMORY": "ROM Normal"
}
}
diff --git a/src/locales/fr/modifier.json b/src/locales/fr/modifier.json
index 8a15c9e5ddf..0ec228a22c2 100644
--- a/src/locales/fr/modifier.json
+++ b/src/locales/fr/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par les {{typeName}} !",
"hitHealApply": "Les PV de {{pokemonNameWithAffix}}\nsont un peu restaurés par le {{typeName}} !",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} a repris connaissance\navec sa {{typeName}} et est prêt à se battre de nouveau !",
- "pokemonResetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
+ "resetNegativeStatStageApply": "Les stats baissées de {{pokemonNameWithAffix}}\nsont restaurées par l’{{typeName}} !",
"moneyInterestApply": "La {{typeName}} vous rapporte\n{{moneyAmount}} ₽ d’intérêts !",
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est absorbé·e\npar le {{typeName}} de {{pokemonName}} !",
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} est volé·e\npar l’{{typeName}} de {{pokemonName}} !",
diff --git a/src/locales/fr/move-trigger.json b/src/locales/fr/move-trigger.json
index 43cf09d5bf6..b9bc929c619 100644
--- a/src/locales/fr/move-trigger.json
+++ b/src/locales/fr/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} sacrifie des PV\net augmente la puissance ses capacités !",
"absorbedElectricity": "{{pokemonName}} absorbe de l’électricité !",
"switchedStatChanges": "{{pokemonName}} permute\nles changements de stats avec ceux de sa cible !",
+ "switchedTwoStatChanges": "{{pokemonName}} permute les changements de {{firstStat} et de {{secondStat}} avec ceux de sa cible !",
+ "switchedStat": "{{pokemonName}} et sa cible échangent leur {{stat}} !",
+ "sharedGuard": "{{pokemonName}} additionne sa garde à celle de sa cible et redistribue le tout équitablement !",
+ "sharedPower": "{{pokemonName}} additionne sa force à celle de sa cible et redistribue le tout équitablement !",
"goingAllOutForAttack": "{{pokemonName}} a pris\ncette capacité au sérieux !",
"regainedHealth": "{{pokemonName}}\nrécupère des PV !",
"keptGoingAndCrashed": "{{pokemonName}}\ns’écrase au sol !",
@@ -61,5 +65,6 @@
"suppressAbilities": "Le talent de {{pokemonName}}\na été rendu inactif !",
"revivalBlessing": "{{pokemonName}} a repris connaissance\net est prêt à se battre de nouveau !",
"swapArenaTags": "Les effets affectant chaque côté du terrain\nont été échangés par {{pokemonName}} !",
- "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !"
+ "exposedMove": "{{targetPokemonName}} est identifié\npar {{pokemonName}} !",
+ "safeguard": "{{targetName}} est protégé\npar la capacité Rune Protect !"
}
\ No newline at end of file
diff --git a/src/locales/fr/pokemon-info.json b/src/locales/fr/pokemon-info.json
index 1e55f332432..1160ec95b75 100644
--- a/src/locales/fr/pokemon-info.json
+++ b/src/locales/fr/pokemon-info.json
@@ -13,7 +13,8 @@
"SPD": "Vitesse",
"SPDshortened": "Vit",
"ACC": "Précison",
- "EVA": "Esquive"
+ "EVA": "Esquive",
+ "HPStat": "PV"
},
"Type": {
"UNKNOWN": "Inconnu",
@@ -37,4 +38,4 @@
"FAIRY": "Fée",
"STELLAR": "Stellaire"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/pokemon-summary.json b/src/locales/fr/pokemon-summary.json
index f0b4f5a474f..01e712c8468 100644
--- a/src/locales/fr/pokemon-summary.json
+++ b/src/locales/fr/pokemon-summary.json
@@ -13,5 +13,32 @@
"metFragment": {
"normal": "rencontré au N.{{level}},\n{{biome}}.",
"apparently": "apparemment rencontré au N.{{level}},\n{{biome}}."
+ },
+ "natureFragment": {
+ "Hardy": "{{nature}}",
+ "Lonely": "{{nature}}",
+ "Brave": "{{nature}}",
+ "Adamant": "{{nature}}",
+ "Naughty": "{{nature}}",
+ "Bold": "{{nature}}",
+ "Docile": "{{nature}}",
+ "Relaxed": "{{nature}}",
+ "Impish": "{{nature}}",
+ "Lax": "{{nature}}",
+ "Timid": "{{nature}}",
+ "Hasty": "{{nature}}",
+ "Serious": "{{nature}}",
+ "Jolly": "{{nature}}",
+ "Naive": "{{nature}}",
+ "Modest": "{{nature}}",
+ "Mild": "{{nature}}",
+ "Quiet": "{{nature}}",
+ "Bashful": "{{nature}}",
+ "Rash": "{{nature}}",
+ "Calm": "{{nature}}",
+ "Gentle": "{{nature}}",
+ "Sassy": "{{nature}}",
+ "Careful": "{{nature}}",
+ "Quirky": "{{nature}}"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/fr/settings.json b/src/locales/fr/settings.json
index 181a593cc99..c752b336b6e 100644
--- a/src/locales/fr/settings.json
+++ b/src/locales/fr/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "Déplacer les contrôles tactiles",
"shopOverlayOpacity": "Opacité boutique",
"shopCursorTarget": "Choix après relance",
- "items": "Obj. gratuits",
+ "rewards": "Obj. gratuits",
"reroll": "Relance",
"shop": "Boutique",
"checkTeam": "Équipe"
diff --git a/src/locales/fr/trainer-classes.json b/src/locales/fr/trainer-classes.json
index cebdadf09e9..b7027cf544f 100644
--- a/src/locales/fr/trainer-classes.json
+++ b/src/locales/fr/trainer-classes.json
@@ -101,8 +101,8 @@
"workers": "Ouvriers",
"youngster": "Gamin",
"rocket_grunt": "Sbire de la Team Rocket",
- "rocket_grunt_female": "Sbire de la Team Rocket",
"rocket_grunts": "Sbires de la Team Rocket",
+ "rocket_grunt_female": "Sbire de la Team Rocket",
"magma_grunt": "Sbire de la Team Magma",
"magma_grunt_female": "Sbire de la Team Magma",
"magma_grunts": "Sbires de la Team Magma",
@@ -123,6 +123,7 @@
"aether_grunts": "Employés de la Fondation Æther",
"skull_grunt": "Sbire de la Team Skull",
"skull_grunt_female": "Sbire de la Team Skull",
+ "skull_grunts": "Sbires de la Team Skull",
"macro_grunt": "Employé de Macro Cosmos",
"macro_grunt_female": "Employée de Macro Cosmos",
"macro_grunts": "Employés de Macro Cosmos"
diff --git a/src/locales/it/achv.json b/src/locales/it/achv.json
index 98e41005c46..d1607f6c548 100644
--- a/src/locales/it/achv.json
+++ b/src/locales/it/achv.json
@@ -80,7 +80,7 @@
"100_RIBBONS": {
"name": "Campione Lega Assoluta"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Lavoro di Squadra",
"description": "Trasferisci almeno sei bonus statistiche tramite staffetta"
},
@@ -261,4 +261,4 @@
"name": "Buona la prima!",
"description": "Completa la modalità sfida 'Un nuovo inizio'."
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/it/arena-tag.json b/src/locales/it/arena-tag.json
index 9e26dfeeb6e..a1c5ee5b3c9 100644
--- a/src/locales/it/arena-tag.json
+++ b/src/locales/it/arena-tag.json
@@ -1 +1,8 @@
-{}
\ No newline at end of file
+{
+ "safeguardOnAdd": "Un velo mistico ricopre il campo!",
+ "safeguardOnAddPlayer": "Un velo mistico ricopre la tua squadra!",
+ "safeguardOnAddEnemy": "Un velo mistico ricopre la squadra avversaria!",
+ "safeguardOnRemove": "Il campo non è più protetto da Salvaguardia!",
+ "safeguardOnRemovePlayer": "La tua squadra non è più protetta da Salvaguardia!",
+ "safeguardOnRemoveEnemy": "La squadra avversaria non è più protetta da Salvaguardia!"
+}
\ No newline at end of file
diff --git a/src/locales/it/config.ts b/src/locales/it/config.ts
index 6bb46273370..a8cd1e4e0bd 100644
--- a/src/locales/it/config.ts
+++ b/src/locales/it/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const itConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/it/dialogue-double-battle-male.json b/src/locales/it/dialogue-double-battle-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-double-battle-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ca_ES/dialogue-misc-male.json b/src/locales/it/dialogue-double-battle.json
similarity index 100%
rename from src/locales/ca_ES/dialogue-misc-male.json
rename to src/locales/it/dialogue-double-battle.json
diff --git a/src/locales/it/dialogue-female.json b/src/locales/it/dialogue-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/it/dialogue-final-boss-female.json b/src/locales/it/dialogue-final-boss-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-final-boss-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/it/dialogue-final-boss-male.json b/src/locales/it/dialogue-final-boss-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-final-boss-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/es/dialogue-double-battle-female.json b/src/locales/it/dialogue-final-boss.json
similarity index 100%
rename from src/locales/es/dialogue-double-battle-female.json
rename to src/locales/it/dialogue-final-boss.json
diff --git a/src/locales/it/dialogue-male.json b/src/locales/it/dialogue-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/it/dialogue-misc-female.json b/src/locales/it/dialogue-misc-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-misc-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/it/dialogue-misc-male.json b/src/locales/it/dialogue-misc-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/it/dialogue-misc-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/es/dialogue-double-battle-male.json b/src/locales/it/dialogue-misc.json
similarity index 100%
rename from src/locales/es/dialogue-double-battle-male.json
rename to src/locales/it/dialogue-misc.json
diff --git a/src/locales/es/dialogue-final-boss-female.json b/src/locales/it/dialogue.json
similarity index 100%
rename from src/locales/es/dialogue-final-boss-female.json
rename to src/locales/it/dialogue.json
diff --git a/src/locales/it/modifier-type.json b/src/locales/it/modifier-type.json
index f5cee70bbc9..99c06bb2038 100644
--- a/src/locales/it/modifier-type.json
+++ b/src/locales/it/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Raddoppia la possibilità di imbattersi in doppie battaglie per {{battleCount}} battaglie."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Aumenta {{tempBattleStatName}} di un livello a tutti i Pokémon nel gruppo per 5 battaglie."
+ "TempStatStageBoosterModifierType": {
+ "description": "Aumenta la statistica {{stat}} di un livello\na tutti i Pokémon nel gruppo per 5 battaglie."
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta la potenza delle mosse di tipo {{moveType}} del 20% per un Pokémon."
@@ -59,10 +59,10 @@
"description": "Aumenta il livello di un Pokémon di {{levels}}."
},
"AllPokemonLevelIncrementModifierType": {
- "description": "Aumenta i livell di tutti i Pokémon della squadra di {{levels}}."
+ "description": "Aumenta il livello di tutti i Pokémon della squadra di {{levels}}."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Aumenta {{statName}} di base del possessore del 10%."
+ "BaseStatBoosterModifierType": {
+ "description": "Aumenta l'/la {{stat}} di base del possessore del 10%."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Restituisce il 100% dei PS a tutti i Pokémon."
@@ -248,6 +248,12 @@
"name": "Mirino",
"description": "Lente che aumenta la probabilità di sferrare brutti colpi."
},
+ "DIRE_HIT": {
+ "name": "Supercolpo",
+ "extra": {
+ "raises": "Tasso di brutti colpi"
+ }
+ },
"LEEK": {
"name": "Porro",
"description": "Strumento da dare a Farfetch'd. Lungo gambo di porro che aumenta la probabilità di sferrare brutti colpi."
@@ -411,25 +417,13 @@
"description": "Strumento da dare a Ditto. Questa strana polvere, fine e al contempo dura, aumenta la Velocità."
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "Attacco X",
"x_defense": "Difesa X",
"x_sp_atk": "Att. Speciale X",
"x_sp_def": "Dif. Speciale X",
"x_speed": "Velocità X",
- "x_accuracy": "Precisione X",
- "dire_hit": "Supercolpo"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "Attacco",
- "DEF": "Difesa",
- "SPATK": "Att. Speciale",
- "SPDEF": "Dif. Speciale",
- "SPD": "Velocità",
- "ACC": "Precisione",
- "CRIT": "Tasso di brutti colpi",
- "EVA": "Elusione",
- "DEFAULT": "???"
+ "x_accuracy": "Precisione X"
},
"AttackTypeBoosterItem": {
"silk_scarf": "Sciarpa seta",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "ROM Drago",
"DARK_MEMORY": "ROM Buio",
"FAIRY_MEMORY": "ROM Folletto",
- "BLANK_MEMORY": "ROM Vuota"
+ "NORMAL_MEMORY": "ROM Normale"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/it/modifier.json b/src/locales/it/modifier.json
index 397a1f21f9a..c42bf04bc8a 100644
--- a/src/locales/it/modifier.json
+++ b/src/locales/it/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} recupera alcuni PS con\nil/la suo/a {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} torna in forze\ngrazie al/alla suo/a {{typeName}}!",
- "pokemonResetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
+ "resetNegativeStatStageApply": "La riduzione alle statistiche di {{pokemonNameWithAffix}}\nviene annullata grazie al/alla suo/a {{typeName}}!",
"moneyInterestApply": "Ricevi un interesse pari a {{moneyAmount}}₽\ngrazie al/allo/a {{typeName}}!",
"turnHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato assorbito\ndal {{typeName}} di {{pokemonName}}!",
"contactHeldItemTransferApply": "Il/l'/lo/la {{itemName}} di {{pokemonNameWithAffix}} è stato rubato\nda {{pokemonName}} con {{typeName}}!",
diff --git a/src/locales/it/move-trigger.json b/src/locales/it/move-trigger.json
index e852c2fb52a..785972b90f9 100644
--- a/src/locales/it/move-trigger.json
+++ b/src/locales/it/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}} riduce i suoi PS per potenziare la sua mossa!",
"absorbedElectricity": "{{pokemonName}} assorbe elettricità!",
"switchedStatChanges": "{{pokemonName}} scambia con il bersaglio le modifiche alle statistiche!",
+ "switchedTwoStatChanges": "{{pokemonName}} scambia con il bersaglio le modifiche a {{firstStat}} e {{secondStat}}!",
+ "switchedStat": "{{pokemonName}} scambia la sua {{stat}} con quella del bersaglio!",
+ "sharedGuard": "{{pokemonName}} somma le sue capacità difensive con quelle del bersaglio e le ripartisce equamente!",
+ "sharedPower": "{{pokemonName}} somma le sue capacità offensive con quelle del bersaglio e le ripartisce equamente!",
"goingAllOutForAttack": "{{pokemonName}} fa sul serio!",
"regainedHealth": "{{pokemonName}} s'è\nripreso!",
"keptGoingAndCrashed": "{{pokemonName}} si sbilancia e\nsi schianta!",
@@ -61,5 +65,6 @@
"suppressAbilities": "L’abilità di {{pokemonName}}\nperde ogni efficacia!",
"revivalBlessing": "{{pokemonName}} torna in forze!",
"swapArenaTags": "{{pokemonName}} ha invertito gli effetti attivi\nnelle due metà del campo!",
- "exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!"
+ "exposedMove": "{{pokemonName}} ha identificato\n{{targetPokemonName}}!",
+ "safeguard": "Salvaguardia protegge {{targetName}}!"
}
\ No newline at end of file
diff --git a/src/locales/it/party-ui-handler.json b/src/locales/it/party-ui-handler.json
index f5582e5b630..95466779727 100644
--- a/src/locales/it/party-ui-handler.json
+++ b/src/locales/it/party-ui-handler.json
@@ -1,42 +1,47 @@
{
- "SEND_OUT": "Manda in campo",
- "SUMMARY": "Sommario",
- "CANCEL": "Annulla",
- "RELEASE": "Rilascia",
- "APPLY": "Applica",
- "TEACH": "Insegna",
- "SPLICE": "Unisci",
- "UNSPLICE": "Dividi",
- "ACTIVATE": "Attiva",
- "DEACTIVATE": "Disattiva",
- "TRANSFER": "Trasferisci",
- "ALL": "Tutto",
- "PASS_BATON": "Staffetta",
- "UNPAUSE_EVOLUTION": "Consenti evoluzione",
- "REVIVE": "Revitalizza",
- "RENAME": "Rinomina",
- "choosePokemon": "Scegli un Pokémon.",
- "doWhatWithThisPokemon": "Hai selezionato questo Pokémon.",
- "noEnergy": "{{pokemonName}} non ha più energie\nper lottare!",
- "hasEnergy": "{{pokemonName}} ha ancora energie\nper lottare!",
- "cantBeUsed": "{{pokemonName}} non può essere usato\nin questa sfida!",
- "tooManyItems": "{{pokemonName}} possiede già\nquest'oggetto in abbondanza!",
- "anyEffect": "Non avrebbe alcun effetto.",
- "unpausedEvolutions": "{{pokemonName}} può di nuovo evolversi.",
- "unspliceConfirmation": "Vuoi davvero dividere {{fusionName}}\nda {{pokemonName}}? {{fusionName}} andrà perduto.",
- "wasReverted": "{{fusionName}} è tornato ad essere {{pokemonName}}.",
- "releaseConfirmation": "Vuoi davvero liberare {{pokemonName}}?",
- "releaseInBattle": "Non puoi liberare un Pokémon che sta combattendo!",
- "selectAMove": "Scegli una mossa.",
- "changeQuantity": "Scegli un oggetto da trasferire.\nUsa < e > per cambiarne la quantità.",
- "selectAnotherPokemonToSplice": "Scegli un altro Pokémon da unire.",
- "cancel": "Annulla",
- "goodbye": "Addio, {{pokemonName}}!",
- "byebye": "Ciao ciao, {{pokemonName}}!",
- "farewell": "Arrivederci, {{pokemonName}}!",
- "soLong": "È stato bello, {{pokemonName}}!",
- "thisIsWhereWePart": "Le nostre strade si dividono, {{pokemonName}}!",
- "illMissYou": "Mi mancherai, {{pokemonName}}!",
- "illNeverForgetYou": "Non ti dimenticherò, {{pokemonName}}!",
- "untilWeMeetAgain": "Alla prossima, {{pokemonName}}!"
- }
\ No newline at end of file
+ "SEND_OUT": "Manda in campo",
+ "SUMMARY": "Sommario",
+ "CANCEL": "Annulla",
+ "RELEASE": "Rilascia",
+ "APPLY": "Applica",
+ "TEACH": "Insegna",
+ "SPLICE": "Unisci",
+ "UNSPLICE": "Dividi",
+ "ACTIVATE": "Attiva",
+ "DEACTIVATE": "Disattiva",
+ "TRANSFER": "Trasferisci",
+ "ALL": "Tutto",
+ "PASS_BATON": "Staffetta",
+ "UNPAUSE_EVOLUTION": "Consenti evoluzione",
+ "REVIVE": "Revitalizza",
+ "RENAME": "Rinomina",
+ "choosePokemon": "Scegli un Pokémon.",
+ "doWhatWithThisPokemon": "Hai selezionato questo Pokémon.",
+ "noEnergy": "{{pokemonName}} non ha più energie\nper lottare!",
+ "hasEnergy": "{{pokemonName}} ha ancora energie\nper lottare!",
+ "cantBeUsed": "{{pokemonName}} non può essere usato\nin questa sfida!",
+ "tooManyItems": "{{pokemonName}} possiede già\nquest'oggetto in abbondanza!",
+ "anyEffect": "Non avrebbe alcun effetto.",
+ "unpausedEvolutions": "{{pokemonName}} può di nuovo evolversi.",
+ "unspliceConfirmation": "Vuoi davvero dividere {{fusionName}}\nda {{pokemonName}}? {{fusionName}} andrà perduto.",
+ "wasReverted": "{{fusionName}} è tornato ad essere {{pokemonName}}.",
+ "releaseConfirmation": "Vuoi davvero liberare {{pokemonName}}?",
+ "releaseInBattle": "Non puoi liberare un Pokémon che sta combattendo!",
+ "selectAMove": "Scegli una mossa.",
+ "changeQuantity": "Scegli un oggetto da trasferire.\nUsa < e > per cambiarne la quantità.",
+ "selectAnotherPokemonToSplice": "Scegli un altro Pokémon da unire.",
+ "cancel": "Annulla",
+ "able": "Sì!",
+ "notAble": "No!",
+ "learned": "La conosce!",
+ "goodbye": "Addio, {{pokemonName}}!",
+ "byebye": "Ciao ciao, {{pokemonName}}!",
+ "farewell": "Arrivederci, {{pokemonName}}!",
+ "soLong": "È stato bello, {{pokemonName}}!",
+ "thisIsWhereWePart": "Le nostre strade si dividono, {{pokemonName}}!",
+ "illMissYou": "Mi mancherai, {{pokemonName}}!",
+ "illNeverForgetYou": "Non ti dimenticherò, {{pokemonName}}!",
+ "untilWeMeetAgain": "Alla prossima, {{pokemonName}}!",
+ "sayonara": "Sayonara, {{pokemonName}}!",
+ "smellYaLater": "Ci becchiamo, {{pokemonName}}!"
+}
diff --git a/src/locales/it/pokemon-info-container.json b/src/locales/it/pokemon-info-container.json
index c3cc8d49ce1..f3de9081ebc 100644
--- a/src/locales/it/pokemon-info-container.json
+++ b/src/locales/it/pokemon-info-container.json
@@ -2,5 +2,6 @@
"moveset": "Set di mosse",
"gender": "Genere:",
"ability": "Abilità:",
- "nature": "Natura:"
-}
\ No newline at end of file
+ "nature": "Natura:",
+ "form": "Forma:"
+}
diff --git a/src/locales/it/pokemon.json b/src/locales/it/pokemon.json
index 9e26dfeeb6e..dcc4cc7f310 100644
--- a/src/locales/it/pokemon.json
+++ b/src/locales/it/pokemon.json
@@ -1 +1,23 @@
-{}
\ No newline at end of file
+{
+ "type_null": "Tipo Zero",
+ "great_tusk": "Grandizanne",
+ "scream_tail": "Codaurlante",
+ "brute_bonnet": "Fungofurioso",
+ "flutter_mane": "Crinealato",
+ "slither_wing": "Alirasenti",
+ "sandy_shocks": "Peldisabbia",
+ "iron_treads": "Solcoferreo",
+ "iron_bundle": "Saccoferreo",
+ "iron_hands": "Manoferrea",
+ "iron_jugulis": "Colloferreo",
+ "iron_moth": "Falenaferrea",
+ "iron_thorns": "Spineferree",
+ "roaring_moon": "Lunaruggente",
+ "iron_valiant": "Eroeferreo",
+ "walking_wake": "Acquecrespe",
+ "iron_leaves": "Fogliaferrea",
+ "gouging_fire": "Vampeaguzze",
+ "raging_bolt": "Furiatonante",
+ "iron_boulder": "Massoferreo",
+ "iron_crown": "Capoferreo"
+}
diff --git a/src/locales/it/settings.json b/src/locales/it/settings.json
index 381503f21bd..c09f5e22d4d 100644
--- a/src/locales/it/settings.json
+++ b/src/locales/it/settings.json
@@ -8,7 +8,7 @@
"moveTouchControls": "Move Touch Controls",
"shopOverlayOpacity": "Opacità Finestra Negozio",
"shopCursorTarget": "Target Cursore Negozio",
- "items": "Oggetti",
+ "rewards": "Oggetti",
"reroll": "Rerolla",
"shop": "Negozio",
"checkTeam": "Squadra"
diff --git a/src/locales/ja/ability-trigger.json b/src/locales/ja/ability-trigger.json
index f9d1cc60e4c..ec77d4d97d3 100644
--- a/src/locales/ja/ability-trigger.json
+++ b/src/locales/ja/ability-trigger.json
@@ -12,7 +12,6 @@
"blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!",
"typeImmunityHeal": "{{pokemonNameWithAffix}}は {{abilityName}}で\n体力を 回復した!",
"nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}}は {{abilityName}}で\nダメージを 受けない。",
- "postDefendDisguise": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた!",
"moveImmunity": "{{pokemonNameWithAffix}}には\n効果が ないようだ…",
"reverseDrain": "{{pokemonNameWithAffix}}は\nヘドロえきを 吸い取った!",
"postDefendTypeChange": "{{pokemonNameWithAffix}}は {{abilityName}}で\n{{typeName}}タイプに なった!",
@@ -60,4 +59,4 @@
"postSummonTabletsOfRuin": "{{pokemonNameWithAffix}}の わざわいのおふだ\nまわりの {{statName}}が 弱まった!",
"postSummonBeadsOfRuin": "{{pokemonNameWithAffix}}の わざわいのたまで\nまわりの {{statName}}が 弱まった!",
"preventBerryUse": "{{pokemonNameWithAffix}}は 緊張して\nきのみが 食べられなくなった!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/achv.json b/src/locales/ja/achv.json
index 0dc5dc8185a..182da0aed2e 100644
--- a/src/locales/ja/achv.json
+++ b/src/locales/ja/achv.json
@@ -6,7 +6,7 @@
"name": "なし"
},
"MoneyAchv": {
- "description": "一回の ランで ₽{{moneyAmount}}を 稼ぐ"
+ "description": "一回の ランで {{moneyAmount}}円を 稼ぐ"
},
"10K_MONEY": {
"name": "お金を持つ人"
@@ -21,7 +21,7 @@
"name": "超富裕層"
},
"DamageAchv": {
- "description": "一撃で {{damageAmount}}ダメージを 与える"
+ "description": "一撃で HP{{damageAmount}}の ダメージを 与える"
},
"250_DMG": {
"name": "力持ち"
@@ -33,10 +33,11 @@
"name": "カカロット"
},
"10000_DMG": {
- "name": "ワンパンマン"
+ "name": "ワンパンマン",
+ "name_female": "ワンパンウーマン"
},
"HealAchv": {
- "description": "一つの 技や 特性や 持っているアイテムで {{healAmount}}{{HP}}を 一気に 回復する"
+ "description": "一つの 技や 特性や 持っているアイテムで\n{{healAmount}}{{HP}}を 一気に 回復する"
},
"250_HEAL": {
"name": "回復発見者"
@@ -80,9 +81,9 @@
"100_RIBBONS": {
"name": "マスターリーグチャンピオン"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "同力",
- "description": "少なくとも 一つの 能力を 最大まで あげて 他の 手持ちポケモンに バトンタッチする"
+ "description": "少なくとも 一つの 能力を 最大まで あげて\n他の 手持ちポケモンに バトンタッチする"
},
"MAX_FRIENDSHIP": {
"name": "マブ達",
@@ -106,7 +107,7 @@
},
"SPLICE": {
"name": "インフィニット・フュジョン",
- "description": "いでんしのくさびで 二つの ポケモンを 吸収合体させる"
+ "description": "遺伝子のくさびで 二つの ポケモンを 吸収合体させる"
},
"MINI_BLACK_HOLE": {
"name": "アイテムホーリック",
@@ -161,8 +162,8 @@
"description": "クラシックモードを クリアする"
},
"UNEVOLVED_CLASSIC_VICTORY": {
- "name": "Bring Your Child To Work Day",
- "description": "Beat the game in Classic Mode with at least one unevolved party member."
+ "name": "はじめてのおつかい",
+ "description": "少なくとも 一つの 進化していない 手持ちポケモンで\nクラシックモードを クリアする"
},
"MONO_GEN_ONE": {
"name": "原始",
@@ -260,5 +261,9 @@
"FRESH_START": {
"name": "一発で!",
"description": "出直しチャレンジを クリアする"
+ },
+ "INVERSE_BATTLE": {
+ "name": "カガミよミガカ",
+ "description": "反転バトルチャレンジを クリアする\nるすアリク をジンレャチルトバ転反"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/battler-tags.json b/src/locales/ja/battler-tags.json
index beef485ffd2..25412c971e9 100644
--- a/src/locales/ja/battler-tags.json
+++ b/src/locales/ja/battler-tags.json
@@ -1,4 +1,12 @@
{
+ "trappedDesc": "捕らわれること",
+ "flinchedDesc": "ひるむこと",
+ "confusedDesc": "混乱",
+ "infatuatedDesc": "メロメロ",
+ "seedDesc": "種を植えつくこと",
+ "nightmareDesc": "あくむ",
+ "ingrainDesc": "根",
+ "drowsyDesc": "ねむけ",
"rechargingLapse": "{{pokemonNameWithAffix}}は 攻撃の 反動で 動けない!",
"trappedOnAdd": "{{pokemonNameWithAffix}}は もう 逃げられない!",
"trappedOnRemove": "{{pokemonNameWithAffix}}は\n{{moveName}}の 効果が 解けた!",
@@ -13,9 +21,9 @@
"infatuatedOnAdd": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロに なった!",
"infatuatedOnOverlap": "{{pokemonNameWithAffix}}は すでに メロメロだ!",
"infatuatedLapse": "{{pokemonNameWithAffix}}は {{sourcePokemonName}}に メロメロだ!",
- "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は\nメロメロで わざが 出せなかった!",
+ "infatuatedLapseImmobilize": "{{pokemonNameWithAffix}}は メロメロで 技が出せなかった!",
"infatuatedOnRemove": "{{pokemonNameWithAffix}}は メロメロ状態が 治った!",
- "seededOnAdd": "{{pokemonNameWithAffix}}に 種を 植(う)えつけた!",
+ "seededOnAdd": "{{pokemonNameWithAffix}}に 種を 植えつけた!",
"seededLapse": "やどりぎが {{pokemonNameWithAffix}}の 体力を うばう!",
"seededLapseShed": "{{pokemonNameWithAffix}}は ヘドロえきを 吸い取った!",
"nightmareOnAdd": "{{pokemonNameWithAffix}}は あくむを 見始めた!",
@@ -60,4 +68,4 @@
"cursedOnAdd": "{{pokemonNameWithAffix}}は 自分の 体力を 削って\n{{pokemonName}}に のろいを かけた!",
"cursedLapse": "{{pokemonNameWithAffix}}は のろわれている!",
"stockpilingOnAdd": "{{pokemonNameWithAffix}}は {{stockpiledCount}}つ たくわえた!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/berry.json b/src/locales/ja/berry.json
index 641901583b2..73d13d5e8f0 100644
--- a/src/locales/ja/berry.json
+++ b/src/locales/ja/berry.json
@@ -1,46 +1,46 @@
{
"SITRUS": {
"name": "オボンのみ",
- "effect": "HP 50%いかのとき HPを 25パーセント かいふくする"
+ "effect": "持たせると HPが 50%以下になるとき HPを 25% 回復する"
},
"LUM": {
"name": "ラムのみ",
- "effect": "すべての じょうたい いじょうと こんらんを かいふくする"
+ "effect": "持たせると 状態異常や 混乱になるとき 回復する\n"
},
"ENIGMA": {
"name": "ナゾのみ",
- "effect": "こうかばつぐんの わざを うけたとき HPを 25パーセント かいふくする"
+ "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する"
},
"LIECHI": {
"name": "チイラのみ",
- "effect": "HP 25%いかのとき こうげきが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる"
},
"GANLON": {
"name": "リュガのみ",
- "effect": "HP 25%いかのとき ぼうぎょが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 防御が あがる\n"
},
"PETAYA": {
"name": "ヤタピのみ",
- "effect": "HP 25%いかのとき とくこうが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる\n"
},
"APICOT": {
"name": "ズアのみ",
- "effect": "HP 25%いかのとき とくぼうが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 特防が あがる\n"
},
"SALAC": {
"name": "カムラのみ",
- "effect": "HP 25%いかのとき すばやさが あがる"
+ "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる"
},
"LANSAT": {
"name": "サンのみ",
- "effect": "HP 25%いかのとき こうげきが きゅうしょに あたりやすくなる"
+ "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる"
},
"STARF": {
"name": "スターのみ",
- "effect": "HP 25%いかのとき のうりょくの どれか 1つが ぐーんと あがる"
+ "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる"
},
"LEPPA": {
"name": "ヒメリのみ",
- "effect": "PPが 0に なった わざの PPを 10だけ かいふくする"
+ "effect": "持たせると PPが 0になる 技のPPを 10回復する"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/challenges.json b/src/locales/ja/challenges.json
index 29f6ca835fe..99c6e978d49 100644
--- a/src/locales/ja/challenges.json
+++ b/src/locales/ja/challenges.json
@@ -1,10 +1,10 @@
{
- "title": "チャレンジを 設定",
+ "title": "チャレンジを 設定",
"illegalEvolution": "{{pokemon}}は このチャレンジで\n対象外の ポケモンに なってしまった!",
"singleGeneration": {
"name": "単一世代",
- "desc": "{{gen}}世代からの ポケモンしか 使えません",
- "desc_default": "選んだ 世代からの ポケモンしか 使えません",
+ "desc": "{{gen}}世代からの ポケモンしか 使えません",
+ "desc_default": "選んだ 世代からの ポケモンしか 使えません",
"gen_1": "1",
"gen_2": "2",
"gen_3": "3",
@@ -17,13 +17,20 @@
},
"singleType": {
"name": "単一タイプ",
- "desc": "{{type}}タイプの ポケモンしか 使えません",
- "desc_default": "選んだ タイプの ポケモンしか 使えません"
+ "desc": "{{type}}タイプの ポケモンしか 使えません",
+ "desc_default": "選んだ タイプの ポケモンしか 使えません"
},
"freshStart": {
"name": "出直し",
- "desc": "ポケローグを 始めた ばかりの ような ままで ゲーム開始の 最初のパートナーしか 使えません",
+ "desc": "ポケローグを 始めた ばかりの ような ままで ゲーム開始の スターターしか 使えません",
+ "value.0": "オフ",
+ "value.1": "オン"
+ },
+ "inverseBattle": {
+ "name": "反転バトル",
+ "shortName": "反バ",
+ "desc": "タイプ相性が 反転で、なんの タイプも 「効果はなし」が ありません\n他の チャレンジの 実績が 無効に されます",
"value.0": "オフ",
"value.1": "オン"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/command-ui-handler.json b/src/locales/ja/command-ui-handler.json
index 0b2020a9517..6248a19785f 100644
--- a/src/locales/ja/command-ui-handler.json
+++ b/src/locales/ja/command-ui-handler.json
@@ -3,5 +3,5 @@
"ball": "ボール",
"pokemon": "ポケモン",
"run": "にげる",
- "actionMessage": "{{pokemonName}}は どうする?"
-}
\ No newline at end of file
+ "actionMessage": "{{pokemonName}}は どうする?"
+}
diff --git a/src/locales/ja/config.ts b/src/locales/ja/config.ts
index 5fbf0497d94..f8afd6eb167 100644
--- a/src/locales/ja/config.ts
+++ b/src/locales/ja/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const jaConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/ja/dialogue-double-battle-female.json b/src/locales/ja/dialogue-double-battle-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-double-battle-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ja/dialogue-double-battle-male.json b/src/locales/ja/dialogue-double-battle-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-double-battle-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/es/dialogue-final-boss-male.json b/src/locales/ja/dialogue-double-battle.json
similarity index 100%
rename from src/locales/es/dialogue-final-boss-male.json
rename to src/locales/ja/dialogue-double-battle.json
diff --git a/src/locales/ja/dialogue-female.json b/src/locales/ja/dialogue-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ja/dialogue-final-boss-female.json b/src/locales/ja/dialogue-final-boss-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-final-boss-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ja/dialogue-final-boss-male.json b/src/locales/ja/dialogue-final-boss-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-final-boss-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/es/dialogue-misc-female.json b/src/locales/ja/dialogue-final-boss.json
similarity index 100%
rename from src/locales/es/dialogue-misc-female.json
rename to src/locales/ja/dialogue-final-boss.json
diff --git a/src/locales/ja/dialogue-male.json b/src/locales/ja/dialogue-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ja/dialogue-misc-female.json b/src/locales/ja/dialogue-misc-female.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-misc-female.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/ja/dialogue-misc-male.json b/src/locales/ja/dialogue-misc-male.json
deleted file mode 100644
index 9e26dfeeb6e..00000000000
--- a/src/locales/ja/dialogue-misc-male.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/src/locales/es/dialogue-misc-male.json b/src/locales/ja/dialogue-misc.json
similarity index 100%
rename from src/locales/es/dialogue-misc-male.json
rename to src/locales/ja/dialogue-misc.json
diff --git a/src/locales/it/dialogue-double-battle-female.json b/src/locales/ja/dialogue.json
similarity index 100%
rename from src/locales/it/dialogue-double-battle-female.json
rename to src/locales/ja/dialogue.json
diff --git a/src/locales/ja/egg.json b/src/locales/ja/egg.json
index b0cb7b7de61..91b1442c56c 100644
--- a/src/locales/ja/egg.json
+++ b/src/locales/ja/egg.json
@@ -4,23 +4,23 @@
"ultraTier": "超レア",
"masterTier": "伝説",
"defaultTier": "ふつう",
- "hatchWavesMessageSoon": "なかから おとが きこえてくる! もうすぐ うまれそう!",
- "hatchWavesMessageClose": "ときどき うごいている みたい。 うまれるまで もう ちょっとかな?",
- "hatchWavesMessageNotClose": "なにが うまれてくるのかな? うまれるまで まだまだ じかんが かかりそう。",
- "hatchWavesMessageLongTime": "この タマゴは うまれるまで かなり じかんが かかりそう。",
+ "hatchWavesMessageSoon": "中から 音が 聞こえてくる! もうすぐ 生まれそう!",
+ "hatchWavesMessageClose": "時々 動いている みたい。生まれるまで もう ちょっとかな?",
+ "hatchWavesMessageNotClose": "なにが 生まれてくるのかな? 生まれるまで まだまだ 時間が かかりそう。",
+ "hatchWavesMessageLongTime": "この タマゴは 生まれるまで かなり 時間が かかりそう。",
"gachaTypeLegendary": "伝説確率アップ",
- "gachaTypeMove": "レアなタマゴわざ確率アップ",
+ "gachaTypeMove": "レアなタマゴ技確率アップ",
"gachaTypeShiny": "色違い確率アップ",
"selectMachine": "ガチャマシンを選択",
"notEnoughVouchers": "タマゴクーポンが足りません!",
"tooManyEggs": "タマゴが一杯です!",
"pull": "回引く",
"pulls": "回引く",
- "sameSpeciesEgg": "{{species}}は このタマゴから うまれる!",
- "hatchFromTheEgg": "{{pokemonName}}は タマゴから うまれた!",
- "eggMoveUnlock": "タマゴわざ {{moveName}}を おぼえた!",
- "rareEggMoveUnlock": "レアなタマゴわざ {{moveName}}を おぼえた!!",
- "moveUPGacha": "わざ UP!",
+ "sameSpeciesEgg": "{{species}}は このタマゴから 生まれる!",
+ "hatchFromTheEgg": "{{pokemonName}}は タマゴから 生まれた!",
+ "eggMoveUnlock": "タマゴ技: {{moveName}}を 覚えた!",
+ "rareEggMoveUnlock": "レアなタマゴ技: {{moveName}}を 覚えた!!",
+ "moveUPGacha": "技 UP!",
"shinyUPGacha": "色違い UP!",
"legendaryUPGacha": "UP!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/game-mode.json b/src/locales/ja/game-mode.json
index 36559e5cce3..dc04b36932f 100644
--- a/src/locales/ja/game-mode.json
+++ b/src/locales/ja/game-mode.json
@@ -1,8 +1,8 @@
{
"classic": "クラシック",
"endless": "エンドレス",
- "endlessSpliced": "エンドレス (Spliced)",
+ "endlessSpliced": "エンドレス(吸収合体)",
"dailyRun": "デイリーラン",
- "unknown": "Unknown",
+ "unknown": "???",
"challenge": "チャレンジ"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/game-stats-ui-handler.json b/src/locales/ja/game-stats-ui-handler.json
index 25bb21f701a..2fff802734a 100644
--- a/src/locales/ja/game-stats-ui-handler.json
+++ b/src/locales/ja/game-stats-ui-handler.json
@@ -1,6 +1,6 @@
{
"stats": "統計",
- "playTime": "プレー時間",
+ "playTime": "プレイ時間",
"totalBattles": "合計バトル数",
"starters": "スターター数",
"shinyStarters": "色違いスターター数",
@@ -12,31 +12,31 @@
"dailyRunAttempts": "デイリーラン",
"dailyRunWins": "デイリーラン勝利",
"endlessRuns": "エンドレスラン",
- "highestWaveEndless": "エンドレス最高ウェーブ",
+ "highestWaveEndless": "エンドレス最高波",
"highestMoney": "最大貯金",
"highestDamage": "最大ダメージ",
"highestHPHealed": "最大HP回復",
"pokemonEncountered": "遭遇したポケモン",
"pokemonDefeated": "倒したポケモン",
"pokemonCaught": "捕まえたポケモン",
- "eggsHatched": "ふかしたタマゴ",
- "subLegendsSeen": "見つけた順伝説",
- "subLegendsCaught": "捕まえた順伝説",
- "subLegendsHatched": "ふかした順伝説",
- "legendsSeen": "見つけた伝説",
- "legendsCaught": "捕まえた伝説",
- "legendsHatched": "ふかした伝説",
+ "eggsHatched": "孵化したタマゴ",
+ "subLegendsSeen": "見つけた順伝説ポケモン",
+ "subLegendsCaught": "捕まえた準伝説ポケモン",
+ "subLegendsHatched": "孵化した準伝説ポケモン",
+ "legendsSeen": "見つけた伝説ポケモン",
+ "legendsCaught": "捕まえた伝説ポケモン",
+ "legendsHatched": "孵化した伝説ポケモン",
"mythicalsSeen": "見つけた幻ポケモン",
"mythicalsCaught": "捕まえた幻ポケモン",
- "mythicalsHatched": "ふかした幻ポケモン",
- "shiniesSeen": "見つけた色違い",
- "shiniesCaught": "捕まえた色違い",
- "shiniesHatched": "ふかした色違い",
- "pokemonFused": "合体したポケモン",
+ "mythicalsHatched": "孵化した幻ポケモン",
+ "shiniesSeen": "見つけた色違いポケモン",
+ "shiniesCaught": "捕まえた色違いポケモン",
+ "shiniesHatched": "孵化した色違いポケモン",
+ "pokemonFused": "吸収合体したポケモン",
"trainersDefeated": "倒したトレーナー",
"eggsPulled": "引いたタマゴ",
"rareEggsPulled": "引いたレアタマゴ",
"epicEggsPulled": "引いた超レアタマゴ",
"legendaryEggsPulled": "引いた伝説タマゴ",
"manaphyEggsPulled": "引いたマナフィタマゴ"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/menu-ui-handler.json b/src/locales/ja/menu-ui-handler.json
index beb014b84a9..1930c3999c6 100644
--- a/src/locales/ja/menu-ui-handler.json
+++ b/src/locales/ja/menu-ui-handler.json
@@ -2,19 +2,22 @@
"GAME_SETTINGS": "設定",
"ACHIEVEMENTS": "実績",
"STATS": "統計",
+ "RUN_HISTORY": "ラン歴",
"EGG_LIST": "タマゴリスト",
"EGG_GACHA": "タマゴガチャ",
"MANAGE_DATA": "データ管理",
"COMMUNITY": "コミュニティ",
- "SAVE_AND_QUIT": "保存して終了",
+ "SAVE_AND_QUIT": "セーブして終了",
"LOG_OUT": "ログアウト",
"slot": "スロット {{slotNumber}}",
- "importSession": "セッションのインポート",
+ "importSession": "セッションをインポート",
"importSlotSelect": "インポート先の スロットを 選んでください",
- "exportSession": "セッションのエクスポート",
+ "exportSession": "セッションをエクスポート",
"exportSlotSelect": "エクスポート元の スロットを 選んでください",
- "importData": "データのインポート",
- "exportData": "データのエクスポート",
+ "importRunHistory": "ラン歴をインポート",
+ "exportRunHistory": "ラン歴をエクスポート",
+ "importData": "データをインポート",
+ "exportData": "データをエクスポート",
"consentPreferences": "同意設定",
"linkDiscord": "Discord連携",
"unlinkDiscord": "Discord連携解除",
@@ -22,5 +25,5 @@
"unlinkGoogle": "Google連携解除",
"cancel": "キャンセル",
"losingProgressionWarning": "戦闘開始からの データが 保存されません。\nよろしいですか?",
- "noEggs": "現在 タマゴを ふかしていません!"
-}
\ No newline at end of file
+ "noEggs": "現在は タマゴを 孵化していません!"
+}
diff --git a/src/locales/ja/menu.json b/src/locales/ja/menu.json
index ce6f9ae0672..0e7701578bf 100644
--- a/src/locales/ja/menu.json
+++ b/src/locales/ja/menu.json
@@ -1,38 +1,55 @@
{
"cancel": "キャンセル",
"continue": "つづきから",
- "loadGame": "ロードセーブ",
+ "dailyRun": "日替わりラン(ベータ版)",
+ "loadGame": "セーブを読み込む",
"newGame": "はじめから",
- "username": "ユーザーめい",
+ "settings": "設定",
+ "selectGameMode": "ゲームモードを 選んでください。",
+ "logInOrCreateAccount": "始めるには、ログイン、または 登録して ください。\nメールアドレスは 必要が ありません!",
+ "username": "ユーザー名",
"password": "パスワード",
"login": "ログイン",
- "orUse": "Or use",
- "register": "かいいん とうろく",
- "emptyUsername": "ユーザー名は空にできません",
- "invalidLoginUsername": "入力したユーザー名は無効です",
- "invalidRegisterUsername": "ユーザー名には英文字、数字、アンダースコアのみを含める必要があります",
+ "orUse": "他の\nログイン方法",
+ "register": "登録",
+ "emptyUsername": "ユーザー名を 空にする ことは できません",
+ "invalidLoginUsername": "入力されたユーザー名は無効です",
+ "invalidRegisterUsername": "ユーザー名には 英文字、 数字、 アンダースコアのみを 含くむ必要が あります",
"invalidLoginPassword": "入力したパスワードは無効です",
- "invalidRegisterPassword": "パスワードは6文字以上でなければなりません",
- "usernameAlreadyUsed": "ユーザー名は既に使用されています",
- "accountNonExistent": "ユーザーは存在しません",
- "unmatchingPassword": "パスワードが一致しません",
- "passwordNotMatchingConfirmPassword": "パスワードは確認パスワードと一致する必要があります",
+ "invalidRegisterPassword": "パスワードは 6文字以上 でなければなりません",
+ "usernameAlreadyUsed": "入力したユーザー名は すでに 使用されています",
+ "accountNonExistent": "入力したユーザーは 存在しません",
+ "unmatchingPassword": "入力したパスワードが 一致しません",
+ "passwordNotMatchingConfirmPassword": "パスワードは パスワード確認と 一致する 必要があります",
"confirmPassword": "パスワード確認",
- "registrationAgeWarning": "登録することで、あなたが13歳以上であることを確認します。",
+ "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。",
"backToLogin": "ログインへ",
- "failedToLoadSaveData": "保存データの読み込みに失敗しました。ページを再読み込みしてください。\nこれが続く場合は、管理者に連絡してください。",
- "sessionSuccess": "セッションが正常に読み込まれました。",
- "failedToLoadSession": "セッションデータを読み込むことができませんでした。\nデータが破損している可能性があります。",
- "boyOrGirl": "おとこのこ?\nそれとも おんなのこ?",
- "evolving": "…おや!?\n{{pokemonName}}のようすが…!",
- "stoppedEvolving": "{{pokemonName}}のへんかがとまった",
- "evolutionDone": "おめでとう!\n{{pokemonName}}は{{evolvedPokemonName}}にしんかした!",
- "dailyRankings": "ほんじつのランキング",
- "weeklyRankings": "しゅうのランキング",
+ "failedToLoadSaveData": "セーブデータの 読み込みは 不可能でした。ページを 再読み込み してください。\n長い間に続く 場合は 管理者に 連絡してください。",
+ "sessionSuccess": "セッションが 正常に 読み込まれました。",
+ "failedToLoadSession": "セッションデータを 読み込むことが できませんでした。\nデータが 破損している 可能性が あります。",
+ "boyOrGirl": "男の子?\nそれとも 女の子?",
+ "evolving": "…おや!?\n{{pokemonName}}の 様子が…!",
+ "stoppedEvolving": "あれ…? {{pokemonName}}の 変化が 止まった!",
+ "pauseEvolutionsQuestion": "{{pokemonName}}の 進化を 休止しますか?\n後で 手持ち画面から 進化を また 可能にできます。",
+ "evolutionsPaused": "{{pokemonName}}の 進化を 休止しました。",
+ "evolutionDone": "おめでとう!\n{{pokemonName}}は {{evolvedPokemonName}}に 進化した!",
+ "dailyRankings": "今日のランキング",
+ "weeklyRankings": "今週のランキング",
"noRankings": "ランキングなし",
"positionIcon": "#",
- "loading": "よみこみちゅう…",
+ "usernameScoreboard": "ユーザー名",
+ "score": "スコア",
+ "wave": "波",
+ "loading": "読み込み中…",
+ "loadingAsset": "読み込み中:{{assetName}}",
"playersOnline": "オンラインのプレイヤー",
"yes": "はい",
- "no": "いいえ"
-}
\ No newline at end of file
+ "no": "いいえ",
+ "disclaimer": "免責",
+ "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、さらに更新され、完成されるとも 限りません。",
+ "choosePokemon": "ポケモンを選ぶ",
+ "renamePokemon": "ニックネームを変える",
+ "rename": "変える",
+ "nickname": "ニックネーム",
+ "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。"
+}
diff --git a/src/locales/ja/modifier-select-ui-handler.json b/src/locales/ja/modifier-select-ui-handler.json
index 9370f01491e..d7428c8e373 100644
--- a/src/locales/ja/modifier-select-ui-handler.json
+++ b/src/locales/ja/modifier-select-ui-handler.json
@@ -1,12 +1,12 @@
{
"transfer": "アイテム移行",
"reroll": "選択肢変更",
- "lockRarities": "レア度の固定",
- "checkTeam": "チームを確認",
- "transferDesc": "ポケモンの 手持ちアイテムを 移行する",
+ "lockRarities": "レア度を固定",
+ "checkTeam": "手持ちを確認",
+ "transferDesc": "手持ちポケモンの 持たせるアイテムを 移行する",
"rerollDesc": "お金を 使って アイテムの 選択肢を 変更する",
- "lockRaritiesDesc": "選択肢を 変更するときの レア度を 固定する\n(選択肢変更金額を影響する)",
- "checkTeamDesc": "チームの 状態を 確認する\nフォルムチェンジアイテムを 有効・無効にする",
+ "lockRaritiesDesc": "選択肢を 変更するときの レア度を 固定する\n(選択肢変更の価格は変わる)",
+ "checkTeamDesc": "手持ちポケモンの 状態を 確認する\nフォルムチェンジアイテムを 有効・無効にする",
"rerollCost": "{{formattedMoney}}円",
"itemCost": "{{formattedMoney}}円"
}
diff --git a/src/locales/ja/modifier-type.json b/src/locales/ja/modifier-type.json
index 6effb1d9d82..f1fcc4d3005 100644
--- a/src/locales/ja/modifier-type.json
+++ b/src/locales/ja/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "バトル{{battleCount}}かいのあいだ ダブルバトルになるかくりつを2ばいにする"
},
- "TempBattleStatBoosterModifierType": {
- "description": "すべてのパーティメンバーの {{tempBattleStatName}}を5かいのバトルのあいだ 1だんかいあげる"
+ "TempStatStageBoosterModifierType": {
+ "description": "すべてのパーティメンバーの {{stat}}を5かいのバトルのあいだ 1だんかいあげる"
},
"AttackTypeBoosterModifierType": {
"description": "ポケモンの {{moveType}}タイプのわざのいりょくを20パーセントあげる"
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "すべてのパーティメンバーのレベルを1あげる"
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "ポケモンの{{statName}}のきほんステータスを10パーセントあげる。こたいちがたかいほどスタックのげんかいもたかくなる。"
+ "BaseStatBoosterModifierType": {
+ "description": "ポケモンの{{stat}}のきほんステータスを10パーセントあげる。こたいちがたかいほどスタックのげんかいもたかくなる。"
},
"AllPokemonFullHpRestoreModifierType": {
"description": "すべてのポケモンのHPを100パーセントかいふくする"
@@ -248,6 +248,12 @@
"name": "ピントレンズ",
"description": "弱点が 見える レンズ。持たせた ポケモンの技が 急所に 当たりやすくなる。"
},
+ "DIRE_HIT": {
+ "name": "クリティカット",
+ "extra": {
+ "raises": "きゅうしょりつ"
+ }
+ },
"LEEK": {
"name": "ながねぎ",
"description": "とても長くて 硬いクキ。カモネギに 持たせると 技が 急所に 当たりやすくなる。"
@@ -411,25 +417,13 @@
"description": "メタモンに 持たせると 素早さが あがる 不思議 粉。とても こまかくて 硬い。"
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "プラスパワー",
"x_defense": "ディフェンダー",
"x_sp_atk": "スペシャルアップ",
"x_sp_def": "スペシャルガード",
"x_speed": "スピーダー",
- "x_accuracy": "ヨクアタール",
- "dire_hit": "クリティカット"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "こうげき",
- "DEF": "ぼうぎょ",
- "SPATK": "とくこう",
- "SPDEF": "とくぼう",
- "SPD": "すばやさ",
- "ACC": "めいちゅう",
- "CRIT": "きゅうしょりつ",
- "EVA": "かいひ",
- "DEFAULT": "???"
+ "x_accuracy": "ヨクアタール"
},
"AttackTypeBoosterItem": {
"silk_scarf": "シルクのスカーフ",
@@ -569,4 +563,4 @@
"DOUSE_DRIVE": "アクアカセット",
"ULTRANECROZIUM_Z": "ウルトラネクロZ"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/modifier.json b/src/locales/ja/modifier.json
index 30d5270d94f..a42a849e232 100644
--- a/src/locales/ja/modifier.json
+++ b/src/locales/ja/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 回復!",
"hitHealApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 少し 回復!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}は\n{{typeName}}で 復活した!",
- "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}は {{typeName}}で\n下がった能力が 元に戻った!",
+ "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}は {{typeName}}で\n下がった能力が 元に戻った!",
"moneyInterestApply": "{{typeName}}から {{moneyAmount}}円 取得した!",
"turnHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を 吸い取った!",
"contactHeldItemTransferApply": "{{pokemonName}}の {{typeName}}が\n{{pokemonNameWithAffix}}の {{itemName}}を うばい取った!",
diff --git a/src/locales/ja/move-trigger.json b/src/locales/ja/move-trigger.json
index 0c404feeed6..11a327c01d7 100644
--- a/src/locales/ja/move-trigger.json
+++ b/src/locales/ja/move-trigger.json
@@ -2,7 +2,9 @@
"hitWithRecoil": "{{pokemonName}}は\nはんどうによる ダメージを うけた!",
"cutHpPowerUpMove": "{{pokemonName}}は\nたいりょくを けずって パワーぜんかい!",
"absorbedElectricity": "{{pokemonName}}は\n でんきを きゅうしゅうした!",
- "switchedStatChanges": "{{pokemonName}}は あいてと じぶんのn\nのうりょくへんかを いれかえた!",
+ "switchedStatChanges": "{{pokemonName}}は あいてと じぶんの\nのうりょくへんかを いれかえた!",
+ "sharedGuard": "{{pokemonName}}は\nおたがいのガードを シェアした!",
+ "sharedPower": "{{pokemonName}}は\nおたがいのパワーを シェアした!",
"goingAllOutForAttack": "{{pokemonName}}は\nほんきを だした!",
"regainedHealth": "{{pokemonName}}は\nたいりょくを かいふくした!",
"keptGoingAndCrashed": "いきおいあまって {{pokemonName}}は\nじめんに ぶつかった!",
@@ -59,4 +61,4 @@
"suppressAbilities": "{{pokemonName}}の とくせいが きかなくなった!",
"revivalBlessing": "{{pokemonName}}は\n復活して 戦えるようになった!",
"swapArenaTags": "{{pokemonName}}は\nおたがいの ばのこうかを いれかえた!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/pokemon-info.json b/src/locales/ja/pokemon-info.json
index 9b7a7506953..456b4949839 100644
--- a/src/locales/ja/pokemon-info.json
+++ b/src/locales/ja/pokemon-info.json
@@ -2,21 +2,22 @@
"Stat": {
"HP": "HP",
"HPshortened": "HP",
- "ATK": "こうげき",
- "ATKshortened": "こうげき",
- "DEF": "ぼうぎょ",
- "DEFshortened": "ぼうぎょ",
- "SPATK": "とくこう",
- "SPATKshortened": "とくこう",
- "SPDEF": "とくぼう",
- "SPDEFshortened": "とくぼう",
- "SPD": "すばやさ",
- "SPDshortened": "すばやさ",
- "ACC": "めいちゅう",
- "EVA": "かいひ"
+ "ATK": "攻撃",
+ "ATKshortened": "攻撃",
+ "DEF": "防御",
+ "DEFshortened": "防御",
+ "SPATK": "特攻",
+ "SPATKshortened": "特攻",
+ "SPDEF": "特防",
+ "SPDEFshortened": "特防",
+ "SPD": "素早さ",
+ "SPDshortened": "素早さ",
+ "ACC": "命中",
+ "EVA": "回避",
+ "HPStat": "HP"
},
"Type": {
- "UNKNOWN": "Unknown",
+ "UNKNOWN": "???",
"NORMAL": "ノーマル",
"FIGHTING": "かくとう",
"FLYING": "ひこう",
@@ -37,4 +38,4 @@
"FAIRY": "フェアリー",
"STELLAR": "ステラ"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/pokemon.json b/src/locales/ja/pokemon.json
index 6c182c09f86..e6fcd02a750 100644
--- a/src/locales/ja/pokemon.json
+++ b/src/locales/ja/pokemon.json
@@ -437,7 +437,7 @@
"bronzor": "ドーミラー",
"bronzong": "ドータクン",
"bonsly": "ウソハチ",
- "mime_jr.": "マネネ",
+ "mime_jr": "マネネ",
"happiny": "ピンプク",
"chatot": "ペラップ",
"spiritomb": "ミカルゲ",
@@ -770,7 +770,7 @@
"sandygast": "スナバァ",
"palossand": "シロデスナ",
"pyukumuku": "ナマコブシ",
- "type:_null": "タイプ:ヌル",
+ "type_null": "タイプ:ヌル",
"silvally": "シルヴァディ",
"minior": "メテノ",
"komala": "ネッコアラ",
@@ -863,7 +863,7 @@
"obstagoon": "タチフサグマ",
"perrserker": "ニャイキング",
"cursola": "サニゴーン",
- "sirfetch_d": "ネギガナイト",
+ "sirfetchd": "ネギガナイト",
"mr_rime": "バリコオル",
"runerigus": "デスバーン",
"milcery": "マホミル",
@@ -1081,4 +1081,4 @@
"paldea_tauros": "ケンタロス",
"paldea_wooper": "ウパー",
"bloodmoon_ursaluna": "ガチグマ"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/settings.json b/src/locales/ja/settings.json
index c88792979f6..55d39ee70a4 100644
--- a/src/locales/ja/settings.json
+++ b/src/locales/ja/settings.json
@@ -6,12 +6,14 @@
"audio": "音声",
"gamepad": "コントローラー",
"keyboard": "キーボード",
- "gameSpeed": "ゲームスピード",
- "hpBarSpeed": "HPバーの増減スピード",
- "expGainsSpeed": "EXPバーの増加スピード",
- "expPartyDisplay": "パーティの経験値取得表示",
+ "gameSpeed": "ゲームの速さ",
+ "hpBarSpeed": "HPバー増減の速さ",
+ "expGainsSpeed": "経験値バー増加の速さ",
+ "expPartyDisplay": "手持ちの経験値取得表示",
+ "skipSeenDialogues": "もう見た話をスキップ",
"battleStyle": "試合のルール",
- "enableRetries": "リトライを有効にする",
+ "enableRetries": "再挑戦を有効にする",
+ "hideIvs": "個体値スキャナーを隠す",
"tutorials": "チュートリアル",
"touchControls": "タッチ操作",
"vibrations": "振動",
@@ -35,33 +37,71 @@
"moneyFormat": "お金の表示形式",
"damageNumbers": "ダメージ表示",
"simple": "シンプル",
- "fancy": "Fancy",
+ "fancy": "オシャレ",
"abbreviated": "省略",
- "moveAnimations": "戦闘アニメ",
+ "moveAnimations": "戦闘アニメーション",
"showStatsOnLevelUp": "レベルアップ時のステータス表示",
+ "candyUpgradeNotification": "飴アプグレ通知",
"passivesOnly": "パッシブのみ",
+ "candyUpgradeDisplay": "飴アプグレ表示",
"icon": "アイコン",
"animation": "アニメーション",
- "moveInfo": "技の情報表示",
+ "moveInfo": "技情報",
+ "showMovesetFlyout": "技情報表示",
+ "showArenaFlyout": "戦場情報表示",
+ "showTimeOfDayWidget": "時刻指標",
+ "timeOfDayAnimation": "時刻指標アニメーション",
+ "bounce": "跳ねる",
+ "timeOfDay_back": "跳ね返る",
+ "spriteSet": "スプライト設定",
+ "consistent": "一貫",
+ "mixedAnimated": "アニメーションミックス",
+ "fusionPaletteSwaps": "吸収合体ポケモンの色違い",
"playerGender": "プレイヤーの性別",
- "typeHints": "相性のヒント",
+ "typeHints": "タイプ相性ヒント",
"masterVolume": "マスターボリューム",
- "bgmVolume": "BGMのボリューム",
- "seVolume": "SEのボリューム",
+ "bgmVolume": "BGMボリューム",
+ "fieldVolume": "フィールドボリューム",
+ "seVolume": "SEボリューム",
+ "uiVolume": "UIボリューム",
+ "musicPreference": "BGM設定",
+ "mixed": "ミックス",
+ "gamepadPleasePlug": "コントローラーを 接続してください\nまたは、ボタンを 押してください",
+ "delete": "削除",
+ "keyboardPleasePress": "キーを押してください",
"reset": "リセット",
"requireReload": "再読み込みが必要",
"action": "決定",
"back": "戻る",
+ "pressToBind": "押下でキーバインド",
+ "pressButton": "ボタンを押してください",
"buttonUp": "上",
"buttonDown": "下",
"buttonLeft": "左",
"buttonRight": "右",
"buttonAction": "決定",
"buttonMenu": "メニュー",
- "buttonSubmit": "Submit",
+ "buttonSubmit": "提出",
"buttonCancel": "キャンセル",
- "alt": " (代替)",
+ "buttonStats": "能力変化表示",
+ "buttonCycleForm": "フォルム変更",
+ "buttonCycleShiny": "色違い変更",
+ "buttonCycleGender": "性別変更",
+ "buttonCycleAbility": "特性変更",
+ "buttonCycleNature": "性格変更",
+ "buttonCycleVariant": "色変更",
+ "buttonSpeedUp": "速さを上げる",
+ "buttonSlowDown": "速さを下げる",
+ "alt": "(代替)",
"mute": "ミュート",
"controller": "コントローラー",
- "gamepadSupport": "コントローラーサポート"
+ "gamepadSupport": "コントローラーサポート",
+ "showBgmBar": "BGMの名前を表示",
+ "moveTouchControls": "タッチ移動操作",
+ "shopOverlayOpacity": "ショップオーバレイ不透明度",
+ "shopCursorTarget": "ショップカーソル初位置",
+ "rewards": "ご褒美",
+ "reroll": "選択肢変更",
+ "shop": "ショップ",
+ "checkTeam": "手持ちを確認"
}
diff --git a/src/locales/ja/starter-select-ui-handler.json b/src/locales/ja/starter-select-ui-handler.json
index 84eaa8598e9..cab5c500df6 100644
--- a/src/locales/ja/starter-select-ui-handler.json
+++ b/src/locales/ja/starter-select-ui-handler.json
@@ -1,5 +1,5 @@
{
- "confirmStartTeam": "この条件で チャレンジを 始めますか?",
+ "confirmStartTeam": "この手持ちで 始めますか?",
"confirmExit": "終了しますか?",
"invalidParty": "手持ちは チャレンジの 条件で 認められない!",
"gen1": "1世代",
@@ -16,8 +16,8 @@
"passive": "パッシブ:",
"nature": "性格:",
"eggMoves": "タマゴ技",
- "start": "始める",
"addToParty": "手持ちに入れる",
+ "removeFromParty": "手持ちから除く",
"toggleIVs": "個体値を表示",
"manageMoves": "技を並び替える",
"manageNature": "性格を変える",
@@ -36,9 +36,10 @@
"cycleAbility": ": 特性変更",
"cycleNature": ": 性格変更",
"cycleVariant": ": 色変更",
+ "goFilter": ": フィルタ へ ",
"enablePassive": "パッシブ - オン",
"disablePassive": "パッシブ - オフ",
- "locked": "開放されていない",
+ "locked": "非開放",
"disabled": "無効",
"uncaught": "捕まっていない"
-}
\ No newline at end of file
+}
diff --git a/src/locales/ja/trainer-classes.json b/src/locales/ja/trainer-classes.json
index 9e26dfeeb6e..aba294fbbbd 100644
--- a/src/locales/ja/trainer-classes.json
+++ b/src/locales/ja/trainer-classes.json
@@ -1 +1,130 @@
-{}
\ No newline at end of file
+{
+ "ace_trainer": "エリートトレーナー",
+ "ace_trainer_female": "エリートトレーナー",
+ "ace_duo": "エリートコンビ",
+ "artist": "芸術家",
+ "artist_female": "芸術家",
+ "backers": "ファンクラブ",
+ "backpacker": "バックパッカー",
+ "backpacker_female": "バックパッカー",
+ "backpackers": "バックパッカーズ",
+ "baker": "ベーカリー",
+ "battle_girl": "バトルガール",
+ "beauty": "大人のおねえさん",
+ "beginners": "初心者",
+ "biker": "暴走族",
+ "black_belt": "カラテ王",
+ "breeder": "ポケモンブリーダー",
+ "breeder_female": "ポケモンブリーダー",
+ "breeders": "ブリーダーコンビ",
+ "clerk": "ビジネスマン",
+ "clerk_female": "OL",
+ "colleagues": "ビジネスパートナー",
+ "crush_kin": "格闘兄妹",
+ "cyclist": "サイクリング",
+ "cyclist_female": "サイクリング",
+ "cyclists": "サイクリングチーム",
+ "dancer": "ダンサー",
+ "dancer_female": "ダンサー",
+ "depot_agent": "鉄道員",
+ "doctor": "ドクター",
+ "doctor_female": "ドクター",
+ "firebreather": "火吹きやろう",
+ "fisherman": "釣り人",
+ "fisherman_female": "釣り人",
+ "gentleman": "ジェントルマン",
+ "guitarist": "ギタリスト",
+ "guitarist_female": "ギタリスト",
+ "harlequin": "クラウン",
+ "hiker": "山男",
+ "hooligans": "バッドチーム",
+ "hoopster": "バスケ選手",
+ "infielder": "野球選手",
+ "janitor": "清掃員",
+ "lady": "お嬢さま",
+ "lass": "ミニスカート",
+ "linebacker": "フットボーラー",
+ "maid": "メイド",
+ "madame": "マダム",
+ "medical_team": "医療チーム",
+ "musician": "ミュージシャン",
+ "hex_maniac": "オカルトマニア",
+ "nurse": "ナース",
+ "nursery_aide": "保育士",
+ "officer": "お巡りさん",
+ "parasol_lady": "パラソルおねえさん",
+ "pilot": "パイロット",
+ "pokéfan": "大好きクラブ",
+ "pokéfan_female": "大好きクラブ",
+ "pokéfan_family": "大好き夫婦",
+ "preschooler": "園児",
+ "preschooler_female": "園児",
+ "preschoolers": "園児たち",
+ "psychic": "サイキッカー",
+ "psychic_female": "サイキッカー",
+ "psychics": "サイキッ家",
+ "pokémon_ranger": "ポケモンレンジャー",
+ "pokémon_ranger_female": "ポケモンレンジャー",
+ "pokémon_rangers": "レンジャーズ",
+ "ranger": "レンジャー",
+ "restaurant_staff": "レストランスタッフ",
+ "rich": "お金持ち",
+ "rich_female": "お金持ち",
+ "rich_boy": "お坊っちゃま",
+ "rich_couple": "お二人さま",
+ "rich_kid": "ブルジョワ男子",
+ "rich_kid_female": "ブルジョワ女子",
+ "rich_kids": "ブルジョワ子達",
+ "roughneck": "スキンヘッズ",
+ "sailor": "船乗り",
+ "scientist": "研究員",
+ "scientist_female": "研究員",
+ "scientists": "研究チーム",
+ "smasher": "テニスプレイヤー",
+ "snow_worker": "冷凍作業員",
+ "snow_worker_female": "冷凍作業員",
+ "striker": "サッカー選手",
+ "school_kid": "塾帰り",
+ "school_kid_female": "塾帰り",
+ "school_kids": "塾生たち",
+ "swimmer": "海パンやろう",
+ "swimmer_female": "ビキニのおねえさん",
+ "swimmers": "水着カップル",
+ "twins": "双子ちゃん",
+ "veteran": "ベテラントレーナー",
+ "veteran_female": "ベテラントレーナー",
+ "veteran_duo": "ベテランコンビ",
+ "waiter": "ウエーター",
+ "waitress": "ウエートレス",
+ "worker": "作業員",
+ "worker_female": "作業員",
+ "workers": "作業班",
+ "youngster": "短パン小僧",
+ "rocket_grunt": "ロケット団の下っ端",
+ "rocket_grunts": " ロケット団の下っ端",
+ "rocket_grunt_female": "ロケット団の下っ端",
+ "magma_grunt": "マグマ団の下っ端",
+ "magma_grunt_female": "マグマ団の下っ端",
+ "magma_grunts": "マグマ団の下っ端",
+ "aqua_grunt": "アクア団の下っ端",
+ "aqua_grunt_female": "アクア団の下っ端",
+ "aqua_grunts": "アクア団の下っ端",
+ "galactic_grunt": "ギンガ団の下っ端",
+ "galactic_grunt_female": "ギンガ団の下っ端",
+ "galactic_grunts": "ギンガ団の下っ端",
+ "plasma_grunt": "プラスマ団の下っ端",
+ "plasma_grunt_female": "プラズマ団の下っ端",
+ "plasma_grunts": "プラズマ団の下っ端",
+ "flare_grunt": "フレア団の下っ端",
+ "flare_grunt_female": "フレア団の下っ端",
+ "flare_grunts": "フレア団の下っ端",
+ "aether_grunt": "エーテル財団の職員",
+ "aether_grunt_female": "エーテル財団の職員",
+ "aether_grunts": "エーテル財団の職員",
+ "skull_grunt": "スカル団の下っ端",
+ "skull_grunt_female": "スカル団の下っ端",
+ "skull_grunts": "スカル団の下っ端",
+ "macro_grunt": "マクロコスモスのトレーナ",
+ "macro_grunt_female": "マクロコスモスのトレーナ",
+ "macro_grunts": "マクロコスモスのトレーナ"
+}
diff --git a/src/locales/ja/trainer-names.json b/src/locales/ja/trainer-names.json
index 9e26dfeeb6e..70841734b5b 100644
--- a/src/locales/ja/trainer-names.json
+++ b/src/locales/ja/trainer-names.json
@@ -1 +1,164 @@
-{}
\ No newline at end of file
+{
+ "brock": "タケシ",
+ "misty": "カスミ",
+ "lt_surge": "マチス",
+ "erika": "エリカ",
+ "janine": "アンズ",
+ "sabrina": "ナツメ",
+ "blaine": "カツラ",
+ "giovanni": "サカキ",
+ "falkner": "ハヤト",
+ "bugsy": "ツクシ",
+ "whitney": "アカネ",
+ "morty": "マツバ",
+ "chuck": "シジマ",
+ "jasmine": "ミカン",
+ "pryce": "ヤナギ",
+ "clair": "イブキ",
+ "roxanne": "ツツジ",
+ "brawly": "トウキ",
+ "wattson": "テッセン",
+ "flannery": "アスナ",
+ "norman": "センリ",
+ "winona": "ナギ",
+ "tate": "フウ",
+ "liza": "ラン",
+ "juan": "アダン",
+ "roark": "ヒョウタ",
+ "gardenia": "ナタネ",
+ "maylene": "スモモ",
+ "crasher_wake": "マキシ",
+ "fantina": "メリッサ",
+ "byron": "トウガン",
+ "candice": "スズナ",
+ "volkner": "デンジ",
+ "cilan": "デント",
+ "chili": "ポッド",
+ "cress": "コーン",
+ "cheren": "チェレン",
+ "lenora": "アロエ",
+ "roxie": "ホミカ",
+ "burgh": "アーティ",
+ "elesa": "カミツレ",
+ "clay": "ヤーコン",
+ "skyla": "フウロ",
+ "brycen": "ハチク",
+ "drayden": "シャガ",
+ "marlon": "シズイ",
+ "viola": "ビオラ",
+ "grant": "ザクロ",
+ "korrina": "コルニ",
+ "ramos": "フクジ",
+ "clemont": "シトロン",
+ "valerie": "マーシュ",
+ "olympia": "ゴジカ",
+ "wulfric": "ウルップ",
+ "milo": "ヤロー",
+ "nessa": "ルリナ",
+ "kabu": "カブ",
+ "bea": "サイトウ",
+ "allister": "オニオン",
+ "opal": "ポプラ",
+ "bede": "ビート",
+ "gordie": "マクワ",
+ "melony": "メロン",
+ "piers": "ネズ",
+ "marnie": "マリィ",
+ "raihan": "キバナ",
+ "katy": "カエデ",
+ "brassius": "コルサ",
+ "iono": " ナンジャモ",
+ "kofu": "ハイダイ",
+ "larry": "アオキ",
+ "ryme": "ライム",
+ "tulip": "リップ",
+ "grusha": "グルーシャ",
+ "lorelei": "カンナ",
+ "bruno": "シバ",
+ "agatha": "キクコ",
+ "lance": "ワタル",
+ "will": "イツキ",
+ "koga": "キョウ",
+ "karen": "カリン",
+ "sidney": "カゲツ",
+ "phoebe": "フヨウ",
+ "glacia": "プリム",
+ "drake": "ゲンジ",
+ "aaron": "リョウ",
+ "bertha": "キクノ",
+ "flint": "オーバ",
+ "lucian": "ゴヨウ",
+ "shauntal": "シキミ",
+ "marshal": "レンブ",
+ "grimsley": "ギーマ",
+ "caitlin": "カトレア",
+ "malva": "パキラ",
+ "siebold": "ズミ",
+ "wikstrom": "ガンピ",
+ "drasna": "ドラセナ",
+ "hala": "ハラ",
+ "molayne": "マーレイン",
+ "olivia": "ライチ",
+ "acerola": "アセロラ",
+ "kahili": "カヒリ",
+ "rika": "チリ",
+ "poppy": "ポピー",
+ "hassel": "ハッサク",
+ "crispin": "アカマツ",
+ "amarys": "ネリネ",
+ "lacey": "タロ",
+ "drayton": "カキツバタ",
+ "blue": "グリーン",
+ "red": "レッド",
+ "steven": "ダイゴ",
+ "wallace": "ミクリ",
+ "cynthia": "シロナ",
+ "alder": "アデク",
+ "iris": "アイリス",
+ "diantha": "カルネ",
+ "hau": "ハウ",
+ "geeta": "オモダカ",
+ "nemona": "ネモ",
+ "kieran": "スグリ",
+ "leon": "ダンデ",
+ "rival": "フィン",
+ "rival_female": "アイヴィー",
+ "archer": "アポロ",
+ "ariana": "アテナ",
+ "proton": "ランス",
+ "petrel": "ラムダ",
+ "tabitha": "ホムラ",
+ "courtney": "カガリ",
+ "shelly": "イズミ",
+ "matt": "ウシオ",
+ "mars": "マーズ",
+ "jupiter": "ジュピター",
+ "saturn": "サターン",
+ "zinzolin": "ヴィオ",
+ "rood": "ロット",
+ "xerosic": "クセロシキ",
+ "bryony": "バラ",
+ "faba": "ザオボー",
+ "plumeria": "プルメリ",
+ "oleana": "オリーヴ",
+
+ "maxie": "マツブサ",
+ "archie": "アオギリ",
+ "cyrus": "アカギ",
+ "ghetsis": "ゲーチス",
+ "lysandre": "フラダリ",
+ "lusamine": "ルザミーネ",
+ "guzma": "グズマ",
+ "rose": "ローズ",
+
+ "blue_red_double": "グリーンとレッド",
+ "red_blue_double": "レッドとグリーン",
+ "tate_liza_double": "フウとラン",
+ "liza_tate_double": "ランとフウ",
+ "steven_wallace_double": "ダイゴとミクリ",
+ "wallace_steven_double": "ミクリとダイゴ",
+ "alder_iris_double": "アデクとアイリス",
+ "iris_alder_double": "アイリスとアデク",
+ "marnie_piers_double": "マリィとネズ",
+ "piers_marnie_double": "ネズとマリィ"
+}
diff --git a/src/locales/ja/trainer-titles.json b/src/locales/ja/trainer-titles.json
index 9e26dfeeb6e..b3829c701e5 100644
--- a/src/locales/ja/trainer-titles.json
+++ b/src/locales/ja/trainer-titles.json
@@ -1 +1,38 @@
-{}
\ No newline at end of file
+{
+ "elite_four": "四天王",
+ "elite_four_female": "四天王",
+ "gym_leader": "ジムリーダー",
+ "gym_leader_female": "ジムリーダー",
+ "gym_leader_double": "ジムリーダーコンビ",
+ "champion": "チャンピオン",
+ "champion_female": "チャンピオン",
+ "champion_double": "チャンピオンコンビ",
+ "rival": "ライバル",
+ "professor": "ポケモン博士",
+ "frontier_brain": "フロンティアブレーン",
+ "rocket_boss": "ロケット団ボス",
+ "magma_boss": "マグマ団リーダー",
+ "aqua_boss": "アクア団リーダー",
+ "galactic_boss": "ギンガ団ボス",
+ "plasma_boss": "プラズマ団ボス",
+ "flare_boss": "フレア団ボス",
+ "aether_boss": "エーテル代表",
+ "skull_boss": "スカル団ボス",
+ "macro_boss": "マクロコスモス社長",
+
+ "rocket_admin": "ロケット団幹部",
+ "rocket_admin_female": "ロケット団幹部",
+ "magma_admin": "マグマ団幹部",
+ "magma_admin_female": "マグマロケット団幹部",
+ "aqua_admin": "アクア団幹部",
+ "aqua_admin_female": "アクア団幹部",
+ "galactic_commander": "ギンガ団幹部",
+ "galactic_commander_female": "ギンガ団幹部",
+ "plasma_sage": "プラズマ団賢人",
+ "plasma_admin": "プラズマ団賢人",
+ "flare_admin": "フレア団幹部",
+ "flare_admin_female": "フレア団幹部",
+ "aether_admin": "エーテル支部長",
+ "skull_admin": "スカル団幹部",
+ "macro_admin": "マクロコスモス"
+}
diff --git a/src/locales/ko/achv.json b/src/locales/ko/achv.json
index 73753dd9b5a..9364c1c55b6 100644
--- a/src/locales/ko/achv.json
+++ b/src/locales/ko/achv.json
@@ -80,7 +80,7 @@
"100_RIBBONS": {
"name": "마스터 리그 챔피언"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "팀워크",
"description": "한 개 이상의 능력치가 최대 랭크일 때 배턴터치 사용"
},
@@ -225,7 +225,7 @@
"name": "독침붕처럼 쏴라"
},
"MONO_GHOST": {
- "name": "누굴 부를 거야?"
+ "name": "무서운 게 딱 좋아!"
},
"MONO_STEEL": {
"name": "강철 심장"
@@ -260,5 +260,9 @@
"FRESH_START": {
"name": "첫트!",
"description": "새 출발 챌린지 모드 클리어."
+ },
+ "INVERSE_BATTLE": {
+ "name": "상성 전문가(였던 것)",
+ "description": "거꾸로 배틀 챌린지 모드 클리어."
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ko/arena-tag.json b/src/locales/ko/arena-tag.json
index 61586508a94..ce9922ab3bf 100644
--- a/src/locales/ko/arena-tag.json
+++ b/src/locales/ko/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "우리 편의\n순풍이 멈췄다!",
"tailwindOnRemoveEnemy": "상대의\n순풍이 멈췄다!",
"happyHourOnAdd": "모두 행복한 기분에\n휩싸였다!",
- "happyHourOnRemove": "기분이 원래대로 돌아왔다."
+ "happyHourOnRemove": "기분이 원래대로 돌아왔다.",
+ "safeguardOnAdd": "필드 전체가 신비의 베일에 둘러싸였다!",
+ "safeguardOnAddPlayer": "우리 편은 신비의 베일에 둘러싸였다!",
+ "safeguardOnAddEnemy": "상대 편은 신비의 베일에 둘러싸였다!",
+ "safeguardOnRemove": "필드를 감싸던 신비의 베일이 없어졌다!",
+ "safeguardOnRemovePlayer": "우리 편을 감싸던 신비의 베일이 없어졌다!",
+ "safeguardOnRemoveEnemy": "상대 편을 감싸던 신비의 베일이 없어졌다!"
}
\ No newline at end of file
diff --git a/src/locales/ko/challenges.json b/src/locales/ko/challenges.json
index 433b0990e87..7efdfef3570 100644
--- a/src/locales/ko/challenges.json
+++ b/src/locales/ko/challenges.json
@@ -25,5 +25,12 @@
"desc": "포켓로그를 처음 시작했던 때처럼 강화가 전혀 되지 않은 오리지널 스타팅 포켓몬만 고를 수 있습니다.",
"value.0": "해제",
"value.1": "설정"
+ },
+ "inverseBattle": {
+ "name": "거꾸로 배틀",
+ "shortName": "거꾸로",
+ "desc": "타입 상성이 반대로 바뀌고 면역 타입은 약점 타입이 됩니다.\n설정 시 다른 챌린지 업적은 달성할 수 없습니다.",
+ "value.0": "해제",
+ "value.1": "설정"
}
}
\ No newline at end of file
diff --git a/src/locales/ko/config.ts b/src/locales/ko/config.ts
index 392f2f72053..978cdc83002 100644
--- a/src/locales/ko/config.ts
+++ b/src/locales/ko/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const koConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/ko/dialogue-double-battle-male.json b/src/locales/ko/dialogue-double-battle-male.json
deleted file mode 100644
index 134b8ade71e..00000000000
--- a/src/locales/ko/dialogue-double-battle-male.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "그린: 어이 레드! 우리가 누군지 보여주자고!\n$레드: ...\n$그린: 태초마을의 힘을 보여주지!"
- },
- "victory": {
- "1": "그린: 훌륭한 승부였어!\n$레드: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "레드: ...!\n$그린: 이 녀석은 여전히 말이 없구나.\n$그린: 그렇지만 방심해선 안 돼! 그래도 챔피언이라고!"
- },
- "victory": {
- "1": "레드: ...!\n$그린: 다음에는 우리가 이길 테다!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "풍: 에헤헤... 체육관 관장이\n$란: 두 명이나 있어서 놀랐지?\n$풍: 우리는 쌍둥이!\n$란: 굳이 말을 하지 않아도 서로가 무슨 생각을 하고 있는지\n$풍: 자동으로 머릿속에 떠오르니까\n$란: 호흡을 척척 맞출 수가 있지!"
- },
- "victory": {
- "1": "풍: 우, 우리들의\n$란: 팀워크가...!"
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "란: 우후후... 체육관 관장이\n$풍: 두 명이나 있어서 놀랐어?\n$란: 우리는 쌍둥이!\n$풍: 완벽한 우리의 콤비네이션을\n$란: 과연 네가 깨뜨릴 수 있을까?"
- },
- "victory": {
- "1": "란: 우리들이 생각한 만큼\n$풍: 우리가 강하지 않았던 걸까?"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "성호: 윤진! 우리 챔피언의 힘을 보여주자!\n$윤진: 호연의 힘을 보여주마!\n$성호: 간다!"
- },
- "victory": {
- "1": "성호: 훌륭한 승부였어!\n$윤진: 다음엔 우리가 이길 거다!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "성호: 너 혹시 희귀한 포켓몬 가지고 있니?\n$윤진: 성호야... 우리는 포켓몬을 자랑하러 온 게 아니라 승부하러 온 거야.\n$성호: 오... 그렇지... 그럼 간다!"
- },
- "victory": {
- "1": "성호: 이제 승부는 끝났으니 포켓몬을 자랑해 볼까!\n$윤진: 성호야..."
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "노간주: 우리는 하나 지방 최강의 트레이너들이란다!\n$아이리스: 이렇게 강한 트레이너와 싸울 수 있어서 정말 기뻐~!!"
- },
- "victory": {
- "1": "노간주: 장하구나! 실로 견줄 자가 천하에 없도다!\n$아이리스: 다음 번엔 우리가 꼭 이길 거야~!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "아이리스: 어서 와, 도전자! 내가 바로 하나 지방 챔피언이야~!\n$노간주: 아이리스야, 너무 흥분한 것 아니냐?"
- },
- "victory": {
- "1": "아이리스: 후와아아아아... 최선을 다했는데도... 우리가 져버렸네!\n$노간주: 하지만 우리의 패배를 발판 삼아 나아가리라!"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "마리: 오빠, 스파이크마을의 힘을 보여주자!\n$두송: 우리가 어둠을 불러올 것이다!"
- },
- "victory": {
- "1": "마리: 네가 우리의 어둠에 빛을 불러왔구나!\n$두송: 여긴 너무 밝네..."
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "두송: 콘서트 즐길 준비 됐어?\n$마리: 오빠... 얘들은 노래가 아니라 승부를 하러 왔어..."
- },
- "victory": {
- "1": "두송: 훌륭한 콘서트였다!\n$마리: 오빠..."
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/ko/dialogue-double-battle-female.json b/src/locales/ko/dialogue-double-battle.json
similarity index 100%
rename from src/locales/ko/dialogue-double-battle-female.json
rename to src/locales/ko/dialogue-double-battle.json
diff --git a/src/locales/ko/dialogue-female.json b/src/locales/ko/dialogue-female.json
deleted file mode 100644
index ab29bd85b3c..00000000000
--- a/src/locales/ko/dialogue-female.json
+++ /dev/null
@@ -1,2691 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "거기 너! 나와 배틀 어때?",
- "2": "넌 새내기 트레이너구나. 맞지?",
- "3": "거기 너! 처음보는 얼굴인데? 나랑 배틀하자!",
- "4": "방금 배틀에서 져서 새로운 포켓몬을 찾는 중이야.\n잠깐! 넌 약해보이는데? 어서 나와 배틀하자!",
- "5": "우리 만난 적이 있었던가? 잘 기억은 안나지만 어쨌든 만나서 반가워!",
- "6": "좋아! 시작하자!",
- "7": "좋아! 내가 왔다! 내 힘을 보여주지!",
- "8": "하하하… 내 포켓몬이 얼마나 멋진지 보여주겠어!",
- "9": "인사할 시간도 없어. 준비가 되었다면 이리 와!",
- "10": "긴장을 늦추지마. 그렇지 않으면 어린이에게 맞아 울지도 몰라.",
- "11": "난 내 포켓몬들을 소중히 키웠어. 내 포켓몬에게 상처를 입히게 놔두지 않겠어!",
- "12": "여기까지 잘 왔구나! 하지만 지금부턴 쉽지 않을거야.",
- "13": "배틀은 끝나지 않아! 끝없는 배틀의 세계에 온 것을 환영해!"
- },
- "victory": {
- "1": "우와! 넌 강하구나!",
- "2": "하? 난 기회가 없었어.",
- "3": "내가 조금 더 큰 다음엔 널 찾아서 때리겠어!",
- "4": "으.. 더이상 가지고 있는 포켓몬이 없어.",
- "5": "말도 안돼… 안돼! 내가 또 지다니…",
- "6": "안돼! 내가 지다니!",
- "7": "우와! 정말 깜짝 놀랐어! 넌 정말 강하구나!",
- "8": "이럴수가… 내 포켓몬과 난 최강인데… 어떻게…",
- "9": "다음엔 지지 않을거야! 다음에 다시 배틀하자!",
- "10": "쳇! 내가 어린애인게 보이지 않아?! 그렇게 최선을 다하는건 불공평해!",
- "11": "네 포켓몬은 정말 굉장하구나! 나와 교환하자!",
- "12": "내가 잠깐 정신이 나갔었나 봐. 내가 무슨 말을 하고 있었지?",
- "13": "아하! 거기구나! 좋아! 넌 이미 이 세계에 머무를 곳이 있구나!"
- }
- },
- "lass": {
- "encounter": {
- "1": "나랑 배틀하자, 어때?",
- "2": "넌 신입 트레이너구나. 나랑 배틀하자!",
- "3": "너 거기 있었구나? 나랑 배틀할래?",
- "4": "재밌는 포켓몬 배틀하자!",
- "5": "내가 포켓몬을 어떻게 다뤄야하는지 보여줄게!",
- "6": "진정한 배틀은 진지한 자세부터 시작이야! 준비됐어?",
- "7": "젊음이 한순간이듯 배틀에서 네 기회도 단 한번만 주어질거야. 곧 넌 추억속으로 사라질거야.",
- "8": "나에겐 살살해도 돼, 알았지? 그래도 난 진지하게 싸울거야!",
- "9": "학교는 지겨워. 나는 할 일이 없어. 하암~ 난 그저 시간을 때우기 위해 싸울뿐이야."
- },
- "victory": {
- "1": "인상적이었어! 난 아직 배울게 많구나.",
- "2": "내가 이렇게까지 크게 질 줄은 몰랐어…",
- "3": "언젠가 우리가 다시 배틀할 수 있을 날을 기다릴게.",
- "4": "놀라울 정도로 엄청 재미있었어! 넌 날 완전히 지치게 만들어버렸네…",
- "5": "넌 나에게 진짜 교훈을 주었어! 넌 정말 대단해!",
- "6": "세상에, 내가 지다니. 이거 정말 우울하지만… 넌 정말 멋있었어.",
- "7": "난 이런 기억따윈 필요없어. 잊어버리겠어…",
- "8": "거기 너! 살살하라고 했지! 그래도 넌 진지할때 정말 멋지구나!",
- "9": "사실 배틀하는 것이 지루하던 참이야… 뭔가 새로운 것이 없을까?"
- }
- },
- "breeder": {
- "encounter": {
- "1": "순종적인 포켓몬, 이기적인 포켓몬… 포켓몬들은 각기 다른 성격을 가지고 있지.",
- "2": "내 태도가 그렇게 좋진 않아도, 내 포켓몬들은 잘 키웠어.",
- "3": "음, 넌 포켓몬들을 훈육하니? 너무 심하게 하는 것은 좋지 않다고."
- },
- "victory": {
- "1": "각 포켓몬의 성격을 이해하고 육성하는 건 중요해.",
- "2": "사악한 나와는 달리 좋은 포켓몬들도 있지.",
- "3": "과도한 칭찬은 사람과 포켓몬 모두에게 독이 될 수 있어."
- },
- "defeat": {
- "1": "배틀에서 지더라도 포켓몬에게 화를 내면 안돼.",
- "2": "어때? 꽤 괜찮은 포켓몬이지? 난 무언가 기르는 게 꽤 잘 맞더라고.",
- "3": "네가 포켓몬을 얼마나 사랑하는지와 관계없이, 그들이 잘못을 저지르면 바로잡아야 해."
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "포켓몬은 절대 널 배신하지 않아. 네가 주는 사랑을 고스란히 되돌려 준다구.",
- "2": "좋은 포켓몬을 키우는 팁을 알려줄까?",
- "3": "난 아주 특별한 방법으로 아주 특별한 포켓몬들을 키웠지!"
- },
- "victory": {
- "1": "이런… 이렇게 될 리가 없는데. 내가 블렌딩을 잘못 썼나?",
- "2": "내 포켓몬에게 이런 일이… 넌 네 포켓몬에게 뭘 먹이는 거야?",
- "3": "내가 지는 건 그저 내가 시간을 때우고 있었다는 걸 알려주는 거지. 내 자존심엔 전혀 상처가 되지 않는다구."
- },
- "defeat": {
- "1": "이건 내 포켓몬들이 내 사랑을 받아들였다는 걸 입증하지.",
- "2": "좋은 포켓몬을 키우는 진짜 비결은 좋은 포켓몬을 잡는 거야.",
- "3": "포켓몬의 강함과 약함은 네가 어떻게 키우느냐에 따라 결정되지."
- }
- },
- "fisherman": {
- "encounter": {
- "1": "앗! 너 때문에 한 마리 놓쳤잖아! 어떻게 할 거야?",
- "2": "저리 가! 네가 포켓몬들을 놀래키고 있잖아!",
- "3": "네가 승리를 낚을 수 있을지 한번 보자고!"
- },
- "victory": {
- "1": "그냥 잊어버려.",
- "2": "다음 번엔 내가 승리의 나팔을 울리고 있을거다!",
- "3": "이번엔 내가 물살을 과소평가했나보군."
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "월척이다!",
- "2": "낚시대는 던져졌고, 이젠 성공을 끌어올리는 일만 남았다!",
- "3": "파도를 일으킬 준비는 끝났어!"
- },
- "victory": {
- "1": "더 튼튼한 바늘을 가지고 돌아올테다.",
- "2": "다음번엔 꼭 성공을 낚을 거야!",
- "3": "다시 돌아올 날을 기다리며 바늘을 다듬고 있을게!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "뛰어들 시간이다!",
- "2": "승리의 파도 속으로!",
- "3": "첨벙댈 준비는 끝났어!"
- },
- "victory": {
- "1": "패배에 젖어버렸어…",
- "2": "패배의 파도였군.",
- "3": "해변으로 돌아갈 시간이군."
- }
- },
- "backpacker": {
- "encounter": {
- "1": "게임 시작이야! 짐 단단히 싸놓으라구!",
- "2": "네가 속도를 유지할 수 있을지 보자!",
- "3": "각오 단단히 하라고!",
- "4": "20년 동안 나 자신을 찾기 위해 헤매왔어… 근데 내가 어디 있지?"
- },
- "victory": {
- "1": "이번엔 걸려 넘어져 버렸네!",
- "2": "내가 속도를 잃어버렸잖아!",
- "3": "막다른 길이야!",
- "4": "잠깐! 그래 거기, 혹시 내가 누군지 아나?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "너는 꽤 자신만만해 보이는구나.",
- "2": "너의 포켓몬들… 나에게 보여줘…",
- "3": "내가 엘리트 트레이너라서, 사람들은 내가 강하다고 생각해.",
- "4": "엘리트 트레이너가 되려면 무엇이 필요한지 알고 있니?"
- },
- "victory": {
- "1": "그러네… 넌 좋은 포켓몬을 가졌구나…",
- "2": "뭐? 말도 안 돼, 난 배틀 천재라구!",
- "3": "그래도 역시, 네가 주인공이구나!",
- "4": "좋아! 좋아! 너도 엘리트 트레이너가 될 수 있겠어!"
- },
- "defeat": {
- "1": "난 내 몸과 마음을 포켓몬 배틀에 바치고 있어!",
- "2": "모두 예상된 일이었어… 이건 놀랄 일이 아니야…",
- "3": "난 내가 강하게 압박하면 무너질 연약한 사람이라고 생각했어.",
- "4": "난 강하고, 지지 않아. 그저 멋지게 이길 수 없었기 때문이야."
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "우아함과 침착함으로 승부하겠습니다!"
- },
- "victory": {
- "1": "그래도 제 우아함은 무너지지 않아요!"
- }
- },
- "twins": {
- "encounter": {
- "1": "각오해, 우리가 한 팀이 되면 두 배로 강해진다구!",
- "2": "마음은 두 개지만 우리는 하나 – 네가 쌍둥이의 파워를 따라잡을 수 있는지 보겠어!",
- "3": "두 배로 각오하는 게 좋을 거야. 우리가 곧 화나게 할 거거든!"
- },
- "victory": {
- "1": "비록 우리는 졌지만, 우리의 관계는 깨지지 않아!",
- "2": "그래도 우리의 영혼은 오랫동안 흐려지지 않을 거야.",
- "3": "더 강력한 듀오로 강해져서 돌아오겠어!"
- },
- "defeat": {
- "1": "우리 쌍둥이의 파워는 최고야!",
- "2": "마음은 두 개지만 승리는 하나!",
- "3": "미소도 두 배, 승리의 댄스도 두 배!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "내가 만든 먼지나 마실 준비하시지!",
- "2": "준비하라구! 난 널 먼지 속에 놓고 올 거니까!",
- "3": "전력을 다해야 할 거야, 네가 날 따라올 수 있는지 지켜보겠어!"
- },
- "victory": {
- "1": "바퀴가 움직이지 않더라도, 나의 페달은 그렇지 않아.",
- "2": "이런, 따라잡혔어!",
- "3": "승리로 가는 길에는 아직 만나지 못한 우여곡절이 많이 있구나."
- }
- },
- "black_belt": {
- "encounter": {
- "1": "네 용기가 대단하구나! 난 최고의 발차기 실력을 갖추고 있다구!",
- "2": "오, 알겠어. 산산조각이 나고 싶구나? 아니면 샌드백이 되고 싶은 거야?"
- },
- "victory": {
- "1": "이런, 포켓몬이 배틀을 하는 동안 내 발차기는 전혀 도움이 되지 않았어.",
- "2": "음… 어차피 내가 질거라면, 완전 엉망진창이 되길 바랬는데…"
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "감동을 주려고 노력할 필요는 없어. 네가 질 수도 있으니까."
- },
- "victory": {
- "1": "작별인사는 어렵지만, 우리에겐 시간이 얼마 안 남았네…"
- }
- },
- "hiker": {
- "encounter": {
- "1": "중년으로 접어들면서 등산해왔던 산처럼 진중해졌습니다!",
- "2": "살아있는 산같은… 큰 체격을 부모님이 물려주셨죠…"
- },
- "victory": {
- "1": "적어도 BMI에 대해서는 질 수 없습니다!",
- "2": "부족해… 절대로 충분하지 않아. 저의 콜레스테롤이 부족합니다…"
- }
- },
- "ranger": {
- "encounter": {
- "1": "자연에 둘러싸여 있으면, 다른 건 중요하지 않게 느껴져.",
- "2": "인생에서 자연을 빼고 살면, 가끔 갑자기 마음이 불안해지지."
- },
- "victory": {
- "1": "광활한 자연 앞에서는 내가 이기든 지든 상관없어…",
- "2": "도시 생활의 답답한 느낌에 비하면 이런 것은 아주 사소한 일지."
- },
- "defeat": {
- "1": "내가 이겼네. 그러나 승리는 광대한 자연에 비하면 아무것도 아니야…",
- "2": "내 마음속 불안함과 비교하면, 당신 기분은 그렇게 나쁘지 않을텐데…"
- }
- },
- "scientist": {
- "encounter": {
- "1": "제 연구는 이 세상을 평화와 기쁨으로 이끌 겁니다."
- },
- "victory": {
- "1": "전 천재니까… 당신 같은 사람에게 질 수 없는데…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "…헤헷. 계산과 분석에는 자신 있어.",
- "2": "언젠가 체육관 관장이 되고 싶어서, 최대한 많은 경험을 쌓고 있어."
- },
- "victory": {
- "1": "으아아… 이번에는 아마 계산과 분석이 빗나간 것 같아…",
- "2": "내가 보기엔, 어렵고 힘든 경험도 나름의 의미가 있는 것 같아."
- }
- },
- "artist": {
- "encounter": {
- "1": "예전엔 인기가 많았지만, 지금은 모두 사라졌다네."
- },
- "victory": {
- "1": "시대가 변하면, 가치관도 변하지. 난 그걸 너무 늦게 깨달았어."
- }
- },
- "guitarist": {
- "encounter": {
- "1": "패배의 리듬을 느낄 준비는 됐겠지? 내가 승리할 거니까!"
- },
- "victory": {
- "1": "지금은 조용하지만, 회복의 멜로디를 연주할 거야."
- }
- },
- "worker": {
- "encounter": {
- "1": "사람들이 저를 오해하는 게 신경 쓰여요. 전 생각보다 훨씬 깨끗하답니다."
- },
- "victory": {
- "1": "피부가 타는 게 싫어서, 일하는 동안엔 그늘에 머물고 싶어요."
- }
- },
- "worker_female": {
- "encounter": {
- "1": "사람들이 나를 오해하는 게 신경 쓰여.\n$나는 생각보다 훨씬 깨끗한데."
- },
- "victory": {
- "1": "피부가 타는 게 싫어서, 일하는 동안엔 그늘에 머물고 싶어."
- },
- "defeat": {
- "1": "생각처럼 몸이 잘 안따라주네."
- }
- },
- "worker_double": {
- "encounter": {
- "1": "너를 무너뜨릴 수 있다는 것을 보여줄게. 우리는 실전 경험이 있거든!"
- },
- "victory": {
- "1": "이상하네… 어떻게 이럴 수 있지… 힘으로 압도할 수 없다니."
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "평소에는 클래식 음악만 들었는데, 지면 뉴에이지도 좀 들어볼까!",
- "2": "눈물을 흘릴 때마다 더 강해지는 것 같아."
- },
- "victory": {
- "1": "지금이 물병자리 시대의 시작일까?",
- "2": "이제 나는 더 강해지겠지. 모든 원한과 함께 성장하겠어."
- },
- "defeat": {
- "1": "뉴에이지란 단순히 20세기 클래식 작곡가들을 말하는 거, 맞지?",
- "2": "슬픔이나 좌절에 얽매이지 마. 넌 그 원한을 원동력으로 사용할 수 있어."
- }
- },
- "psychic": {
- "encounter": {
- "1": "안녕! 집중해!"
- },
- "victory": {
- "1": "에에에에엣!"
- }
- },
- "officer": {
- "encounter": {
- "1": "마음의 준비를 하시죠, 정의가 곧 실행될 거니까요!",
- "2": "법을 지키고 정의를 위해 봉사할 준비가 되었습니다!"
- },
- "victory": {
- "1": "정의의 무게가 그 어느 때보다 무겁게 느껴집니다…",
- "2": "패배의 그림자가 관할 경찰서에 남았습니다."
- }
- },
- "beauty": {
- "encounter": {
- "1": "나의 마지막 배틀… 이 승부를 그렇게 봐주셨으면 좋겠어요…"
- },
- "victory": {
- "1": "즐거웠어요… 언젠가 또 다른 마지막 승부를 하죠…"
- }
- },
- "baker": {
- "encounter": {
- "1": "패배의 맛을 볼 준비는 됐겠지!"
- },
- "victory": {
- "1": "실력이든 빵이든, 굽고 나면 단단해지는 법이라네."
- }
- },
- "biker": {
- "encounter": {
- "1": "힘차게 먼지 속으로 출발할 시간입니다!"
- },
- "victory": {
- "1": "다음 경주를 위해 준비해야겠습니다."
- }
- },
- "firebreather": {
- "encounter": {
- "1": "내 불꽃이 너를 삼킬 테니까!",
- "2": "내 영혼은 불타고 있다. 얼마나 뜨겁게 타는지 보여주지!",
- "3": "이리 올라와서 보도록!"
- },
- "victory": {
- "1": "하얗게 불태웠다………",
- "2": "큭! 제법 뜨겁군!",
- "3": "으윽! 코끝에 화상을 입었다!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "친구여, 진다면 널빤지 행이야!",
- "2": "덤벼! 내 선원으로서 자존심이 위태롭군!",
- "3": "여어 거기! 뱃멀미 하나?"
- },
- "victory": {
- "1": "크윽! 꼬맹이한테 지다니!",
- "2": "네 영혼이 나를 침몰시켰어!",
- "3": "내가 뱃멀미가 나는 것 같군…"
- }
- },
- "archer": {
- "encounter": {
- "1": "더 나아가기 전에 우리 로켓단과 맞설 만한지 한 번 봅시다!",
- "2": "당신의 실력이 예사롭지 않다는 소식을 들었습니다. 정말인지 한 번 보지요.",
- "3": "…저는 로켓단의 간부 아폴로. 우리 조직의 적에게는 봐 주지 않습니다!"
- },
- "victory": {
- "1": "…이런 실수를 하다니!",
- "2": "역시 지금의 저는 무리였군요…",
- "3": "비, 비주기님, 용서해주십시오…제가 일개 트레이너한테 당하다니…"
- }
- },
- "ariana": {
- "encounter": {
- "1": "거기까지다~!! 너 같은 놈을 언제까지고 설치게 두었다가는 \n$로켓단의 프라이드는 상처 입고 상처 입어서 상처투성이가 돼 버린다고-!",
- "2": "내가 하는 일이 옳은지 그른지는 상관 없어…\n$그저 비주기님을 믿고 따르는 것 뿐이니까-!",
- "3": "네 여정은 여기서 끝이야. 내가 널 이길 테니까-!"
- },
- "victory": {
- "1": "어머, 강하군. 안타깝네.\n$네가 로켓단에 있었다면 간부가 될 수 있었을 텐데.",
- "2": "사…산산조각났네…",
- "3": "으이이이익! 온 힘을 다해서 싸웠는데…이래도 이길 수 없다니!"
- }
- },
- "proton": {
- "encounter": {
- "1": "뭐죠? 우리 일에 끼어든다면 자비를 바라지 마십시오!",
- "2": "뭐죠? 나는 로켓단에서 제일 냉혹하다고 불리는 남자…\n$우리 일을 방해하도록 그냥 놔두지 않겠습니다!",
- "3": "나는 로켓단의 간부 랜스. 당신의 참견도 여기까지입니다!"
- },
- "victory": {
- "1": "요새가 무너져내렸네요…",
- "2": "나한테 이긴 건 결국 로켓단의 분노를 강하게 했을 뿐이예요…",
- "3": "나는 졌지만, 결코 이 일을 잊지 않을 겁니다!"
- }
- },
- "petrel": {
- "encounter": {
- "1": "후후훗, 잘 왔구나. 오잉? 내가 누군지 알아? 비주기야.\n$비주기님이라고, 우-하하! …엥? 전혀 안 닮았다고?\n$비주기님으로는 안 보인다고? 제길- 열심히 연습했는데!",
- "2": "나는 로켓단의 간부 람다. 우리 계획을 방해하는 건 용납할 수 없다!",
- "3": "이 로켓단 간부 람다가 네놈 불청객을 처리해 주지!"
- },
- "victory": {
- "1": "조…좋아. 비주기님이 어디 계신지 알려주지.",
- "2": "크으으… 이 내가 당해낼 수 없다니… 비주기님, 용서해주십시오…",
- "3": "안돼, 이런다고 나한테 어쩔 수는 없어. 다른 사람들에게 알려야겠어…"
- }
- },
- "tabitha": {
- "encounter": {
- "1": "우효효효! 그래 당신 여기까지 왔구나! 그치만 늦었어요!",
- "2": "우효효… 벌써 여기까지 왔네요? 우리가 당신을 과소평가했어요. 하지만 이제 시작입니다! \n$이 호걸님은 이제까지 본 조무래기들과는 차원이 다르답니다! 우물쭈물 시간을 끌지 않아요.\n$확실하게 보내주마! 우효효효효효효!!",
- "3": "여기서 어른의 무서움을 제대로 알려주지! 받아랏-!"
- },
- "victory": {
- "1": "우효효! 이 호걸은 이겼을지 몰라도 마적님한테는 안 될 겁니다!\n$차라리 여기서 졌다면 무자비한 채찍질은 피했을텐데 말이죠!",
- "2": "우효~! 이야 이건 예상 밖의 전개인데!?",
- "3": "우효! 어떻게?! 이 호걸님이 이런 일개 트레이너에게…"
- }
- },
- "courtney": {
- "encounter": {
- "1": "…그 …네가 가진 …우리…마그마단이 원하는 것",
- "2": "…………그럼 …………삭제하겠습니다",
- "3": "……애널라이즈 ……하고 싶어 ……아하하하♪"
- },
- "victory": {
- "1": "……하아하아… ……으 …하아하아…",
- "2": "………예상대로 ………예상외 ………너 …………타깃 록 ………했으니까\n$……엑스페리먼트 ……할 테니까 ………너를………계속………아핫…♪",
- "3": "……예상외 ………… ……역시 ……너…재미있어…! ………아하하…♪"
- }
- },
- "shelly": {
- "encounter": {
- "1": "엥? 우리 아쿠아단의 일에 끼어들겠다고?\n$…좋아! 기본적인 예의도 모르는 애송이한테는 제대로 그 버릇을 고쳐줘야지…\n$겁먹고 도망쳐도 용서 따위 없을 줄 알아! 우하하하!",
- "2": "아앙? 뭐야? 이 건방진 꼬맹이는…",
- "3": "침착해. 조급해 하지 말라고… 금방 박살내 줄 테니까."
- },
- "victory": {
- "1": "아아아아앙!? 예상치 못하게 방해받았잖아! 어쩔 수 없네.\n$여기선 물러나야겠네. 그렇지만 네가 아쿠아단을 만나는 게 이게 마지막은 아닐 거야.\n$우리는 다른 계획도 있거든! 잊지 마!",
- "2": "크윽…!? 너무 봐줬나…!",
- "3": "…으윽 …싸우면서 더욱 실력이 좋아졌다고…!?\n$장래가 무서워지는 애송이네… …나와 내 포켓몬들은 더 이상 싸울 힘이 남아 있지 않아.\n$…가 …가서 아강님한테 아주 혼쭐이나 나 버려."
- }
- },
- "matt": {
- "encounter": {
- "1": "…그래서 말이지, 리더님이 시간이 나실 때까진 내가 상대해 주마!",
- "2": "후우하앗!! 맥시멈!! 끓어어!! 오르기 시작했다아아앗!!!!! 그래! 그래! 그래애앳!!! 힘이 다할 때까지 해보자아아!!!",
- "3": "UPAAAAA!!! 짓뭉개주마아아아아!!"
- },
- "victory": {
- "1": "흐~하하하핫!!! 졌지만 즐거운 승부였다!",
- "2": "확 확 느껴지는데! 네놈들의 강함이 말이야!\n$제대로 붙었다고 하기엔 조금 모자라지만 이제 타임오버 같네…",
- "3": "오우오웃! 흥분되는 패배로다!"
- }
- },
- "mars": {
- "encounter": {
- "1": "난 갤럭시단 간부인 마스! 강하고 아름답지!",
- "2": "갤럭시단의 미래에 대한 비전은 흔들림 없지. 방해한다면 무자비하게 짓밟아 주마!",
- "3": "두렵지 않아? 넌 그래야만 할 걸!"
- },
- "victory": {
- "1": "갤럭시단의 간부로서… 이런 일은 있을 수 없어!!",
- "2": "넌 능력 있구나. 그건 인정하지.",
- "3": "아-이런 이런! 졌잖아!"
- }
- },
- "jupiter": {
- "encounter": {
- "1": "무슨 볼일이라도? 좋아! 갤럭시단 간부인 나 주피터가 상대해주지.",
- "2": "발버둥쳐 봐야 소용 없어. 갤럭시단이 승리할 거니까!",
- "3": "너 떨고 있네… 무서운 거지?"
- },
- "victory": {
- "1": "일개 트레이너에게 지다니 방심이란 무섭구나.",
- "2": "다음에는 내가 울려 주고 말겠어!",
- "3": "흥! 강하네. 하지만 보스는 당할 수 없어"
- }
- },
- "saturn": {
- "encounter": {
- "1": "나는 갤럭시단의 간부 새턴. 모든 것은 모두를 위해 그리고 갤럭시단을 위해!",
- "2": "갤럭시단을 방해한다면 일말의 가능성도 모두 제거한다!",
- "3": "여기까지 왔으니 갤럭시단 나름의 접대를 해 주지."
- },
- "victory": {
- "1": "이럴 수가… 너한테 졌다고?!",
- "2": "…역시 강해! 갤럭시단에 맞설 만하군.",
- "3": "강하다! 하지만 불쌍하군."
- }
- },
- "zinzolin": {
- "encounter": {
- "1": "너는 플라스마단에게 있어 불안요소가 될 것이다. 여기서 제거하겠다!",
- "2": "이런 이런… 내가 이런 곳에서 싸워야만 하다니!",
- "3": "여기까지 오다니 대단한 트레이너군. 그러나 여기가 끝이다."
- },
- "victory": {
- "1": "게치스님… 제가 실패했습니다…",
- "2": "그건 그렇고 힘들구먼. 나는 떨고 있다. 괴롭지만 살아 있다. 그것이야말로 살아 있다는 실감!",
- "3": "흐음. 의외로 똑똑한 트레이너군. 하지만 생각만큼은 아니야."
- }
- },
- "rood": {
- "encounter": {
- "1": "너는 플라스마단에 위협이 되는구나. 너라는 트레이너가 어떤 인물인지 승부로 알아봐야겠다.",
- "2": "오호! 싸늘하구먼… 이런 곳에서 싸울 줄이야!",
- "3": "너는 여기까지 온 것으로 보니 뛰어난 트레이너구나. 그렇다만 이젠 끝이다."
- },
- "victory": {
- "1": "게치스님… 임무를 실패했습니다…",
- "2": "나는 떨고 있다. 나는 괴롭지만 이겨냈다.",
- "3": "음… 너는 재능이 있는 트레이너구나. 하지만 충분하지는 않다."
- }
- },
- "xerosic": {
- "encounter": {
- "1": "오오- 네 소문은 많이 들었다. 자, 이리 와 보거라!",
- "2": "너 강하구나. 에너지를 얼마나 갖고 있지?",
- "3": "기다리고 있었어! 너를 조사하겠다. 자 시작한다!"
- },
- "victory": {
- "1": "강하구나, 너는. 응, 정말 강해, 너는.",
- "2": "뭣이라! 넌 굉장하군! 너의 포켓몬도 대단하군!",
- "3": "굉장하구나 너! 아주 굉장해! 나는 너를 인정하겠다!"
- }
- },
- "bryony": {
- "encounter": {
- "1": "나는 바라. 당신과 싸울 수 있어 기쁘군요. 한 번 보여주시죠.",
- "2": "인상적이군요… 보기보다 강해요. 에너지가 어디까지 뻗어나가는지 봅시다.",
- "3": "도착할 줄 알았습니다. 시작할까요?"
- },
- "victory": {
- "1": "어라? 이길 확률은 어디까지나 확률. 절대적이진 않네.",
- "2": "확률을 무시하는 트레이너, 네 파워의 원천은 뭐지?",
- "3": "놀랍군! 칭찬할 만 해."
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "트러블에 대비하도록!",
- "2": "우리는 위업을 이루는 중이라고! 저리 비켜, 꼬마 녀석!",
- "3": "포켓몬을 넘기지 않겠다면, 로켓단이 징벌하겠다!",
- "4": "로켓단의 진정한 공포를 보여주마!",
- "5": "헤이, 키드! 미는 로켓단의 멤버라구요!"
- },
- "victory": {
- "1": "로켓단은 다시 떠오를 거니까!",
- "2": "이런! 엘리베이터 키를 떨어뜨렸어!",
- "3": "실패했군!",
- "4": "내 동료들이 가만히 있지 않을 거다!",
- "5": "유 쎄이 왓? 로켓단이 바이바이? 유한테 브레이킹?"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": " 마그마단을 방해한다면, 자비는 없닷!",
- "2": "계획을 방해하지 않는 게 좋을 거다! 우리는 세상을 더 나은 곳으로 만들고 있거든!",
- "3": "방해꾼 녀석! 마그단은 너 같은 꼬마들을 상대할 시간이 없어!",
- "4": "마시멜로를 갖고 있었으면 좋겠네. 왜냐하면… 곧 뜨거워질 테니까!",
- "5": "화산의 힘을 사용할 거야! 그건 정말로… 폭발적일 테니까! 알아들었지? 헤헷!"
- },
- "victory": {
- "1": "하? 내가 졌어?!",
- "2": "내가 지다니! 이것 때문에 점심도 거르고 왔는데.",
- "3": "말도 안돼! 넌 아직 어린애잖아!",
- "4": "으윽… 당장 은신처로 숨을 걸 그랬나…",
- "5": "네가 이겼어… 이것 때문에 보스가, 내 월급 깎으려나?"
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "아쿠아단을 넘본 사람에게는 자비는 없다, 꼬마도 마찬가지야!",
- "2": "쯧… 아쿠아단에 참견하다니 오지랖이 넓군!",
- "3": "흠뻑 물을 뒤집어쓰게 될 거다! 내 물 포켓몬의 공격 뿐만이 아니야!",
- "4": "우리, 아쿠아단은, 모두를 위해 존재한다!",
- "5": "내가 떠밀… 아니, 파도에 떠내려갈 준비나 하라고! 내 포켓몬이 그렇게 만들 테니까 "
- },
- "victory": {
- "1": "말도 안 돼!",
- "2": "크윽, 참견쟁이 꼬마에게 당하다니!",
- "3": "내가 졌다고?! 헤엄쳐서 은신처로 돌아가야겠군…",
- "4": "이런, 완전 망했군… 보스가 화를 내실텐데…",
- "5": "네가 이겼어… 이것 때문에 보스가, 나를 판자 위로 보내는 거 아냐?"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "갤럭시단을 방해하지 마!",
- "2": "기술의 힘과 우리가 꿈꾸는 미래를 목격하라!",
- "3": "갤럭시단으로서, 우리를 방해하는 자는 누구든 제거하겠다!",
- "4": "질 준비나 하라고!",
- "5": "우주에서 싸울 준비는 됐겠지!"
- },
- "victory": {
- "1": "사격 중지…… ",
- "2": "이런 좌절이라도, 우리의 큰 계획 앞엔 아무 의미도 못 돼.",
- "3": "우리의 계획은 이번 패배보다 크거든.",
- "4": "어떻게 한 거지?!",
- "5": "메모해야겠군. 최대한 포켓몬 배틀을 ASAP으로 연습할 것."
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "다른 생각을 가진사람들은 용납하지 않겠다!",
- "2": "내가 이기면, 네 포켓몬들을 놓아주도록 해!",
- "3": "플라즈마단을 방해한다면, 내가 처리해주지!",
- "4": "플라즈마단은 너 같은 이기적인 인간에게서 포켓몬을 해방할 것이다!",
- "5": "우리 스타일링은 정말 대단하지… 배틀 실력은 어떻냐고? 곧 알게 될거야."
- },
- "victory": {
- "1": "플라-스마-!",
- "2": "내가 지다니…",
- "3": "…포켓몬이 너무 약해, 더 좋은 포켓몬을 훔치러 가야겠군!",
- "4": "훌륭한 계획은 항상 방해를 받는다니깐.",
- "5": "이건 나빠… 나빠나빠나빠나빠나빠! 플라스마단에 나빠! 줄여서, 플라나빠!"
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "네 포켓몬, 플레어단의 우아함에 상대가 되지 않는다고.",
- "2": "선글라스를 가져왔길 바랄게. 곧 밝게 빛날 테니까!",
- "3": "플레어단이 세상의 불완전함을 정화할 거야!",
- "4": "플레어단의 광채를 마주칠 준비는 됐겠지!",
- "5": "패션이 우리한텐 가장 중요하다고!"
- },
- "victory": {
- "1": "미래가 밝아 보이질 않네.",
- "2": "생각했던 것보다 전투에는 많은 요소가 있는 것 같군. 다시 계획을 짜야겠어.",
- "3": "아앗?! 내가 졌어?!",
- "4": "패배 속에서도, 플레어단의 우아함은 빛나고 있다고.",
- "5": "네가 이긴 것 같네. 그렇지만 졌어도, 난 우아하게 퇴장할 거니까!"
- }
- },
- "aether_grunt": {
- "encounter": {
- "1": "죽을 각오로 퇴치하겠습니다!",
- "2": "소중한 연구라고! 애라도 가만두지 않겠어!",
- "3": "어떤 트레이너든 물리치라고 들었다고!",
- "4": "에테르파라다이스의 파워를 보여드리겠습니다!",
- "5": "에테르파라다이스 중심의 어둠을 알아내다니. 이제 사라져 주셔야겠습니다!"
- },
- "victory": {
- "1": "흥! 실력이 대단하시군요.",
- "2": "이게 뭐하는 상황이지? 무슨 결과냐고!",
- "3": "이런! 넌 너무 강해서 물리칠 방법도 없다고!",
- "4": "으음… 제가 진 것처럼 보이네요.",
- "5": "이 느낌을 한마디로 하면. 게에이~힝!!"
- }
- },
- "faba": {
- "encounter": {
- "1": "나, 에테르재단의 자우보! 꼬맹이 녀석에게 현실을 보여주겠어요!",
- "2": "에테르파라다이스 마지막 보루라고 불리는, 이 자우보에게 애를 상대하라고요?",
- "3": "에테르재단의 지부장이라면 세계에 단 한 명… 이 자우보뿐입니다."
- },
- "victory": {
- "1": "게에이~힝!!",
- "2": "뭐 뭐뭐뭐 뭐가 어떻게 된 거죠? 내가 애를 상대로…",
- "3": "이래서 애는… 좋아할 수가 없어요."
- }
- },
- "skull_grunt": {
- "encounter": {
- "1": "나쁜 짓 안해-그냥 사는 게 힘들 뿐스컬!",
- "2": "껌 하나 드실? 이게 우리가 인사하는 방식YO! 만나서 반갑스컬!",
- "3": "우린 그냥 다른 사람의 포켓몬에 관심이 많을 뿐임다!",
- "4": "어이 어이! 잘난 체하는 녀석한테 무시당하고 있잖스컬!!",
- "5": "우리는 리프리젠트 땡땡이 스컬-! 집세는 못 내겠지만-! 정말 즐거웠지만, 청춘을 날려YO!"
- },
- "victory": {
- "1": "엥? 벌써 끝났슴까?",
- "2": "미는 엑시트! 유는 피쓰풀!",
- "3": "꼬마 녀석의 이상한 포켓몬엔 관심 없어!",
- "4": "뭐야-?! 너무 강해서 뼈도 못 추리겠어!",
- "5": "우리가 포켓몬보다 아래야!? 소중히 대해주면 안 돼? 으응!?"
- }
- },
- "plumeria": {
- "encounter": {
- "1": "…아무것도 느껴지지 않는 평~범한 애로 보이는데!",
- "2": "워낙 애들 상대로 우물쭈물 하길래 오래 걸릴 줄 알았지…",
- "3": "누구라도 스컬단 또 방해하면, 정말로 혼내줄 테니까!"
- },
- "victory": {
- "1": "흥! 대단하군.",
- "2": "흐음, 너 참 대단하군. 애들을 상대로 질질 끈 이유가 이해될 정도로 강해.",
- "3": "흠. 이 손실은 그냥 안고 가야겠어."
- }
- },
- "macro_grunt": {
- "encounter": {
- "1": "당신은 여기서 끝날 것 같네요!",
- "2": "당신은 트레이너 맞죠? 하지만 우리를 방해하는 건 용납 못 합니다!",
- "3": "매크로코스모스 생명입니다! 가입하신 실비보험은 있으신가요?"
- },
- "victory": {
- "1": "순순히 물러나는 것 말고는 선택지가 없군요.",
- "2": "용돈을 뺏기다니… 패배는 적자로 이어지는구나…",
- "3": "매크로코스모스 생명에 관한 일이라면 누구에게도 지지 않을 텐데…"
- }
- },
- "oleana": {
- "encounter": {
- "1": "로즈님을 방해하는 것은 절대로 용서할 수 없으니까요!",
- "2": "저의 지시를 따르는 특별한 스태프들을 아무렇지도 않게 쓰러뜨리다니. …더 기대되는 것도 없네요.",
- "3": "로즈님을 위해서라면! 질 수 없습니다!"
- },
- "victory": {
- "1": "아아… 이기지 못하다니… 올리브… 넌 정말 구제 불능이구나.",
- "2": "하아아…! 이런 실수를 하다니… 승리를 거듭한 트레이너의 실력을 너무 얕잡아봤던 모양이네요.",
- "3": "아아… 이 올리브님 조금 지쳤어…"
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "그래서! 여기까지 오다니, 감탄이 절로 나오는군!"
- },
- "victory": {
- "1": "하! 이럴 순 없어!"
- },
- "defeat": {
- "1": "자신의 힘을 측정하지 못하는 걸 보아하니, 아직 별볼일 없는 꼬맹이로군. 내 말을 명심하도록. "
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "옛 친구들이 나를 필요로 하고 있다…… 그런데도 방해하겠다는 건가?"
- },
- "victory": {
- "1": "어떻게 이런 일이…?\n로켓단의 소중한 꿈이 환상에 불과해졌군…… "
- },
- "defeat": {
- "1": "로켓단은 다시 태어난다, 그리고 세상을 지배할 것이다!"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "내 손으로 널 파묻어주지. 영광으로 알도록!"
- },
- "victory": {
- "1": "윽! 꽤… 제법이군…\n내가 뒤쳐졌지만, 겨우 한 끝이다…"
- },
- "defeat": {
- "1": "마그마단이 앞선다!"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "나와 내 목표 사이에 남은 마지막 장애물이로군.\n최후의 공격에 대비하도록! 후하하하!"
- },
- "victory": {
- "1": "이런… 이럴 수는… 없어… "
- },
- "defeat": {
- "1": "이제부터… 인류의 이상을 위해 대지를 더 늘려가겠다."
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "내가 아쿠아단의 리더다, 유감스럽게도 넌 이게 끝이겠군."
- },
- "victory": {
- "1": "다시 어딘가에서 만나도록하지. 그 얼굴 기억해둘테니까."
- },
- "defeat": {
- "1": "좋군! 이제 아쿠아단을 막아설 것은 없다!"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "이 날이 오는 것을 너무 오래 기다렸군.\n이것이 우리의 진정한 힘이다!"
- },
- "victory": {
- "1": "내가 생각했던 것들이…… "
- },
- "defeat": {
- "1": "이 세상을 원래의 순수한 상태로 되돌리겠다, 그 모든 것을!!"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "넌 공허한 감정에 이끌려 이곳에 오게된 것이다.\n마음에 귀를 기울인 것을 후회하게 해주지!"
- },
- "victory": {
- "1": "흥미롭군. 게다가 꽤 궁금해졌어."
- },
- "defeat": {
- "1": "새로운 세상을 만들 것이다…"
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "이런 우리가 다시 만나게 됐군. 우리의 운명이 얽히게 된 것 같군.\n 하지만 지금 여기서, 나는 마침내 그 끈을 끊을 것이다!"
- },
- "victory": {
- "1": "어떻게? 어째서? 어떻게?!"
- },
- "defeat": {
- "1": "작별이로군."
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "누구도 저를 막을 수 없습니다! 무슨 짓을 하더라도!"
- },
- "victory": {
- "1": "…어떻게 된 거지? 이 몸은 플라스마단을 만들어낸 완벽한 남자라고! "
- },
- "defeat": {
- "1": "세계를 바꿀 완전한 지배자가 아니었단 말인가!? …흐하하!"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "오시죠! 당신이 모든 희망을 잃는 순간의 얼굴을 보겠습니다!"
- },
- "victory": {
- "1": "내 계산이… 틀려! 내 치밀한 계획이 틀리다니! 세상은 내 것이어야 하는데!"
- },
- "defeat": {
- "1": "큐레무! 합체해라!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "나를 막겠다고? 배틀로 증명하도록."
- },
- "victory": {
- "1": "네가 나를 여기서 막았군. 하지만 잠시 기다리도록. "
- },
- "defeat": {
- "1": "포켓몬은… 더 이상 존재하지 않는다."
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "너의 미래와 나의 미래… 어느 쪽이 옳은지 서로의 포켓몬에게 묻도록 하지."
- },
- "victory": {
- "1": "크윽!"
- },
- "defeat": {
- "1": "우매한 자들이 이 아름다운 세상을 계속 더럽히고 있군."
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "비스트가 놀라잖아! …우선은 너를 조용히 시켜야겠어."
- },
- "victory": {
- "1": "……너무해!"
- },
- "defeat": {
- "1": "흐음…"
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "그렇게 말했는데도! …왜 이리 끈질긴 거야! 정말 진절머리가 나.\n$더 말해봐야 소용 없겠지… 텅비드의 힘으로 네가 여기까지 온 걸 후회하게 해줄게!"
- },
- "victory": {
- "1": "………아아아웃!!"
- },
- "defeat": {
- "1": "나는 비스트만 있으면 돼! 너희가 어떻게 되든 상관없어!"
- }
- },
- "skull_boss_guzma_1": {
- "encounter": {
- "1": "박살 내고 박살 내도 절대 봐주지 않아…\n$모두가 싫어하는 구즈마가 여기 있다!"
- },
- "victory": {
- "1": "쯧. 너는 내가 박살 내주겠어!"
- },
- "defeat": {
- "1": "겨우 그걸 위해서 일부러 온 거야?"
- }
- },
- "skull_boss_guzma_2": {
- "encounter": {
- "1": "누구든지 박살 낸다!\n$그것이 구즈마님의 아이덴티티!!"
- },
- "victory": {
- "1": "구즈마!!! 뭐 하고 있는 거야?!"
- },
- "defeat": {
- "1": "너희들 바보군!"
- }
- },
- "macro_boss_rose_1": {
- "encounter": {
- "1": "내게는 모든 사람이 영원히 마음을 놓고 발전할 수 있도록…\n$무한한 에너지를 가져다 줘야 한다는 신념과 사명이 있단다!"
- },
- "victory": {
- "1": "아직 무르군… 트레이너.\n$역사는 바뀔 것이네! 이 나의 손에 의해서 말이지"
- },
- "defeat": {
- "1": "자네는 여전히 깨닫지 못했군!"
- }
- },
- "macro_boss_rose_2": {
- "encounter": {
- "1": "나는 가라르를 포함한— 전 세계의 에너지 문제를 해결하기 위해 최선을 다하고 있어.\n$매크로코스모스를 성공으로 이끈 경험과 성과는 내 방식이 효율적이라는 증거란다.\n$생각을 바꿀 마음은 없어. 내가 지더라도."
- },
- "victory": {
- "1": "포켓몬 승부는 좋군! 오랜만에 싸워보니 만족스러워…\n$제법 괜찮군. 패배를 인정하지."
- },
- "defeat": {
- "1": "너희가 보기에는 내가 끔찍한 짓을 벌이고 있는 것처럼 보이겠지? 조금도 이해가 가지 않을 거야.\n$하지만 난 가라르지방의 영원한 번영을 위해서 무한한 에너지를 가져다줘야 해."
- }
- },
- "brock": {
- "encounter": {
- "1": "내 전문인 바위 타입 포켓몬으로 널 쓰러뜨려줄게! 덤벼!",
- "2": "바위같은 의지로 널 압도하겠어!",
- "3": "내 포켓몬의 진정한 힘을 보여줄게!"
- },
- "victory": {
- "1": "네 포켓몬의 힘이 바위같은 내 방어를 이겼어!",
- "2": "세상은 넓구나! 너랑 겨뤄볼 수 있어서 즐거웠어.",
- "3": "아마도 난 포켓몬 브리더의 꿈을 이루러 가야할지도…"
- },
- "defeat": {
- "1": "최선의 공격은 적절한 방어지!\n그게 내 방식이야!",
- "2": "다음에 나한테 더 배우러와. 바위타입과 어떻게 싸워야하는지 알려주지!",
- "3": "아, 여러 지역을 돌아다니며 여행한 보람이 있군!"
- }
- },
- "misty": {
- "encounter": {
- "1": "내 방침은 물타입 포켓몬으로 공격하고 공격하고 또 공격하는 거!",
- "2": "아하핫, 너한테 내 물타입 포켓몬들의 힘을 보여줄게!",
- "3": "내 꿈은 여행을 다니며 강한 트레이너들과 배틀하는 거였어…\n네가 그 충분한 도전자가 될 수 있는지 볼까?"
- },
- "victory": {
- "1": "너 정말로 강하구나… 그 실력 인정하도록 할게…",
- "2": "으으… 너 그냥 운이 좋았던거야, 그치?!",
- "3": "우와, 너 대단해! 날 이기다니 믿을 수 없어!"
- },
- "defeat": {
- "1": "최강인 최이슬! 너한테 좀 심했나?",
- "2": "내 포켓몬들의 우아한 수영 테크닉을 봤길 바랄게!",
- "3": "내 프라이드와 즐거움엔 네 포켓몬들은 상대가 안 돼. "
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "마이 전기 포켓몬은 전쟁에서 미를 구했어요! 하우를 유에게 보여줄게요!",
- "2": "헤이! 쇼크로 유를 항복시키겠어요!",
- "3": "배틀에서 마이 에너미에게 했던 것처럼 유에게도 펀치를 날리겠어요!"
- },
- "victory": {
- "1": "와우, 키드! 유어 팀은 진짜 대단하군요!",
- "2": "으흐흑, 유는 스트롱하네요! 마이 전기 트릭도 유에겐 로스트입니다.",
- "3": "앱솔루트하고 쇼킹한 패배였어요!"
- },
- "defeat": {
- "1": "오우 예! 전기 타입 포켓몬이라면, 미가 월드에서 넘버 원이에요!",
- "2": "하하하! 키드, 이것이 찌릿찌릿 일렉트릭 배틀입니다!",
- "3": "포켓몬 배틀은 전쟁, 앤드 나는 유에게 직접 전투를 보여줬습니다!"
- }
- },
- "erika": {
- "encounter": {
- "1": "아, 오늘은 날씨가 좋네요…\n음, 배틀일까요? 그럼 더 좋죠.",
- "2": "제 포켓몬들의 배틀 실력은 제 꽃꽂이 실력만큼 대단하답니다.",
- "3": "아, 제 포켓몬의 달콤한 향기가 저를 다시 잠들게 하지 않았으면 좋겠는데……",
- "4": "정원에서 꽃을 보면 마음이 편안해져요.”."
- },
- "victory": {
- "1": "앗! 제 패배를 인정합니다.",
- "2": "방금 경기 정말 달콤했어요.",
- "3": "아, 제가 진 것 같네요…",
- "4": "앗, 맙소사."
- },
- "defeat": {
- "1": "저 조금 걱정했어요. 너무 졸려서…",
- "2": "어머, 제 풀 포켓몬이 당신을 압도한 것 같네요.",
- "3": "이 배틀 정말로 편안한 경험이었네요.",
- "4": "어머… 이게 끝인가요?"
- }
- },
- "janine": {
- "encounter": {
- "1": "난 독을 사용하는 인술을 갈고 닦고 있어.\n오늘 수련에서는 너랑 대련할거야!",
- "2": "아버지는 내가 잘해낼 수 있다고 신뢰하셔.\n 그게 맞는다는 걸 증명할게!",
- "3": "내 인술은 아버지한테 뒤처지지 않아! 따라올 수 있겠어? "
- },
- "victory": {
- "1": "역시 아직도, 난 더 수련이 필요해… 납득했어.",
- "2": "네 배틀 기술이 내 인술보다 한 수위야.",
- "3": "더 스스로 갈고 닦아서, 내 인술을 향상 시키겠어."
- },
- "defeat": {
- "1": "후후후… 독이 네 기력을 모두 가져가버렸네.",
- "2": "하핫, 너 내 인술에 맞설 기회를 잡지 못했구나!",
- "3": "나를 향한 아버지의 신뢰, 틀리지 않았다는 걸 증명해냈어."
- }
- },
- "sabrina": {
- "encounter": {
- "1": "내 초능력을 통해서, 너의 도착은 예상하고 있었어!",
- "2": "싸우는 건 좋아하지 않지만 네가 원한다면… 나의 힘을 보여줄게!",
- "3": "네게서 큰 염원이 느껴져. 그것이 근거 없는 것이 아닌지 지켜보겠어."
- },
- "victory": {
- "1": "너의 힘은… 내가 예견했던 것보다 훨씬 뛰어나…",
- "2": "나는 너의 힘을 정확하게 예측하지 못했어.",
- "3": "나 엄청난 초능력을 가지고도, 너처럼 강한 사람을 느끼지 못했네."
- },
- "defeat": {
- "1": "이 승리는… 내가 환상에서 예견한 그대로네!",
- "2": "아마도 그건, 내가 깊이 느꼈던 또 다른 염원이었을거야…",
- "3": "무모하게 배틀에 임하기 전에 능력을 갈고닦도록.\n넌 미래가 어떻게 될지 예지할 수 없으니까…"
- }
- },
- "blaine": {
- "encounter": {
- "1": "우오오~옷! 화상치료제는 잘 준비했는가!",
- "2": "나의 포켓몬은 모든 것을 불꽃으로 태워버리는 강한 녀석들뿐이다!",
- "3": "불꽃과 함께할 준비는 됐는가!"
- },
- "victory": {
- "1": "아무것도 남지 않고 불타버렸다! 재조차 남지 않았어!",
- "2": "내가 불을 너무 세게 피우지 않았나?",
- "3": "불태웠다… 하지만 이건 불꽃을 향상시키려는 내 동기를 더욱 뜨겁게 만드는군!"
- },
- "defeat": {
- "1": "나의 타오르는 불길은 진압할 수 없다!",
- "2": "내 포켓몬은 이번 승리의 열기로 더욱 강해졌다!",
- "3": "하! 내 열정이 네 것보다 더 밝게 타오르고 있군!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "나, 로켓단의 리더가, 고통의 세계를 느끼게 해주마!",
- "2": "옛 동료들과 다시 만나기 전, 이곳에서의 훈련은 매우 중요하겠군.",
- "3": "너는 곧 경험하게 될 실패에 대한 준비가 되어 있지 않군!"
- },
- "victory": {
- "1": "하! 내가 졌다고?! 더 이상 할말이 없군!",
- "2": "흐음… 넌 내가 이루고자 하는 것을 결코 이해할 수 없을 거다.",
- "3": "이 패배는 피할 수 없는 것을 단지 지연시킬 뿐.\n때가 되면 잿더미에서 로켓단을 일으켜 세울 것이다."
- },
- "defeat": {
- "1": "자신의 힘을 스스로 잴수 없다는 것은 네가 아직 꼬맹이라는 것을 보여준다고 할 수 있지.",
- "2": "다시는 나를 방해하지 말도록.",
- "3": "나에게 도전하는 것이 얼마나 어리석은 짓인지 이해했으면 좋겠군."
- }
- },
- "roxanne": {
- "encounter": {
- "1": "당신이 어떻게 싸우는지 보여주시겠어요?",
- "2": "당신은 여러 트레이너와 싸우면서 많은 것을 배울 수 있을거예요.",
- "3": "아, 전략짜는 거 들켰네요.\n배틀할까요?"
- },
- "victory": {
- "1": "아, 제가 진 것 같네요.\n승복하겠습니다.",
- "2": "전 아직도 포켓몬 배틀에 대해서 한참 더 배워야할 것 같네요.",
- "3": "오늘 여기서 배운 것들을 마음에 담아둬야겠어요."
- },
- "defeat": {
- "1": "전 방금 승부에서 많은 것을 배웠습니다.\n당신도 그랬길 바래요.",
- "2": "다시 붙을 날이 기대되네요.\n당신이 여기서 배운 걸 활용할 수 있길 바랍니다.",
- "3": "여태까지 공부해온 것 덕분에 이겼네요."
- }
- },
- "brawly": {
- "encounter": {
- "1": "오, 도전자잖아!\n어디 한 번 볼까!",
- "2": "넌 큰 파란을 일으킬 것 같군.\n승부다!",
- "3": "폭풍을 일으킬 시간이야!\n가자!"
- },
- "victory": {
- "1": "우와, 너 날 씻겨버렸네!",
- "2": "내 파도를 타고, 나까지 밀어내다니!",
- "3": "바위 동굴에서 길을 잃은 기분이야!"
- },
- "defeat": {
- "1": "하핫, 난 큰 파도를 탔다고!\n언제 또 도전해주라.",
- "2": "언젠가 또 같이 서핑하자고!",
- "3": "파도가 밀려왔다가 밀려나듯, 언젠가 너도 다시 도전하러 와."
- }
- },
- "wattson": {
- "encounter": {
- "1": "찌릿찌릿해질 때가 됐군!\n와하하하핫!",
- "2": "스파크가 튀도록 해주마!\n와하하하하!",
- "3": "와하하하하!\n마비 치료제를 가져왔길 바라네!"
- },
- "victory": {
- "1": "이 몸 배터리가 다 됐군!\n와하하하하!",
- "2": "자네 완전히 날 좌초시켰군!\n와하하하핫!",
- "3": "스릴 넘치는 배틀, 고맙네!\n와하하하하하!"
- },
- "defeat": {
- "1": "자네의 배터리 재충전하게. 그리고 나에게 도전하러 돌아오도록!\n와하하하핫!",
- "2": "방금 배틀이 자네에게 짜릿짜릿했길 바란다네!\n와하하하하!",
- "3": "자네 혹시 내가 이겨서 충격 받았나?\n와하하하핫!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "어서오세요! 잠깐, 아냐…\n너를 무너뜨려줄게!",
- "2": "난 체육관 관장이 된지는 얼마 안됐지만, 널 태워버릴거야!",
- "3": "할아버지에게 배운 기술을 한 수 보여줄게! 승부다!"
- },
- "victory": {
- "1": "너 우리 할아버지를 생각나게 하네…\n내가 진 게 놀랍진 않아.",
- "2": "나 너무 열심히 하는 건가?\n너무 열 올리면 안되니깐, 진정해야겠어.",
- "3": "패배는 날 꺼뜨릴 수 없어.\n트레이닝으로 다시 불을 붙일 때야!"
- },
- "defeat": {
- "1": "할아버지가 자랑스러워하시길…\n언젠가 다시 배틀하자.",
- "2": "내…내가 이기다니!\n내 방식대로 한 게 통했어!",
- "3": "조만간 다시 뜨겁게 불타오르는 배틀을 하자!"
- }
- },
- "norman": {
- "encounter": {
- "1": "여기까지 오다니 놀랍군.\n한 번 겨뤄볼까.",
- "2": "관장으로서 최선을 다해 널 이길 거란다.\n가자!",
- "3": "최선을 다하는 게 좋을 거야.\n승부할 시간이다!"
- },
- "victory": {
- "1": "내가 지다니…?\n규칙은 규칙이니, 흐음.",
- "2": "담청시티에서 이사한 게 문제였나…?",
- "3": "믿을 수 없구나.\n훌륭한 승부였어."
- },
- "defeat": {
- "1": "우린 둘 다 최선을 다했지.\n다시 대결할 수 있었으면 좋겠구나.",
- "2": "우리 집 꼬마에게 도전해보는 것도 좋겠군.\n아마 뭔가 배울 수 있을거다!",
- "3": "방금 전 배틀 완벽했어.\n다음에도 행운이 함께하길."
- }
- },
- "winona": {
- "encounter": {
- "1": "저는 먹이를 찾아서 하늘을 날아다녔어요…\n그리고 당신은 제 타겟입니다!",
- "2": "배틀이 어떻게 되든, 전 제 비행 포켓몬과 우아하게 승리하겠어요. 승부합시다!",
- "3": "당신이 높은 곳을 무서워하지 않기를.\n자, 날아올라요!"
- },
- "victory": {
- "1": "저보다 우아하게 나서는 트레이너는 처음 봤습니다.\n훌륭하시네요.",
- "2": "이런, 제 비행 포켓몬이 추락해버렸네요!\n훌륭한 배틀이었습니다.",
- "3": "비록 전 떨어졌지만, 제 포켓몬은 다시 날아갈 겁니다!"
- },
- "defeat": {
- "1": "제 비행 포켓몬과 영원히 우아하게 춤출게요.",
- "2": "우리의 쇼가 즐거웠길 바라요.\n우아한 춤은 끝났습니다.",
- "3": "우리의 엘레강스한 안무를 다시 보러오지 않을래요?"
- }
- },
- "tate": {
- "encounter": {
- "1": "헤헤헤…\n내가 란과 같이 있지 않아서 놀랐지?",
- "2": "네가 무슨 생각을 하는지 알아…\n승부하고 싶은거지!",
- "3": "네 움직임을 모두 알고 있는데…\n어떻게 이기려고?"
- },
- "victory": {
- "1": "어쩔 수 없지…\n란이 보고싶다아…",
- "2": "너와 네 포켓몬과의 유대, 나보다 더 견고한걸.",
- "3": "란이랑 함께였다면, 우리가 이겼어.\n둘이선 더 잘 할 수 있다구!"
- },
- "defeat": {
- "1": "내 포켓몬과 나는 우수하다구!",
- "2": "날 못 이긴다면, 넌 란한테도 절대로 못 이겨.",
- "3": "란과 함께한 엄격한 훈련 덕이야.\n덕분에 포켓몬과 하나가 될 수 있었어."
- }
- },
- "liza": {
- "encounter": {
- "1": "후후후…\n내가 풍과 같이 있지 않아서 놀랐지?",
- "2": "네가 무얼 바라는지 알아…\n포켓몬 배틀, 맞지?",
- "3": "포켓몬과 하나가 된 사람…\n어떻게 이기려고?"
- },
- "victory": {
- "1": "어쩔 수 없지…\n풍이 보고싶다아…",
- "2": "너와 네 포켓몬과의 유대, 나보다 더 견고한걸.",
- "3": "풍이랑 함께였다면, 우리가 이겼어.\n둘이선 더 잘 할 수 있다구!"
- },
- "defeat": {
- "1": "내 포켓몬과 내가 승리한거야.",
- "2": "날 못 이긴다면, 넌 풍한테도 절대로 못 이겨.",
- "3": "풍과 함께한 엄격한 훈련 덕이야.\n덕분에 포켓몬과 싱크로 될 수 있었어."
- }
- },
- "juan": {
- "encounter": {
- "1": "지금은 겸양을 부릴 때가 아니군요.\n승부합시다!",
- "2": "아하하하, 물 포켓몬과 함께 아트를 보여드리겠습니다!",
- "3": "태풍이 다가오는군요!\n저를 테스트해주시겠습니까?",
- "4": "자, 마음껏 봐주십시오.\n저와 포켓몬이 이루어내는 물의 일루전을!"
- },
- "victory": {
- "1": "당신은 윤진 관장을 뛰어넘을 지니어스군요!",
- "2": "당신이 훈련할 때 저는 엘레강스에 집중했습니다.\n당신이 이기는 건 당연하죠.",
- "3": "아하하하하!\n잘했습니다, 이번엔 당신이 이겼네요.",
- "4": "모든 것을 극복하는 브릴리언트 스킬, 당신에게 느껴지네요."
- },
- "defeat": {
- "1": "저와 포켓몬이 이루어내는 물의 일루전이 승리했습니다.",
- "2": "아하하핫, 저는 이겼고, 당신은 졌습니다.",
- "3": "겉옷 빌려드릴까요? 아마도 배틀에 도움이 될겁니다!\n아하하하, 농담입니다!",
- "4": "제가 승리자군요! 그리고, 당신은 졌네요."
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "철썩! 철썩! 조심해라!\n맥시멈 가면이…지금…간다!",
- "2": "철썩! 철썩! 파도의 맥시멈 가면!",
- "3": "밀물같은 힘으로 쓸려나가도록 해보실까!!"
- },
- "victory": {
- "1": "저절로 웃음이 나오게 되는군!\n크하하핫! 정말 훌륭했다!",
- "2": "우왓! 끝나버렸나!\n뭐랄까…\n좀 더 싸우고 싶은 기분이야!",
- "3": "이럴수가!?"
- },
- "defeat": {
- "1": "으하하핫! 보람차군!",
- "2": "내가 이겼지만, 아쉽군! 좀 더 배틀하고 싶은데!",
- "3": "잘 가게나!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "넓은 하늘을 화려하게 나는 새 포켓몬의 진정한 강함을 알게 해주겠다!",
- "2": "바람이여, 나에게 오라!",
- "3": "아버지, 내 시합을 하늘에서도 봐줘!"
- },
- "victory": {
- "1": "알았다… 미련없이 땅에 내려가지.",
- "2": "패배는 패배니까. 넌 정말 강하군.",
- "3": "…큭! 그래, 내가 졌다."
- },
- "defeat": {
- "1": "아버지! 소중히 여기던 새 포켓몬으로 이겼어…",
- "2": "언제나 새 포켓몬이 최강이다!",
- "3": "아버지를 따라 잡은 기분이군!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "똑똑한 네가 어떤 계획을 세우고 있든지, 나와 내 파트너가 가라앉혀줄 테니까 문제 없어.",
- "2": "잡담하려고 나온 게 아니야. 이기려고 나온 거지!",
- "3": "이건 내 포켓몬이 주는 작은 선물이야… 네가 잘 받아줘야 해!"
- },
- "victory": {
- "1": "너와 네 포켓몬 정말로 너무…",
- "2": "어째서…? 어떻게 이럴 수 있지?!",
- "3": "완전히 씻겨 나갔잖아!"
- },
- "defeat": {
- "1": "성난 파도가 다시 부딪혀올거니까!",
- "2": "승리의 파도를 탈 시간이야!",
- "3": "에헤헤!"
- }
- },
- "melony": {
- "encounter": {
- "1": "봐주지는 않을 거란다!",
- "2": "그럼 이제, 시작해도 될 것 같네.",
- "3": "영하의 세계로 안내해주마!"
- },
- "victory": {
- "1": "너… 꽤 하는구나?",
- "2": "만약 주변에서 마쿠와를 찾는다면, 그 때는 따끔한 맛을 보여주도록 하렴, 알았지?",
- "3": "아이스 브레이킹을 너무 문자 그대로 받아들인 것 같은데…"
- },
- "defeat": {
- "1": "이제 전투가 얼마나 치열할 수 있는 지 알겠니?",
- "2": "아하하! 내가 또 이긴 것 같네!",
- "3": "너 혹시 봐준거니?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "너 강해보이네! 받아라! 승부 시작이야!",
- "2": "난 넓은 대양처럼 강인하다고. 너 분명히 휩쓸려 갈거야.",
- "3": "오, 내가 너를 마주 보고 있군! 둘다 파도에서 떨어지겠어."
- },
- "victory": {
- "1": "너… 좋은 포켓몬을 키우고 있구나! 꽤 하는군! 끝내주는 트레이너야!",
- "2": "강해 보이는 게 아니고 진짜 강하구나! 에-, 나도 휩쓸려버렸어!",
- "3": "넌 거친 파도처럼 강인하구나!"
- },
- "defeat": {
- "1": "넌 강하지만, 바다를 흔들기에는 역부족이네, 그치!",
- "2": "아하핫! 내가 또 이긴 것 같네!",
- "3": "달콤하네, 승리 역시 달콤하고!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "미안합니다. 도전자이시죠?\n고스트포켓몬 조련사인 사천왕 망초가 상대하겠습니다.",
- "2": "겨루었던 트레이너와 포켓몬의 마음이 통하는 모습을 이야기로 만드는 것을 좋아해서요!\n그러니까 당신들에 대한 취재를 허락해 주세요?",
- "3": "포켓몬과 함께 일하는 모든 사람들은 각자 이야기를 갖고 있죠.\n어떤 이야기를 들려드릴까요?"
- },
- "victory": {
- "1": "…우와. 저 아연실색 망연자실이에요!",
- "2": "미-미 미안합니다! 먼저 포켓몬에게 사과해야지…\n\n나 때문에 괴로운 기억을 만들게 돼서 정말 미안해!",
- "3": "그치만, 전 여전히 사천왕인걸요!"
- },
- "defeat": {
- "1": "에헤헤.",
- "2": "다음 소설의 완벽한 소재를 얻었다!",
- "3": "그리고 이렇게, 또 다른 이야기가 끝났습니다…"
- }
- },
- "marshal": {
- "encounter": {
- "1": "노간주 스승님이, 잠재력을 보고 네게 관심을 갖고 계시더군.\n그 힘의 한계까지 데려가는 것이 이번 의도다! 그럼 간다!",
- "2": "승리, 압도적인 승리, 내가 바라는 것이다! 강인한 도전자여, 간다!",
- "3": "깨뜨리는 것은 약한 자신, 관철하는 것은 강한 신념!\n 그리고 바라는 것은 압도적인 승리!"
- },
- "victory": {
- "1": "후우! 잘 싸웠다!",
- "2": "역시 대단하구나! 싸워서 더욱더 높은 곳을 노려라…!",
- "3": "너와 네 포켓몬이 보여준 그 힘, 감명 깊군…"
- },
- "defeat": {
- "1": "흐음.",
- "2": "좋은 승부였다.",
- "3": "하압! 하압! 히야아아압!!!!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "넌 내 오랜 친구가 생각나게 하는군. 그 덕분에 이 배틀이 기대돼!",
- "2": "왜 하고 있는지 생각하지 않으면, 포켓몬 배틀은 의미가 없어 . \n$좋게 말하면, 함께 포켓몬과 승부하는 것이 무의미해 지는 것이지.",
- "3": "내 이름은 체렌! 체육관 관장이자 선생님을 하고 있지! 널 만나게 되서 기쁘군."
- },
- "victory": {
- "1": "고마워! 내 안에 무엇이 부족했는지 알게 됐네.",
- "2": "고마워! 내가 추구하는 이상에 조금 다가간 것 같아.",
- "3": "으음… 이건 문제가 있군."
- },
- "defeat": {
- "1": "체육관 관장으로서, 나는 넘어야할 벽이 되고자 하고 있거든.",
- "2": "좋았어!",
- "3": "포켓몬이 곁에 있었기 때문에 여기까지 올 수 있었어.\n생명체와 생명체라는 동등한 관계에서 포켓몬이 우리에게 도움을 주는 이유를 생각해 볼 필요는 있지."
- }
- },
- "chili": {
- "encounter": {
- "1": "이얏호-! 형제중 가장 강한 나하고 놀자고!",
- "2": "짜잔! 불꽃타입 불꽃의 남자 팟, 바로 너의 상대가 되어주지!",
- "3": "나와 내 불타오르는 불꽃타입 포켓몬들이 뭘 할수 있는지 보여주지!"
- },
- "victory": {
- "1": "졌지만… 모 두 불 태 웠 어!!",
- "2": "와우! 불태워졌네!",
- "3": "으악! 너가 나를 이겨버렸잖아!"
- },
- "defeat": {
- "1": "난 지금 불타오르고 있어, 나와 싸우게 된다면 넌 다치게 될거야!",
- "2": "불장난하면 밤에 이불에 지도를 그리는 법이지!",
- "3": "그러니까, 상대가 나였잖아? 너에게는 처음부터 기회가 없었다고!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "개인적으로 받아들이지 마세요… 감정 상하지도 말고요… 저와 제 풀타입 포켓몬들이라면…\n$음… 무슨 일이 있더라도 배틀을 할 겁니다.",
- "2": "네. 저로 괜찮다면 진심을 담아서 상대해 드리겠습니다.",
- "3": "네… 그, 음, 저는 덴트입니다, 풀타입 포켓몬을 좋아합니다."
- },
- "victory": {
- "1": "…에- 그게… 끝나버렸나요?",
- "2": "…놀랐습니다. 당신 아주 강하군요. \n$팟이나 콘이라도 이길 수 없었을 것 같습니다…",
- "3": "…어라, 타이밍이 좀 잘못된것 같네요?"
- },
- "defeat": {
- "1": "어라? 제가 이긴 건가요?",
- "2": "제 생각엔… \n$아무래도 제가 이겼어야만 했을 거라 생각합니다, 팟과 콘이랑 배틀하면서 우리는 모두 더 강해졌기 때문이죠.",
- "3": "정말… 아주 짜릿한 경험이었습니다…"
- }
- },
- "roark": {
- "encounter": {
- "1": "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!",
- "2": "자 간다! 내 자랑이자 기쁨인 바위타입 포켓몬들이야!",
- "3": "바위타입 포켓몬이야말로 최고지!",
- "4": "트레이너로서 너의 실력이 어느 정도인지 그리고 함께 싸울 포켓몬이 얼마나 강한지 확인해보겠어!"
- },
- "victory": {
- "1": "이-이럴수가! 열심히 단련시킨 포켓몬들이!",
- "2": "…져버린 건가. 다음엔 지하통로에서 화석캐기 승부를 하고 싶구나.",
- "3": "네 실력이라면 승리는 당연한 결과겠지.",
- "4": "뭐-뭐야?! 이럴 수가! 이것도 부족했단 말인가?",
- "5": "내가 실수했군."
- },
- "defeat": {
- "1": "봤지? 이게 바로 내가 자랑하는 바위 스타일 전투야!",
- "2": "고마워! 이번 승부로 아버지를 이길 수 있겠다는 자신감이 생겼어!",
- "3": "정말 단단한 바위를 뚫고 나온 기분인데!"
- }
- },
- "morty": {
- "encounter": {
- "1": "조금만 더 노력하면, 내가 전설의 포켓몬을 만나는 미래가 보여.\n$내가 그 수준에 도달할 수 있게 도와줘!",
- "2": "커다란 무지개색 포켓몬은 진정한 강함을 가진 트레이너 앞에 나타난다는 이야기가 있어. \n$난 그 이야기를 믿고, 줄곧 이 곳에서 몰래 수행하고 있어. 그 결과로, 다른 사람들은 볼 수 없는 것을 볼 수 있게 됐지. \n$내겐 그 포켓몬을 나타나게 할 사람의 그림자가 보이거든. \n$난 그게 나라고 믿어! 넌 내가 그 수준에 올라갈 수 있도록 도와줘야겠어!",
- "3": "네가 믿든 믿지 않든, 불가사의한 힘은 존재해.",
- "4": "넌 내 수련의 결실을 보게 될 거야.",
- "5": "포켓몬과 너의 영혼을 하나로 만들어야 해. 가능하겠어?",
- "6": "저기, 너 내 수행의 일부분이 되고 싶은거지?"
- },
- "victory": {
- "1": "나는 아직 멀었구나…",
- "2": "그래… 여행으로 먼 곳을 돌아다니면서, 나보다 훨씬 많은 것을 봐왔구나.\n$네가 조금 부럽네…",
- "3": "이게 어떻게 가능한 거지…",
- "4": "우리의 잠재력은 그렇게 다르진 않은 것 같아.\n$그치만 넌 그것과 다른 무언가를 많이 갖고 있는 것 같네… 흐음.",
- "5": "수련이 더 필요하겠군.",
- "6": "안타깝게 됐네."
- },
- "defeat": {
- "1": "내가…다시 한 발짝 앞섰어.",
- "2": "후후훗…",
- "3": "뭐-뭐야?! 이럴 수가! 그것도 부족해?",
- "4": "정말 단단한 바위를 뚫고 나온 기분인데!",
- "5": "아하하하하!",
- "6": "내가 이길 줄 알았어!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "이기고 싶으니까 이기고 말겠어!",
- "2": "싸우고 싶으면 싸운다! 이거면 충분하지 않아!?"
- },
- "victory": {
- "1": "이기고 싶었는데…졌잖아!",
- "2": "이기지 못해서…지고 말았어!"
- },
- "defeat": {
- "1": "잠시만. 나 지금 이긴거지? 이긴 거 맞지! 기분 좋은데!",
- "2": "우와아! 이거 굉장한데!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "네리네는 그 사람을 구원하고 싶습니다. 그렇기에 패배는 용납되지 않습니다.\n$… 승부를 시작합니다."
- },
- "victory": {
- "1": "네리네는… 안 된다는 건가요."
- },
- "defeat": {
- "1": "네리네가 승리했습니다. 수고하셨습니다."
- }
- },
- "lacey": {
- "encounter": {
- "1": "이번에는 사천왕으로서 승부하는 거니까 평소 사용하는 아이들로 상대해 드릴게요!"
- },
- "victory": {
- "1": "멋진 포켓몬 배틀이었어요!"
- },
- "defeat": {
- "1": "당신의 포켓몬의 노력에 박수를 보내주세요!"
- }
- },
- "drayton": {
- "encounter": {
- "1": "의자는 좋은 거야. 너도 그렇게 생각해? 정말 고마운 물건이지. \n$왜 다들 앉지 않는 걸까. 서 있는 건 힘들잖아!"
- },
- "victory": {
- "1": "전보다 더 강해질 줄이야!"
- },
- "defeat": {
- "1": "헤헤헷! 내 승리야. 분한 건 알겠지만 카지처럼 나가떨어지지마, 응?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "그래, 올곧게 자란 초목을 모아서 만든 풀 정글짐은 어땠는가?\n$자네가 느낀 그것이 나의 체육관 관장으로서의 실력이네! 한번 확인해 보겠나?"
- },
- "victory": {
- "1": "포켓몬은 자네를 믿고, 자네는 그들을 믿는다…가슴이 후련해지는 승부였구먼."
- },
- "defeat": {
- "1": "호호호…연약해 보이는 풀잎은 콘크리트도 뚫을 수 있다네."
- }
- },
- "viola": {
- "encounter": {
- "1": "패배의 분함도 승리의 순간도…\n$둘 다 최고의 피사체야! 정말 멋져 멋져! \n$자, 그럼 덤비렴!",
- "2": "나 비올라는 셔트 찬스를 노리는 것처럼--승리를 노릴 거야!"
- },
- "victory": {
- "1": "너와 네 포켓몬은 최고의 콤비구나! 정말 멋져 멋져!",
- "2": "렌즈 너머의 세계와 포켓몬의 마음으로 보는 세계…\n$똑같이 보이는 풍경이지만 다양한 세계가 겹쳐져 있는 거야."
- },
- "defeat": {
- "1": "내가 승리한 순간을 찍은 사진은 정말 멋져 멋져!",
- "2": "좋아! 멋진 사진을 찍었어!"
- }
- },
- "candice": {
- "encounter": {
- "1": "나, 무청에게 도전하고 싶은거야? 좋아! 강한 사람을 기다리고 있었으니까!\n$그치만 말해두는데, 집중하는 방법을 아는 나도 강력하거든.",
- "2": "포켓몬도 멋도 연애도 정신 집중이 중요하다고!\n$무슨 뜻인지 보여줄테니까 각오해!"
- },
- "victory": {
- "1": "있지, 나 조금 불타오르게 됐어! 널 조금 존경하게 될지도 몰라.",
- "2": "우와! 제법인데! 내가 존경하게 만들다니!\n$네 집중력과 의지, 완전히 나를 압도하는 같아. "
- },
- "defeat": {
- "1": "이기고자 하는 의지는 전해졌지만, 난 지지 않았어!",
- "2": "봤지? 무청의 집중력! 내 포켓몬의 집중력도 대단하다구!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "너에게선 승리의 기운이 느껴져. 어쨌든 재밌을 것 같아. 포켓몬 승부하자!"
- },
- "victory": {
- "1": "대단해! 너 정말 강하구나!"
- },
- "defeat": {
- "1": "그렇지! 나와 포켓몬은 완벽해!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "좋습니다! 그럼 상대해 드리죠!"
- },
- "victory": {
- "1": "승부는 딥하고 컴플렉스한 일이네요…"
- },
- "defeat": {
- "1": "사천왕을 상대로 하는 승리는 쉽게 오지 않는다구요."
- }
- },
- "cress": {
- "encounter": {
- "1": "맞습니다! 당신은 저와 제 자랑스러운 물타입 포켓몬들과 상대하게 될것입니다."
- },
- "victory": {
- "1": "곤란하네… 이 콘이 질 줄이야."
- },
- "defeat": {
- "1": "제가 당신의 상대였기 때문에 이건 당연한 결과였습니다."
- }
- },
- "allister": {
- "encounter": {
- "1": "……어니언이야.\n……가 간다…"
- },
- "victory": {
- "1": "충격을 받아서… 가면을 떨어뜨릴 뻔 했지만…\n$네가 얼마나 강한지 확실히 봤어."
- },
- "defeat": {
- "1": "이-이게 내 실력이니까!"
- }
- },
- "clay": {
- "encounter": {
- "1": "실망스럽군! 나를 기다리게 하다니, 이 꼬마가. 아무튼 실력을 확인해 볼까!"
- },
- "victory": {
- "1": "이런 이런… 진심으로 싸워서 진 거라 오히려 시원한 기분이군!"
- },
- "defeat": {
- "1": "중요한 것은 패배에 어떻게 반응하는 거다. \n$그렇기 때문에 패배를 연료로 삼아 나아가는 사람들은 강인하지."
- }
- },
- "kofu": {
- "encounter": {
- "1": "물포켓몬의 풀코스를! 배 터지게 먹여 주도록 하마!"
- },
- "victory": {
- "1": "우옷! 우오오옷! 이렇게 팔팔한 트레이너가 다 있다니!"
- },
- "defeat": {
- "1": "젊은 친구! 다음에 또 만나기를 기대하고 있으마!"
- }
- },
- "tulip": {
- "encounter": {
- "1": "리파의 기술로 너의 포켓몬들을 지금보다 훨~씬 아름답게 만들어 줄게!"
- },
- "victory": {
- "1": "너의 강함은 풀 수 없는 매직이구나."
- },
- "defeat": {
- "1": "…리파의 업계에서는 어중간한 재능을 가진 사람은 대체로 금방 사라져 버려."
- }
- },
- "sidney": {
- "encounter": {
- "1": "음, 좋은 표정이야. 꽤나 즐길 수 있겠는데.\n$좋아! 아주 좋아! 좋았어!\n$우리 함께, 포켓몬리그에서만 맛볼 수 있는 배틀을 즐겨보도록 하자!"
- },
- "victory": {
- "1": "이런, 이런 져버렸군? 뭐, 꽤 즐겼으니 상관없지만."
- },
- "defeat": {
- "1": "기분 나빠하지 마, 알겠지?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "송화산에서 수행하면서, 고스트 타입 포켓몬과 마음이 통하게 됐어. \n$응, 나와 내 포켓몬의 유대감은 정말 강해! \n$이런 내 포켓몬들에게 과연 데미지를 줄 수 있을지 한번 시험해봐!"
- },
- "victory": {
- "1": "아- 아, 내가 져버렸다."
- },
- "defeat": {
- "1": "언젠가 다시 승부할 수 있기를 기대할게!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "이곳에 도전하러 오는 건 모두 어설픈 트레이너와 포켓몬뿐…. \n$당신은 어떤가요? 제 진짜 실력을 발휘해도 괜찮을 정도라면 정말 기쁠텐데 말이죠…!"
- },
- "victory": {
- "1": "당신과… 당신 포켓몬들의 뜨거운 혼!\n$정말로 압도적인 뜨거움이네요. \n$내 얼음 기술로 피해를 주지 못한 것도 놀랍지 않을정도로요!"
- },
- "defeat": {
- "1": "저런, 정말로 치열한 승부였네요."
- }
- },
- "drake": {
- "encounter": {
- "1": "파트너로 포켓몬과 함께하는 승부에 무엇이 필요한지 넌 알고 있는가? \n$그걸 모른다면 넌 이 몸을 이길 수 없다!"
- },
- "victory": {
- "1": "훌륭하다, 라고 할 만 하군!"
- },
- "defeat": {
- "1": "난 승부에서 최선을 다했으니까!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "뭐랄까, 너의 분위기가 조금 변한 것 같은… \n$그런 느낌이 드는군. 자, 그럼 한번 확인해볼까? 너와 포켓몬의 힘을. \n$그리고 확실하게 보여주도록 하지. 나와 포켓몬에 의한 물의 일루전을!"
- },
- "victory": {
- "1": "훌륭하군. 넌 정말 굉장한 포켓몬 트레이너다. \n$그런 너와 너의 포켓몬을 만나게 된 걸 기쁘게 생각해. 스스로 그 가치를 증명하다니!"
- },
- "defeat": {
- "1": "거대한 일루전이로군!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "얼음포켓몬을 내보내면 대적할 사람이 없지! 상대를 얼린다는 건 매우 강력한 공격이야.\n$네 포켓몬이 꽁꽁 얼면 그때부턴 내 손바닥 위거든! 아하하! 준비됐어?"
- },
- "victory": {
- "1": "어떻게 감히!"
- },
- "defeat": {
- "1": "얼어붙은 넌 아무것도 할 수 없어."
- }
- },
- "will": {
- "encounter": {
- "1": "나는 전세계를 돌아다니며, 강한 에스퍼 포켓몬을 만들도록 수행해왔다.\n$계속 더 정진하겠다! 패배는 선택지에 없어!"
- },
- "victory": {
- "1": "이… 내가… 믿을수 없어…"
- },
- "defeat": {
- "1": "근소한 차이였다. 네게 부족한 것이 무엇인지 궁금하군."
- }
- },
- "malva": {
- "encounter": {
- "1": "심장이 불에 타버릴 것만 같아요. \n$당신에 대한 증오로 불타고 있거든요, 얄미운 트레이너!"
- },
- "victory": {
- "1": "도전자가… 사천왕 파키라에게서 멋지게 승리를 쟁취했습니다!"
- },
- "defeat": {
- "1": "기쁘네요! 당신을 짓밟을 수 있어서 말이죠!"
- }
- },
- "hala": {
- "encounter": {
- "1": "그럼…진심을 담아서 진지한 할라로 임하겠다!"
- },
- "victory": {
- "1": "네가 순례하면서 갖추게 된 강함을 느낄 수 있었다."
- },
- "defeat": {
- "1": "하하! 경쾌한 승부였구나!"
- }
- },
- "molayne": {
- "encounter": {
- "1": "사촌인 마마네에게 캡틴 자리는 줬지만, 아직 실력에는 자신 있어요. \n$제 실력은 초신성처럼 빛나니까요!"
- },
- "victory": {
- "1": "확실히 겨룰 흥미로운 트레이너를 찾았네요!"
- },
- "defeat": {
- "1": "아하하. 흥미로운 배틀이었네요."
- }
- },
- "rika": {
- "encounter": {
- "1": "실컷 귀여워해 줄 테니까… 한 번 열심히 해 보라고!"
- },
- "victory": {
- "1": "너, 꽤 하는구나!"
- },
- "defeat": {
- "1": "아하하! 제법인데! 역시 너는 재밌는 녀석이라니까!"
- }
- },
- "bruno": {
- "encounter": {
- "1": "우월한 힘으로 너를 부숴주지! 우! 하~앗!"
- },
- "victory": {
- "1": "하? 어떻게 내가 진 거지?"
- },
- "defeat": {
- "1": "얼마든지 내게 도전 할 수 있지만, 결과는 절대 바뀌지 않을 거다!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "내 이름은 호일! 벌레 포켓몬에 대해서라면 누구에게도 지지 않아!"
- },
- "victory": {
- "1": "우와, 대단해! 넌 포켓몬 전문가구나!\n내 연구는 아직 안 끝났네. 응, 네가 이겼어."
- },
- "defeat": {
- "1": "고마워! 방금 승부 덕분에, 내 연구도 진전을 이룬 것 같아!"
- }
- },
- "koga": {
- "encounter": {
- "1": "후하하하! 포켓몬은 단순히 강한 것만이 아니다--곧 알려주지!"
- },
- "victory": {
- "1": "하! 스스로 증명해냈군!"
- },
- "defeat": {
- "1": "인술을 피하는 방법을 배워보겠나?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "그럼, 할머니가 네가 얼마나 해낼 수 있는지 보도록 할게?"
- },
- "victory": {
- "1": "좋아! 꼬마야, 정말로, 인상적이었단다.\n$네 포켓몬은 너를 믿고 승리를 위해 최선을 다했구나.\n$비록 내가 졌지만, 좋아서 바보같이 웃음이 나오는구나!"
- },
- "defeat": {
- "1": "호호호! 이 할머니가 이겼구나!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "자 그럼 도전자여, 애정을 담아 키운 포켓몬으로 어떤 방식으로 싸우는지 연구해 보겠다!"
- },
- "victory": {
- "1": "너에 대한 내 가설이 맞았네. 재능만 있는 게 아니라… 대단한 녀석이구나! 너 반할것 같잖아!"
- },
- "defeat": {
- "1": "아 하 하! 패배했다면, 그 이유를 분석하고, 다음 승부에서 그 지식을 활용하도록!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "살아가는 동안, 궁극적인 요리와 강력한 상대를 찾기 위해… 열과 성을 다할 것입니다!"
- },
- "victory": {
- "1": "당신에 대한 기억을 제 가슴 속에 담아두겠습니다."
- },
- "defeat": {
- "1": "우리의 포켓몬 배틀은 영혼의 양식과 같습니다. 그건 저를 계속 지탱할 거예요. \n$이것이 제가 전투에서 모든 것을 바친 당신에게, 경의를 표하는 방법입니다!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "간다! 너의 이성을 싹 날려줄 거야!!"
- },
- "victory": {
- "1": "굉-장해! 네 이성, 이미 나보다 TOXIC해버렸잖아!"
- },
- "defeat": {
- "1": "헤이, 잠깐-! 좀 더 진지해져! 넌 더 날아가야한다구!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "여기에 소개는 필요 없지. 자, 라이치님과 승부할 시간이다!"
- },
- "victory": {
- "1": "정말 훌륭하군… 당신과 포켓몬 둘 다…"
- },
- "defeat": {
- "1": "흐-음."
- }
- },
- "poppy": {
- "encounter": {
- "1": "우와~! 뽀삐와 포켓몬 승부가 하고 싶으세요?"
- },
- "victory": {
- "1": "훌쩍, 으에엥~"
- },
- "defeat": {
- "1": "만세~! 만세~ 목수, 성공했어요! \n$에헴! 리벤지 매치는 언제든지 받아 줄게요!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "포켓몬은 싸우게 하려고 있는 것이야! 진정한 싸움이라는 것을 보여주겠다!"
- },
- "victory": {
- "1": "이런! 넌 무언가 특별하구나, 꼬마야!"
- },
- "defeat": {
- "1": "바하하하. 제대로 된 승부는 이렇게 하는거다!"
- }
- },
- "flint": {
- "encounter": {
- "1": "뜨겁게 타오를 준비는 됐겠지, 이제 곧 대폭발이 다가올테니까!"
- },
- "victory": {
- "1": "놀랍군! 네 기술이 너무 뜨거워서, 내가 미적지근해보이잖아!"
- },
- "defeat": {
- "1": "하? 그게 다야? 좀 더 열정이 필요해보이는걸."
- }
- },
- "grimsley": {
- "encounter": {
- "1": "이긴 자가 모든 것을 갖고 패배한 자에겐 아무것도 남지 않는다."
- },
- "victory": {
- "1": "누군가가 이기면 상대한 누군가가 진다… 난 다음 승리를 목표로 하겠어!"
- },
- "defeat": {
- "1": "누군가가 이기면, 그 사람과 싸운 사람은 지게 되는 것이지."
- }
- },
- "caitlin": {
- "encounter": {
- "1": "피어난 꽃에서 나타난 것은 나. 거기 있는 당신…\n$강함과 상냥함을 함께 갖춘 포켓몬 트레이너인 것 같네. \n$이 카틀레야가 대전 상대로 원하는 건 최고의 강함… \n$너도 그 실력을 마음껏 펼쳐 봐!"
- },
- "victory": {
- "1": "대전을 통해서 저도 포켓몬도 성장합니다. 감사드립니다."
- },
- "defeat": {
- "1": "더욱 엘레강트하고 엑셀런트하게 승리를 쟁취하고 싶거든."
- }
- },
- "diantha": {
- "encounter": {
- "1": "미래를 향한 희망으로 빛나는 당신과, 당신의 포켓몬을 상대로 승부하는 것…\n$솔직히, 매일매일 새로운 날을 위해 필요한 에너지가 채워지는 것 같아요! 정말로요!"
- },
- "victory": {
- "1": "고귀한 영혼을 지닌 포켓몬과 트레이너의 모습에 격하게 마음이 흔들려서…"
- },
- "defeat": {
- "1": "정말, 환상적이야! 어떻게 생각하시나요? 저의 포켓몬들, 꽤 멋있었죠?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "잘 왔네, 젊은 도전자여! 이 몸은 사천왕 중 한 명인 강철의 남자 간피다! \n$자 그럼 간다, 간다! 간닷!"
- },
- "victory": {
- "1": "정말 영광이군! 자네의 포켓몬과 서로 신뢰하는 힘, 날 능가하는군!!"
- },
- "defeat": {
- "1": "이게 무슨 마법이지? 내 마음의 떨림이 멈추질 않는군! \n$가치 있는 상대를 이기는 것은 영혼에 날개를 달아주는 것과 같지--그런 내가 비상하는 것일까!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "포켓몬 배틀은 언제나 재미있지! 자, 내가 상대해줄게!"
- },
- "victory": {
- "1": "아세로라… 입이 딱 벌어졌어! 어떻게 해낸 거야?!"
- },
- "defeat": {
- "1": "후아~! 놀라운 승리네!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "…안녕하십니까, 청목입니다.\n$귀찮게도 저는 사천왕도 겸임하고 있습니다."
- },
- "victory": {
- "1": "날고 있는 새포켓몬도 떨어뜨릴 기세로군요."
- },
- "defeat": {
- "1": "치프와 만나기로 한 시각이군요."
- }
- },
- "lance": {
- "encounter": {
- "1": "널 기다리고 있었다. 그 실력을 시험해보겠어.",
- "2": "여기까지 올 수 있을거라고 생각했다. 슬슬 시작해볼까."
- },
- "victory": {
- "1": "날 따라잡았군. 훌륭해!",
- "2": "다른 트레이너가 날 이길 거라곤 생각 못했는데… 놀랍군."
- },
- "defeat": {
- "1": "근소하군. 다시 해볼까?",
- "2": "네가 약해서가 아니다. 신경쓰지 말도록."
- }
- },
- "karen": {
- "encounter": {
- "1": "난 카렌! 내 악 타입 포켓몬과의 승부를 원하니?",
- "2": "난 네가 이전에 만났던 트레이너들과는 달라.",
- "3": "강한 포켓몬, 약한 포켓몬, 그런 건 사람이 멋대로 정하는 것."
- },
- "victory": {
- "1": "좋아하는 마음이 전해진다면 포켓몬도 답할거야. 그렇게 강해지는 거지",
- "2": "난 내가 선택한 길을 걸어갈거야.",
- "3": "챔피언이 너를 기다리고 있어."
- },
- "defeat": {
- "1": "정말 강한 트레이너라면 좋아하는 포켓몬으로 이길 수 있도록 열심히 해야 해.",
- "2": "뭐, 비교적 재밌었어.",
- "3": "언제라도 다시 찾아와, 상대해줄게."
- }
- },
- "milo": {
- "encounter": {
- "1": "그렇다는 건 당신이 포켓몬을 아주 깊게 이해하고 있다는 뜻이겠죠? \n$이거 만만치 않은 승부가 되겠네요! \n$저도 다이맥스를 사용해야겠어요!"
- },
- "victory": {
- "1": "풀의 힘이 모두 시들어버리다니… 당신은 굉장한 도전자시군요!"
- },
- "defeat": {
- "1": "충격과 공포를 전해드리겠습니다."
- }
- },
- "lucian": {
- "encounter": {
- "1": "잠깐, 기다려주세요. 제가 읽던 책이 거의 클라이맥스에 도달했거든요…\n$주인공이 성스러운 검을 얻었고 마지막 시련을 앞두고 있는데… 아, 신경 쓰지 마세요.\n$여기까지 왔으니, 그건 제쳐두고 당신과 싸워야겠습니다.\n$당신이 과연 주인공이 될 그릇인지 확인해 보도록 하죠!"
- },
- "victory": {
- "1": "그렇군요… 결국 체크메이트인가요."
- },
- "defeat": {
- "1": "제 평판을 지켜냈네요."
- }
- },
- "drasna": {
- "encounter": {
- "1": "당신 강하시죠? 그것도 상당히 꽤 말이에요…\n$어머 기뻐라! 그런 상대와 놀면 포켓몬들도 쑥쑥 크겠어요!"
- },
- "victory": {
- "1": "어머머 벌써 끝나버리다니… 미안해요, 괜찮으면 또 오세요!"
- },
- "defeat": {
- "1": "어머, 웬일이야?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "자, 여기에서… 승리의 바람이 부는 쪽은 당신과 저 중에 어느 쪽일까요?"
- },
- "victory": {
- "1": "사천왕으로서 분하지만 당신들의 강함은 진정한 강함이군요."
- },
- "defeat": {
- "1": "이것이 에이스니까요!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "맹렬하게 몰아치는 승부의 숨결을 직접 가르쳐 드리겠습니다!!"
- },
- "victory": {
- "1": "이번에는 당신이 승리를 쟁취했군요. \n$하지만, 시합의 흐름을 보니… 다음 승부는 또 어떻게 될지 모르겠네요."
- },
- "defeat": {
- "1": "저에게 더 배우고 싶은 것이 있으시다면 또 승부하도록 하죠."
- }
- },
- "blue": {
- "encounter": {
- "1": "여기까지 왔다니, 실력이 꽤 봐줄만 할 것 같은데."
- },
- "victory": {
- "1": "그 녀석한테만 지는 줄 알았는데… 누구냐고? 하, 하…"
- },
- "defeat": {
- "1": "봤지? 여기까지 온 내 실력."
- }
- },
- "piers": {
- "encounter": {
- "1": "뜨거운 현장을 즐길 준비는 됐겠지! 스파이크 마을, it's time to rock!"
- },
- "victory": {
- "1": "나도 내 멤버들도 최선을 다했어. 다음에 또 배틀하자고…"
- },
- "defeat": {
- "1": "소리를 지르느라 목이 가버렸군… 그렇지만 박진감 넘치는 배틀이었다!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "와… 당신의 포켓몬은 인상적이네요. 재미있을 것 같아요."
- },
- "victory": {
- "1": "당신은 정말 강하네요. 저도 더 열심히 노력해야겠어요."
- },
- "defeat": {
- "1": "이길 줄은 몰랐어요."
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "여전히 난 챔피언이다. 더이상 주저할 게 없군."
- },
- "victory": {
- "1": "새로운 챔피언의 등장이군."
- },
- "defeat": {
- "1": "성공적으로 챔피언 자리를 지켜냈다."
- }
- },
- "steven": {
- "encounter": {
- "1": "넌… 포켓몬과 함께 모험을 하면서 무엇을 봤지? \n$많은 트레이너와 만나면서 무엇을 느꼈지? \n$풍요로운 이 지역을 돌아다니면서, 네 안에서 눈뜨기 시작한 무언가… \n$그 모든 것을 나에게 쏟아부었으면 좋겠어. \n$나와 내 포켓몬들도 전력을 다해 상대해줄 테니까!"
- },
- "victory": {
- "1": "챔피언인 내가 질 줄이야…"
- },
- "defeat": {
- "1": "덕분에 즐거웠어! 고마워!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "나, 난천은, 네 도전을 받아들일게! 온 힘을 다해 너와 시합하겠어!"
- },
- "victory": {
- "1": "포켓몬 배틀보다 재밌는 것은 없지만, 언젠간 끝나기 마련이니…"
- },
- "defeat": {
- "1": "비록 졌어도, 포켓몬에 대한 사랑은 잃지 않도록 해."
- }
- },
- "iris": {
- "encounter": {
- "1": "나는 말이지, 강한 트레이너와의 진지한 승부를 즐겨!\n$왜냐면 그렇잖아! 이곳에 오는 건 마음 깊이 승리를 추구하는 트레이너. \n#함께 싸우는 건 수많은 승부를 헤쳐온 포켓몬.\n$그런 상대와 겨룰 수 있다면 나도! 내 포켓몬도!\n$더욱더 강해지고 서로 알 수 있으니까! 으응! 그럼 간다! \n$포켓몬리그 챔피언 아이리스! 당신을 이기겠습니다!!"
- },
- "victory": {
- "1": "후와아아아… 힘을 모두 발휘했는데도 우리가 졌네."
- },
- "defeat": {
- "1": "우와! 이겼다!"
- }
- },
- "hau": {
- "encounter": {
- "1": "트레이너가 따뜻한 지역 출신인지 추운 지역 출신인지에 따라 배틀 스타일이 달라지는지 궁금해졌어.\n$그럼 테스트 해볼게~!"
- },
- "victory": {
- "1": "멋진데~! 이제 너의 스타일을 조금 더 잘 알게된 것 같아!"
- },
- "defeat": {
- "1": "이런, 그건 그냥 승부였는데~!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "그 도전장, 한 번 더 승낙하도록 하죠. \n$자… 훈련의 결실을 보여주세요."
- },
- "victory": {
- "1": "당신이 이룰 업적에 대한 소식들, 기다리고 있겠습니다!"
- },
- "defeat": {
- "1": "무슨 문제라도 있나요? 이게 전부라니, 그럴리 없잖아요?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "만세! 나 너무 기대돼! 이제 전력으로 승부하는거야~!"
- },
- "victory": {
- "1": "우와, 조금 문제 있지만, 그래도 너무 재밌었어! 다음에는 지지 않을거야!"
- },
- "defeat": {
- "1": "우와, 너무 멋진 승부였어! 정말로 강하네."
- }
- },
- "leon": {
- "encounter": {
- "1": "레츠, 챔피언 타임!!!"
- },
- "victory": {
- "1": "챔피언 타임은 끝났어… \n$하지만 정말 멋진 시간이었지! \n$최고의 시합을 만들어줘서 고맙다!"
- },
- "defeat": {
- "1": "최고의 챔피언 타임이었어, 정말로!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "있지! 포켓몬들 말이야, 정말 너무 귀엽지?"
- },
- "victory": {
- "1": "흑! 으아앙! 너무해!"
- },
- "defeat": {
- "1": "이걸로 끝!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "하! 나에게 도전하겠다고? 용감한 거냐, 아니면 그냥 무모한 거냐?"
- },
- "victory": {
- "1": "자네 강하군! 나를 제자로 삼아주겠나?"
- },
- "defeat": {
- "1": "자. 내가 자네보다 얼마나 더 강력한지 깨달았겠지?"
- }
- },
- "katy": {
- "encounter": {
- "1": "쓰러지고 싶지 않다면 방심하지 말고 열심히 해 봐~"
- },
- "victory": {
- "1": "내 포켓몬들 모두 지쳐서 헤벌레~ 해졌어~"
- },
- "defeat": {
- "1": "비비용~ 많~이 먹으렴~"
- }
- },
- "pryce": {
- "encounter": {
- "1": "젊음만으로는 승리를 보장할 수 없다! 중요한 것은 경험이다."
- },
- "victory": {
- "1": "특출하군! 완벽해. 지금 이 느낌을 잊지 말도록."
- },
- "defeat": {
- "1": "내가 예상했던 그대로군."
- }
- },
- "clair": {
- "encounter": {
- "1": "내가 누군지 알지? 그런데도 감히 내게 도전해?"
- },
- "victory": {
- "1": "네 실력이 어디까지 올라갈 수 있는지 궁금하네. 아주 흥미진진하겠어."
- },
- "defeat": {
- "1": "끝이다."
- }
- },
- "maylene": {
- "encounter": {
- "1": "지금 당신에게 도전하러 왔어요.\n$전력을 다할 테니 각오하세요!"
- },
- "victory": {
- "1": "나의 패배입니다…"
- },
- "defeat": {
- "1": "멋진 승부였습니다."
- }
- },
- "fantina": {
- "encounter": {
- "1": "당신도 도전해 보세요. 전 당신을 이기겠어요.\n$그것이 체육관 관장!"
- },
- "victory": {
- "1": "당신 최고로 강해요. 나 진 것 알아요."
- },
- "defeat": {
- "1": "너무, 너무 행복해요!"
- }
- },
- "byron": {
- "encounter": {
- "1": "젊은 트레이너여! 자네는 내 아들 강석처럼 젊군.\n$젊은 트레이너가 많아질수록, 포켓몬의 미래도 밝지!\n$그러니, 젊은이들이 넘어야할 벽으로서 상대해주겠다!"
- },
- "victory": {
- "1": "흠! 내 견고한 포켓몬이--져버렸군!"
- },
- "defeat": {
- "1": "으하하핫! 내 견고한 포켓몬은 어땠나?!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "이 의식은 앞으로의 길을 정하는 것입니다. 포켓몬 승부를 시작해볼까요!"
- },
- "victory": {
- "1": "당신이라면 별이라도 움직여서 가야 할 길을 만들어 낼 것 같습니다."
- },
- "defeat": {
- "1": "우리의 길은 이제 분명해졌습니다."
- }
- },
- "volkner": {
- "encounter": {
- "1": "여기까지 왔으니, 넌 꽤 강하겠군…\n$네가 내게 포켓몬 승부의 즐거움을 상기시켜 줄 트레이너이길 바란다!"
- },
- "victory": {
- "1": "너 나를 이겼군…\n$네 열정과 포켓몬이 그런 너를 위해 싸워준 고귀한 방식…\n$심지어 스릴까지 넘쳤다. 아주 좋은 승부였어."
- },
- "defeat": {
- "1": "전혀 충격적이지 않았다…\n$이런 건 원하지 않았어!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "으-음… 이번 배틀에서 이기면, 예전과는 다른 그림을 그릴 수 있을 것 같아. \n$맞아! 난 승리 뮤즈의 목소리를 선명하게 들을 수 있거든. 그럼 승부다!",
- "2": "물론, 난 내 포켓몬을 자랑스럽게 생각하거든! \n$자 그럼… 바로 승부할까!"
- },
- "victory": {
- "1": "벌써 끝이라고? 뮤즈가 나를 버리고 떠나버렸나?",
- "2": "아우… 져버렸네! 너 굉장히 강하잖아!"
- },
- "defeat": {
- "1": "우와… 왠지 뭔가 아름답네, 그치…",
- "2": "가끔 사람들이 못난 승리라고 말하는 걸 듣곤 해. \n$그치만 난 최선을 다했다면, 어떤 승리든 아름답다고 생각하거든."
- }
- },
- "elesa": {
- "encounter": {
- "1": "컴플리트…! 확신이 들때면, 내 몸을 통하는 전기가 짜릿짜릿하게 느껴져! \n$그 감각을 느끼고 싶으니까…, 다음은 사랑스러운 포켓몬들로 너를 어질어질하게 할게!"
- },
- "victory": {
- "1": "어질어질하게 만들 셈이였는데, 너한테는 짜릿짜릿하게 당해버렸네."
- },
- "defeat": {
- "1": "왠지 부족한 기분이야… 다음에는 최선을 다할 수 있지?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "드디어 대결의 시간이야! 누가 정상에 오를지 결정짓는 포켓몬 배틀, 그치? \n$난 정상에 있는 게 좋아! 높은 곳에서는 항상 멀리 볼 수 있으니까! \n$그럼, 다음은 나랑 더욱 즐거운 것을 할까?"
- },
- "victory": {
- "1": "배틀에서 네 상대가 되는 거, 뭔가 새로운 모티브가 되네. 고마워!"
- },
- "defeat": {
- "1": "이기든 지든, 항상 무언가를 얻게 돼, 그치?"
- }
- },
- "brycen": {
- "encounter": {
- "1": "다른사람이나 포켓몬과 함께 있을 때도 힘이 생긴다. \n$그 도움을 받는 것이 너를 강하게 만들었겠지. 그 힘을 보이거라!"
- },
- "victory": {
- "1": "너와 포켓몬과! 멋진 콤비네이션! 아름다운 우정!"
- },
- "defeat": {
- "1": "극한에서 시험받고 단련하도록!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "지금 찾는 것은 밝은 미래를 보여줄 젋은 트레이너의 존재. \n$승부에서 모든 걸 보이도록. 네 기술, 내 경험, 그리고 포켓몬을 키워온 사랑도 함께!"
- },
- "victory": {
- "1": "패배하여 끓어오르는 이 마음… 뭐라고 표현해야 좋을까."
- },
- "defeat": {
- "1": "실망스럽군! 난 자네의 능력이 그보다 더 크다는 걸 알고있네!"
- }
- },
- "grant": {
- "encounter": {
- "1": "제가 바라는 것은 단 하나뿐입니다. \n$서로가 서로를 뛰어넘어, 더 높은 벽에 도달하는 것입니다."
- },
- "victory": {
- "1": "내 앞에 솟아 있는 높은 벽… 그건 바로 당신입니다."
- },
- "defeat": {
- "1": "인생에서 중요한 교훈은 간단합니다.\n$포기하지 않는 것.\n$이것이 전부입니다."
- }
- },
- "korrina": {
- "encounter": {
- "1": "코르니 납시오!"
- },
- "victory": {
- "1": "네 존재가 너의 포켓몬을 점점 진화시키고 있어!"
- },
- "defeat": {
- "1": "정말 멋진 배틀이었어!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "아앗! 잘 부탁드립니다!"
- },
- "victory": {
- "1": "당신들의 승부를 향한 마음에 자극을 받았습니다!"
- },
- "defeat": {
- "1": "저의 슈퍼트레이닝 발명품이 효과가 있는 것 같군요!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "어라,트레이너님… 슝슝 워프해서… 이렇게 만나서 반갑네. \n$그리고 내가 보기엔 당신은 노력했기에, 이 승부에 참가할 수 있게 된 것 같아. \n$찾기 힘든 요정 같은 페어리 타입, 우리 포켓몬들 사뿐하고 화사하지만 강하다구."
- },
- "victory": {
- "1": "난 당신이 내일을 생각하며 웃을 수 있는 것들을 찾길 바라고 있을게…"
- },
- "defeat": {
- "1": "앗 이런, 가엾어라…"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "그거 알아? 그거… 전투와 유대감을 통해 배운다거나 하는… 거 뭐더라, 음.\n$여튼 말이지, 난 그냥 재밌어서 하는 거야. \n$내 자랑은 별로 듣고 싶지 않으려나? 자, 포켓몬을 꺼내자!"
- },
- "victory": {
- "1": "그거야, 바로 그거! 멋지다고. 단단한 얼음을 깨부쉈구나!"
- },
- "defeat": {
- "1": "나와 싸우면 그런 일이 벌어진다니까!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "모든 트레이너와 포켓몬은 이기기 위해 훈련을 하고 있다. \n$하지만 싸우는 상대 역시 그만큼 노력하고 있지. \n$ 결국 승부는 실전에서, 얼마만큼 제 실력을 발휘할 수 있느냐에 달렸다."
- },
- "victory": {
- "1": "오늘 너와 싸울 수 있어서 참 기뻤다!"
- },
- "defeat": {
- "1": "내 성장을 체감하게 되는군!"
- }
- },
- "bea": {
- "encounter": {
- "1": "당신은 과연, 어떤 공격에도 흔들리지 않는 마음을 가졌을까요? \n$제가 시험해보겠습니다, 준비는 되셨습니까?"
- },
- "victory": {
- "1": "당신이 데리고 있는 포켓몬에게서 무예의 혼을 느꼈습니다."
- },
- "defeat": {
- "1": "누구나 바랄 법한 최고의 경기였습니다."
- }
- },
- "opal": {
- "encounter": {
- "1": "그럼 너의 파트너 포켓몬 다루는 실력을 내게 보여주거라!"
- },
- "victory": {
- "1": "핑크는 부족하지만, 너희는 좋은 트레이너와 포켓몬이구나."
- },
- "defeat": {
- "1": "내가 보기엔, 불합격이란다."
- }
- },
- "bede": {
- "encounter": {
- "1": "의심할 여지 없이 증명하겠습니다. 당신이 한심한지, 그리고 내가 얼마나 강한지!"
- },
- "victory": {
- "1": "잘 봤습니다… 뭐, 꽤 괜찮네요. 전 그렇게 열심히 하지도 않았으니까요."
- },
- "defeat": {
- "1": "이런 결과, 나쁘지 않군요."
- }
- },
- "gordie": {
- "encounter": {
- "1": "그럼, 빨리 끝내도록 하죠."
- },
- "victory": {
- "1": "구멍이 있다면 들어가고 싶군요… 아니지, 여기선 빠지고 싶다고 해야하나?"
- },
- "defeat": {
- "1": "이런 배틀이라면, 매번 승리가 따라올 것 같네요!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "사실은, 말했던 일들이 해결 되고 나면… 결국은 나 자신이 챔피언이 되고싶다는 걸 알았으니까! \n$그러니까 너의 팀을 기분 좋게 잠들게 해주겠어!"
- },
- "victory": {
- "1": "응, 그래서 내가 졌구나… 그치만 너와 네 포켓몬의 좋은 점을 많이 볼 수 있었어!"
- },
- "defeat": {
- "1": "우리의 배틀 방식을 즐겼길 바라."
- }
- },
- "raihan": {
- "encounter": {
- "1": "챔피언도 쓰러뜨리고, 토너먼트에서도 우승해서, 위대한 나 금랑님이 얼마나 강한지 세계에 증명 해보실까!"
- },
- "victory": {
- "1": "역시 난 진 다음에도 멋있네! \n$조금 분하지만…. \n$기념으로 셀카라도 찍어둘까…!"
- },
- "defeat": {
- "1": "자, 이 순간을 기억하기 위한 셀카를 찍자고."
- }
- },
- "brassius": {
- "encounter": {
- "1": "준비는 됐겠지!? 그럼, 우리 둘의 예술적인 합작품을 한번 만들어 보도록 할까!"
- },
- "victory": {
- "1": "아… 아방가르드!!"
- },
- "defeat": {
- "1": "바로 신작을 만들러 가야 하니 이만 실례하겠다!"
- }
- },
- "iono": {
- "encounter": {
- "1": "자~ 오늘의 각오는~ 모야모야~?\n$...\n$그럼, 이제 시작해 볼까! \n$도전자님의 실력은 과연 과연~!?"
- },
- "victory": {
- "1": "너의 반짝임은 1000만볼트!"
- },
- "defeat": {
- "1": "당신의 눈길을 일렉트릭네트로 뾰로롱!"
- }
- },
- "larry": {
- "encounter": {
- "1": "그렇습니다. 심플한 것이 가장 강한 것입니다!"
- },
- "victory": {
- "1": "허, 이걸로 한 방 먹은 게 되었군요."
- },
- "defeat": {
- "1": "오늘은 저는 이만 실례하겠습니다."
- }
- },
- "ryme": {
- "encounter": {
- "1": "나의 영혼 흔들어 봐 Come On!"
- },
- "victory": {
- "1": "너의 Cool한 Youth 나의 Soul이 Move!"
- },
- "defeat": {
- "1": "Bye Bye Baby~!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "내가 너를 철저하게 얼려 버리면 고민할 것도 없겠지!"
- },
- "victory": {
- "1": "너의 그 열기… 싫지 않아."
- },
- "defeat": {
- "1": "너에겐 아직 열기가 부족하구나."
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "여기까지 왔구나? 포켓몬 다루는 실력 좀 볼까!",
- "2": "최선을 다할 거니까, 쉽게 넘어갈 수 있을 거라고 생각하지 마!"
- },
- "victory": {
- "1": "내가 지다니 믿을 수 없어… 그렇지만 네가 바란 것도 이런 승리였겠지. 잘했어!",
- "2": "난 여전히 배울 게 많은 것 같아. 그래도, 멋진 승부였어!"
- },
- "defeat": {
- "1": "잘 싸웠지만, 내가 위야! 다음에는 더 잘해봐!",
- "2": "트레이닝이 제값을 하는 것 같네. 승부에 응해줘서 고마워!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "조류가 오늘은 내 편인 것 같네. 휩쓸릴 준비 됐어?",
- "2": "이번 승부로 파도를 일으키는 거야! 준비는 됐겠지!"
- },
- "victory": {
- "1": "너 그런 바다를 완벽하게 버텨냈네… 잘했어!",
- "2": "내 쪽의 해류가 너와 맞지 않았던 거 같네. 잘했어!"
- },
- "defeat": {
- "1": "물은 항상 자기 길을 찾아 흐르지. 상쾌한 승부였어!",
- "2": "잘 싸웠지만, 바다의 힘은 막을 수 없다고!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "준비는 되셨겠죠! 제 투지가 불타고 있습니다!",
- "2": "가차 없는 제 속도를 따라잡으실 수 있는지 지켜보겠습니다!"
- },
- "victory": {
- "1": "당신의 힘… 인상적이군요. 정말로 이기실 만합니다.",
- "2": "이런 강렬함은 처음 느껴봅니다. 대단하군요!"
- },
- "defeat": {
- "1": "치열했던 훈련으로 또 한번 승리를 거두게 뒀군요! 고생하셨습니다!",
- "2": "당신도 힘냈겠지만, 제가 더 열심히 훈련했거든요. 좋은 배틀이었습니다!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "그림자가 떨어지네… 두려움에 맞설 준비는 됐어?",
- "2": "내가 다루는 어둠을 감당할 수 있는지 지켜볼게."
- },
- "victory": {
- "1": "너 그림자를 쫓아내 버렸구나… 일단은. 잘했어.",
- "2": "네 빛이 어둠을 관통해 버렸네. 훌륭해."
- },
- "defeat": {
- "1": "그림자가 말했어… 네 힘은 아직 부족한 것 같아.",
- "2": "어둠의 승리… 다음번에는 빛을 보게 될 거야."
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "폭풍이 몰아치는군! 네가 이 배틀에서도 견뎌낼 수 있는지 지켜보겠어!",
- "2": "폭풍의 눈과 마주칠 준비는 됐겠지!"
- },
- "victory": {
- "1": "폭풍을 이겨내다니… 정말 놀라운걸!",
- "2": "너 바람에 완벽하게 올라탔구나… 대단한 승부였어!"
- },
- "defeat": {
- "1": "폭풍을 견디고, 또 다른 승리도 잡아버렸네! 좋은 승부였어!",
- "2": "넌 내 폭풍을 잡아냈잖아! 다음엔 더 잘해봐!"
- }
- },
- "alder": {
- "encounter": {
- "1": "하나지방에서 가장 강한 트레이너를 상대할 준비는 됐나?"
- },
- "victory": {
- "1": "장하구나! 실로 견줄 자가 천하에 없도다!"
- },
- "defeat": {
- "1": "나의 마음에 상쾌한 바람이 지나갔다...\n$정말 대단한 노력이다!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "난 노력을 통해 강해지고 또 강해지지!\n$난 지지 않아."
- },
- "victory": {
- "1": "믿을 수 없어...\n$정말 재밌고 가슴 뛰는 배틀이었어!"
- },
- "defeat": {
- "1": "세상에 마상에! 정말 멋진 배틀이었어!\n$네가 더 열심히 훈련할 시간이야."
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}오, 찾았다! 떠나려는 건 알고 있었지만\n인사정도는 해줄 줄 알았는데…\n$@c{smile_eclosed}그러니까 정말로 꿈을 좇겠다는 거지?\n듣고도 못 믿었다니까.\n$@c{serious_smile_fists}여기까지 온 김에, 배틀은 어때?\n준비가 됐나 보자구.\n$@c{serious_mopen_fists}망설이지 말고,\n너의 진면목을 보여봐!"
- },
- "victory": {
- "1": "@c{shock}와… 정말 깔끔하게 당했네.\n초보자 맞아?\n$@c{smile}운이 따른 건지도 모르겠지만…\n그래도 정말 꿈을 이룰 지도.\n$그나저나, 박사님께서 이걸 전해달라고 하시더라.\n좋아 보이던데.\n$@c{serious_smile_fists}아무튼, 힘 내는거야!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}여깄구나! 찾고 있었어!\n@c{angry_mopen}절친한테 작별인사도 안 하는거야?\n$@c{smile_ehalf}꿈을 향해 떠나는거구나. 그렇지?\n이런 날이 오긴 하네…\n$@c{smile}아무튼, 날 까먹고 가버린 건 용서해주겠어.\n@c{smile_wave_wink}배틀을 해준다면 말야!\n$@c{angry_mopen}최선을 다 해 봐.\n모험을 시작과 동시에 끝내고 싶지 않다면!"
- },
- "victory": {
- "1": "@c{shock}왜 벌써 이렇게 센 건데?!@d{96}\n@c{angry}아니면 뭔가 속임수, 그런 거?\n$@c{smile_wave_wink}농담, 농담!@d{64} @c{smile_eclosed}내가 진 거 맞아…\n너 정말 앞으로도 잘 하겠는데.\n$@c{smile}아 그래, 박사님께서 전해달라던 물건.\n도움이 되면 좋겠어!\n$@c{smile_wave}항상 최선을 다 하라구! 믿고 있을게!"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}어라, 너 여깄었구나?\n@c{smile_eclosed}아직도 전승 중이라, 이거지…?\n$@c{serious_mopen_fists}널 쫓아서 온 것 같아 보이겠지만, 오해야.\n$@c{serious_smile_fists}그래도 솔직히 그 때부터 쭉 재대결이 간절했어.\n$그 동안의 훈련도 있겠다 마침 좋은 기회같지?\n$@c{serious_mopen_fists}자, 전처럼!\n배틀이야!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}이런. 자신감이 과했나봐.\n$@c{smile}그래, 또 지고 말았네.\n@c{serious_mopen_fists}좀 더 열심히 훈련을 해야겠어!\n\n$@c{smile}너한테 도움이 필요할 것 같지는 않지만, 이거.\n남는 게 있어서 말이야.\n$@c{serious_smile_fists}물론 이번이 마지막이야, 알겠지?\n공평하게 하지 않으면 그게 내 핑계거리가 되고 말거야.\n$@c{smile}이제 갈게. 앞으로도 조심하고, 이벤트도 즐겁게 보내!"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}우연이네, 이런 곳에서 만나고.\n아직 연전연승이구나? @c{angry_mopen}나쁘지 않아!\n$@c{angry_mopen}무슨 생각하고있는지 알겠어, 하지만 아냐.\n@c{smile_eclosed}우연히 근처에 있었을 뿐이라구.\n$@c{smile_ehalf}그래도 마침, 가끔은 지는것도 괜찮다고 알려주고 싶었는데.\n$@c{smile}우린 실수를 통해서도 성장할 수 있잖아.\n때로는 성공을 반복할 때보다도 더 많이 말야.\n$@c{angry_mopen}어쨌든간에, 나도 이런 때를 위해 훈련해왔으니까,\n너도 최선을 다 하는게 좋을 거야!"
- },
- "victory": {
- "1": "@c{neutral}이… 번에도 져버릴 줄이야…\n$@c{smile}으, 그래. 더 열심히 훈련하면 되겠지!\n$@c{smile_wave}이것도 하나 더 챙겨왔으니 받아!\n@c{smile_wave_wink}감사 인사는 됐다구~.\n$@c{angry_mopen}하지만, 마지막이야!\n또 이렇게 공짜로 나눠주진 않을 테니까!\n$@c{smile_wave}그럼! 이벤트 잘 즐기고!"
- },
- "defeat": {
- "1": "가끔은 지는 것도 괜찮아…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}이게 누구야! 오랜만이야.\n@c{neutral}역시나… 쭉 이기고 있었구나?\n$@c{neutral_eclosed}상황이 좀… 그렇더라. \n혼자 마을로 돌아가봤자 너 없인 예전같아질 수 없겠지.\n$@c{serious}이기적인 이야기란건 알지만 말해야겠어.\n@c{neutral_eclosed}너 지금 좀 아닌 것 같아.\n$@c{serious}계속 이기기만 하겠다는 건 너무 비현실적이야.\n사람은 원래 꺾여가며 성장하는 거라고.\n$@c{neutral_eclosed}물론 지금까지는 잘 해왔다고 생각하겠지만,\n갈 길이 멀지. @c{neutral}대비는 되어 있어?\n$@c{serious_mopen_fists}그렇다면, 내게 증명해 줘."
- },
- "victory": {
- "1": "@c{angry_mhalf}말도 안 돼… 한시도 쉬지 않고 훈련했는데…\n어째서 전혀 닿을 수 없는거야?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}오랜만이야! 아직도 안 졌구나.\n@c{angry}거슬리게 말야. @c{smile_wave_wink}농담이야!\n$@c{smile_ehalf}하지만 진짜, 고향이 그립진 않아? 집이나… 나는?\n나… 나는, 네가 정말 그리웠어.\n$@c{smile_eclosed}난 너의 꿈과 모든 것을 응원하지만,\n넌 언젠가 패배를 겪게 될 거야.\n$@c{smile}그 땐 언제나처럼 내가 곁에 있어줄게.\n@c{angry_mopen}내가 얼마나 강해졌는지도, 지금 보여 줄 테니까!"
- },
- "victory": {
- "1": "@c{shock}이렇게까지 했는데도… 모자랐던 거야…?\n이러면 정말로 너는 이제 영영…"
- },
- "defeat": {
- "1": "최선을 다 했지.\n집에 갈 시간이야."
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}안녕.\n$잡담은 넘어가자.\n@c{neutral_eclosed}너에게 이기기 위해 찾아왔어. 간단하지.\n$@c{serious_mhalf_fists}이제 잠재력을 끌어내는 법은 확실히 알겠어.\n$@c{smile}잠이나 사회적인 활동들.\n줄일 수 있는 불필요한 시간이 아주 많더라.\n$@c{serious_mopen_fists}오직 승리 뿐이야.\n이제 아무것도 중요하지 않아.\n$@c{neutral_eclosed}나도 이제 더 이상은 지지 않게 됐어.\n@c{smile_eclosed}네 그 철학이 완전히 틀린 건 아니었나봐.\n$@c{angry_mhalf}패배는 약자에게 주어지는 것이고, 난 더 이상 약하지 않아.\n$@c{serious_mopen_fists}준비해."
- },
- "victory": {
- "1": "@c{neutral}너…@d{64} 너 대체 뭐야?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}나야! 날 잊어버리고 있던 건… 아니지?\n$@c{smile}네 업적에 자랑스러워 할 때가 됐어. 축하해!\n하지만 네 여행도 여기까지야.\n$@c{smile_eclosed}너는 나도 모르던 내 안의 무언가를 일깨웠어.\n이제 훈련 말고는 아무것도 하지 않아.\n$@c{smile_ehalf}먹지도 자지도 않고, 그저 하루종일.\n더 강해지고 있어.\n$@c{neutral}사실, 나… 이제 내가 뭔지도 잘 모르겠어.\n$그렇지만 기량만은, 정점에 다다랐지.\n아무도 내게 이길 수 없을거야.\n$그거 알아? 이게 전부 네 덕이야.\n@c{smile_ehalf}감사해야할지 증오해야할지 모르겠네.\n$@c{angry_mopen}준비해."
- },
- "victory": {
- "1": "@c{neutral}너…@d{64} 너 대체 뭐야?"
- },
- "defeat": {
- "1": "$@c{smile}네가 키운 상대야. 자랑스럽지?"
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}다시 만났구나.\n$@c{neutral}모든 걸 되짚어 봤어.\n이 기이함에도 이유가 있더라.\n$@c{neutral_eclosed}널 이기고자 하는 욕구, 아니면 네 꿈…\n이건 그저 더 큰 무언가의 일부일 뿐이었어.\n$@c{serious}개인의 문제가 아니라 세계 전체가 엮인 일이었고…\n@c{serious_mhalf_fists}난 널 한계까지 밀어붙이기 위한 도구였던 거지.\n$@c{neutral_eclosed}내가 잘 쓰였는진 모르겠지만 어쨌든 최선을 다 했고.\n$@c{neutral}끝끝내 도착한 이곳은 끔찍하지만…\n언젠가 와 본 것 같아.\n$@c{serious_mhalf_fists}너도 그렇게 느끼지?\n$@c{serious}…그리고 무언가가 이야기하고 있어.\n오랫동안 세상에 알려져온 무언가가.\n$우리가 함께했던 소중한 시간들은 이제 그저 아득해.\n$@c{neutral_eclosed}실제로 일어난 일이긴 할까?\n$@c{serious_mopen_fists}너는 계속 나아가야 해. 그렇지 않으면 끝나지 않아.\n오직 너만이 할 수 있어.\n$@c{serious_smile_fists}잘 모르겠지만, 하나만은 확실해.\n$@c{serious_mopen_fists}여기서 날 쓰러뜨리지 못한다면, 너에게 기회는 없을거란걸."
- },
- "victory": {
- "1": "@c{smile_eclosed}내 역할은 여기까진 것 같아.\n$하나만 약속해 줘.\n@c{smile}세상을 원래대로 되돌리고 나면, 집으로 돌아오는거야."
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}또 이렇게 만났네.\n$@c{smile_eclosed}나 머릿속이 빙글빙글 도는 것 같아…\n$@c{smile_ehalf}모든 것이 이상하게 보이는 이유.\n분명 뭔가가 있어…\n$@c{smile}너는 너의 꿈이 있고,\n나는 나의 야망이 있지…\n$이 모든것, 우리가 하고 있는 모든 일들이\n더 큰 무언가를 위한 것임을 느낄 수밖에 없어.\n$@c{smile_eclosed}나는 아마 너를…\n한계까지 몰아붙여야 하는 거야.\n$@c{smile_ehalf}잘 해왔는지는 모르겠는데, 최선은 다 했어.\n$이 이상하고 무서운 곳…\n모든게 선명하게 보이고…\n$이건… 오래전부터 세상에 알려져온 전부.\n$@c{smile_eclosed}우리가 함께해온 추억들이, 이제는 거의 떠오르지 않아.\n$@c{smile_ehalf}실제로 일어났던 일일까? 너무 멀게만 느껴지는데…\n$@c{angry_mopen}계속 나아가야 해. 안 그러면, 영원히 끝나지 않을 거야. \n오직 너만이 할 수 있어.\n$@c{smile_ehalf}난… 이 모든게 무슨 의미가 있는지는 잘 모르겠지만…\n이거 하나는 느끼고 있어.\n$@c{neutral}여기서 날 쓰러뜨리지 못한다면, 너에게 기회는 없을거란걸."
- },
- "victory": {
- "1": "@c{smile_ehalf}나… 내 소임을 다 한 기분이야…\n$@c{smile_eclosed}약속해 줘… 세상을 원래대로 되돌리고서… \n집으로… 무사히 돌아오는 거야.\n$@c{smile_ehalf}…고마워."
- }
- }
-}
diff --git a/src/locales/ko/dialogue-final-boss-male.json b/src/locales/ko/dialogue-final-boss-male.json
deleted file mode 100644
index d9b8dfc4526..00000000000
--- a/src/locales/ko/dialogue-final-boss-male.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "드디어 때가 다시 도래했다.\n당도한 연유를 아는가?\n$이미 도달한 적이 있기에 이 자리에 있다.\n셀 수도 없이 많이.\n$아니, 사실 셀 수는 있지.\n정확히 너의 {{cycleCount}}번째다.\n$매 번 태초의 정신으로 되돌아갔을 뿐.\n하지만 어떻게든, 흔적은 남는다.\n$실패만을 반복했을 뿐이지만,\n지금은 네 안에 무언가가 있구나.\n\n$홀로 선 것처럼 보이나, 무언가 이질적인…\n$마침내 그간의 갈망을 해소해주는가?\n수천 년 간 기다려온 도전을?\n$시작하지.",
- "firstStageWin": "그렇군. 정말로 있었어.\n이제 주저할 필요는 없다.\n$실망시키지 않도록.",
- "secondStageWin": "…고무적이군."
-}
\ No newline at end of file
diff --git a/src/locales/ko/dialogue-final-boss-female.json b/src/locales/ko/dialogue-final-boss.json
similarity index 100%
rename from src/locales/ko/dialogue-final-boss-female.json
rename to src/locales/ko/dialogue-final-boss.json
diff --git a/src/locales/ko/dialogue-misc-female.json b/src/locales/ko/dialogue-misc-female.json
deleted file mode 100644
index 8445c5c4810..00000000000
--- a/src/locales/ko/dialogue-misc-female.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}오? 이긴거야?@d{96} @c{smile_eclosed}진즉 알았어야 했는데.\n아무튼, 돌아왔구나.\n$@c{smile}다 끝난거야.@d{64} 네가 굴레를 끝장냈어.\n$@c{serious_smile_fists}네 꿈도 이뤄졌고말야.\n진짜로 한 번도 안 졌잖아.\n$@c{neutral}기억하는 건 우리들 뿐일 모양이지만.@d{96}\n그래도, 괜찮지?\n$@c{serious_smile_fists}오늘의 일은\n너와 나의 마음 속에 항상 함께할 거야.\n$@c{smile_eclosed}여기 구경도 충분히 했으니\n이제 집에 가자.\n$@c{serious_smile_fists}되돌아가서, 다시 배틀을 할 수도 있지 않을까?\n네가 원한다면 말야.",
- "ending_female": "@c{shock}돌아왔구나?@d{32} 그 말은…@d{96} 이겼어?!\n@c{smile_ehalf}그럴 줄 알았다니까.\n$@c{smile_eclosed}물론… 언제나 느껴왔지.\n@c{smile}끝난 거, 맞지? 이 굴레를 말이야.\n$@c{smile_ehalf}네 꿈도 이뤘고 말이야.\n어떻게 한번도 안 졌대?\n$네가 한 일은 나만 기억하게 될 모양이지만.\n@c{angry_mopen}나, 안 까먹어볼 테니까!\n$@c{smile_wave_wink}농담이야!@d{64} @c{smile}절대 안 잊어버릴 거야.@d{32}\n마음 속엔 쭉 남아있을 수 있게.\n$@c{smile_wave}어쨌든,@d{64} 시간이 좀 늦었어…@d{96}\n이런 곳에서 할 말은 아닌가?\n$집에 가자. @c{smile_wave_wink}아마 내일은,\n추억을 되짚어보기 위한 배틀을 해볼 수 있을 거야.",
- "ending_endless": "끝에 도달하신 것을 축하드립니다!\n더 많은 컨텐츠를 기다려주세요.",
- "ending_name": "Devs"
-}
\ No newline at end of file
diff --git a/src/locales/ko/dialogue-misc-male.json b/src/locales/ko/dialogue-misc-male.json
deleted file mode 100644
index 8445c5c4810..00000000000
--- a/src/locales/ko/dialogue-misc-male.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}오? 이긴거야?@d{96} @c{smile_eclosed}진즉 알았어야 했는데.\n아무튼, 돌아왔구나.\n$@c{smile}다 끝난거야.@d{64} 네가 굴레를 끝장냈어.\n$@c{serious_smile_fists}네 꿈도 이뤄졌고말야.\n진짜로 한 번도 안 졌잖아.\n$@c{neutral}기억하는 건 우리들 뿐일 모양이지만.@d{96}\n그래도, 괜찮지?\n$@c{serious_smile_fists}오늘의 일은\n너와 나의 마음 속에 항상 함께할 거야.\n$@c{smile_eclosed}여기 구경도 충분히 했으니\n이제 집에 가자.\n$@c{serious_smile_fists}되돌아가서, 다시 배틀을 할 수도 있지 않을까?\n네가 원한다면 말야.",
- "ending_female": "@c{shock}돌아왔구나?@d{32} 그 말은…@d{96} 이겼어?!\n@c{smile_ehalf}그럴 줄 알았다니까.\n$@c{smile_eclosed}물론… 언제나 느껴왔지.\n@c{smile}끝난 거, 맞지? 이 굴레를 말이야.\n$@c{smile_ehalf}네 꿈도 이뤘고 말이야.\n어떻게 한번도 안 졌대?\n$네가 한 일은 나만 기억하게 될 모양이지만.\n@c{angry_mopen}나, 안 까먹어볼 테니까!\n$@c{smile_wave_wink}농담이야!@d{64} @c{smile}절대 안 잊어버릴 거야.@d{32}\n마음 속엔 쭉 남아있을 수 있게.\n$@c{smile_wave}어쨌든,@d{64} 시간이 좀 늦었어…@d{96}\n이런 곳에서 할 말은 아닌가?\n$집에 가자. @c{smile_wave_wink}아마 내일은,\n추억을 되짚어보기 위한 배틀을 해볼 수 있을 거야.",
- "ending_endless": "끝에 도달하신 것을 축하드립니다!\n더 많은 컨텐츠를 기다려주세요.",
- "ending_name": "Devs"
-}
\ No newline at end of file
diff --git a/src/locales/ko/dialogue-misc.json b/src/locales/ko/dialogue-misc.json
new file mode 100644
index 00000000000..f24fc79ea99
--- /dev/null
+++ b/src/locales/ko/dialogue-misc.json
@@ -0,0 +1,6 @@
+{
+ "ending": "@c{shock}돌아왔구나?@d{32} 그 말은…@d{96} 이겼어?!\n@c{smile_ehalf}그럴 줄 알았다니까.\n$@c{smile_eclosed}물론… 언제나 느껴왔지.\n@c{smile}끝난 거, 맞지? 이 굴레를 말이야.\n$@c{smile_ehalf}네 꿈도 이뤘고 말이야.\n어떻게 한번도 안 졌대?\n$네가 한 일은 나만 기억하게 될 모양이지만.\n@c{angry_mopen}나, 안 까먹어볼 테니까!\n$@c{smile_wave_wink}농담이야!@d{64} @c{smile}절대 안 잊어버릴 거야.@d{32}\n마음 속엔 쭉 남아있을 수 있게.\n$@c{smile_wave}어쨌든,@d{64} 시간이 좀 늦었어…@d{96}\n이런 곳에서 할 말은 아닌가?\n$집에 가자. @c{smile_wave_wink}아마 내일은,\n추억을 되짚어보기 위한 배틀을 해볼 수 있을 거야.",
+ "ending_female": "@c{smile}오? 이긴거야?@d{96} @c{smile_eclosed}진즉 알았어야 했는데.\n아무튼, 돌아왔구나.\n$@c{smile}다 끝난거야.@d{64} 네가 굴레를 끝장냈어.\n$@c{serious_smile_fists}네 꿈도 이뤄졌고말야.\n진짜로 한 번도 안 졌잖아.\n$@c{neutral}기억하는 건 우리들 뿐일 모양이지만.@d{96}\n그래도, 괜찮지?\n$@c{serious_smile_fists}오늘의 일은\n너와 나의 마음 속에 항상 함께할 거야.\n$@c{smile_eclosed}여기 구경도 충분히 했으니\n이제 집에 가자.\n$@c{serious_smile_fists}되돌아가서, 다시 배틀을 할 수도 있지 않을까?\n네가 원한다면 말야.",
+ "ending_endless": "끝에 도달하신 것을 축하드립니다!\n더 많은 컨텐츠를 기다려주세요.",
+ "ending_name": "Devs"
+}
diff --git a/src/locales/ko/dialogue-male.json b/src/locales/ko/dialogue.json
similarity index 100%
rename from src/locales/ko/dialogue-male.json
rename to src/locales/ko/dialogue.json
diff --git a/src/locales/ko/modifier-type.json b/src/locales/ko/modifier-type.json
index 3d282dfffd1..d94837bb0d2 100644
--- a/src/locales/ko/modifier-type.json
+++ b/src/locales/ko/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "{{battleCount}}번의 배틀 동안 더블 배틀이 등장할 확률이 두 배가 된다."
},
- "TempBattleStatBoosterModifierType": {
- "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{tempBattleStatName}}[[가]] 한 단계 증가한다."
+ "TempStatStageBoosterModifierType": {
+ "description": "자신의 모든 포켓몬이 5번의 배틀 동안 {{stat}}[[가]] 한 단계 증가한다."
},
"AttackTypeBoosterModifierType": {
"description": "지니게 하면 {{moveType}}타입 기술의 위력이 20% 상승한다."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "자신의 모든 포켓몬의 레벨이 {{levels}}만큼 상승한다."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "지니게 하면 {{statName}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다."
+ "BaseStatBoosterModifierType": {
+ "description": "지니게 하면 {{stat}} 종족값을 10% 올려준다. 개체값이 높을수록 더 많이 누적시킬 수 있다."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "자신의 포켓몬의 HP를 모두 회복한다."
@@ -248,6 +248,12 @@
"name": "초점렌즈",
"description": "약점이 보이는 렌즈. 지니게 한 포켓몬의 기술이 급소에 맞기 쉬워진다."
},
+ "DIRE_HIT": {
+ "name": "크리티컬커터",
+ "extra": {
+ "raises": "급소율"
+ }
+ },
"LEEK": {
"name": "대파",
"description": "매우 길고 단단한 줄기. 파오리에게 지니게 하면 기술이 급소에 맞기 쉬워진다."
@@ -411,25 +417,13 @@
"description": "메타몽에게 지니게 하면 스피드가 올라가는 이상한 가루. 매우 잘고 단단하다."
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "플러스파워",
"x_defense": "디펜드업",
"x_sp_atk": "스페셜업",
"x_sp_def": "스페셜가드",
"x_speed": "스피드업",
- "x_accuracy": "잘-맞히기",
- "dire_hit": "크리티컬커터"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "공격",
- "DEF": "방어",
- "SPATK": "특수공격",
- "SPDEF": "특수방어",
- "SPD": "스피드",
- "ACC": "명중률",
- "CRIT": "급소율",
- "EVA": "회피율",
- "DEFAULT": "???"
+ "x_accuracy": "잘-맞히기"
},
"AttackTypeBoosterItem": {
"silk_scarf": "실크스카프",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "드래곤메모리",
"DARK_MEMORY": "다크메모리",
"FAIRY_MEMORY": "페어리메모리",
- "BLANK_MEMORY": "빈메모리"
+ "NORMAL_MEMORY": "일반메모리"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/ko/move-trigger.json b/src/locales/ko/move-trigger.json
index 61dffa122a3..2a38bb13b0a 100644
--- a/src/locales/ko/move-trigger.json
+++ b/src/locales/ko/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}}[[는]]\n체력을 깎아서 자신의 기술을 강화했다!",
"absorbedElectricity": "{{pokemonName}}는(은)\n전기를 흡수했다!",
"switchedStatChanges": "{{pokemonName}}[[는]] 상대와 자신의\n능력 변화를 바꿨다!",
+ "switchedTwoStatChanges": "{{pokemonName}} 상대와 자신의 {{firstStat}}과 {{secondStat}}의 능력 변화를 바꿨다!",
+ "switchedStat": "{{pokemonName}} 서로의 {{stat}}를 교체했다!",
+ "sharedGuard": "{{pokemonName}} 서로의 가드를 셰어했다!",
+ "sharedPower": "{{pokemonName}} 서로의 파워를 셰어했다!",
"goingAllOutForAttack": "{{pokemonName}}[[는]]\n전력을 다하기 시작했다!",
"regainedHealth": "{{pokemonName}}[[는]]\n기력을 회복했다!",
"keptGoingAndCrashed": "{{pokemonName}}[[는]]\n의욕이 넘쳐서 땅에 부딪쳤다!",
@@ -61,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}의\n특성이 효과를 발휘하지 못하게 되었다!",
"revivalBlessing": "{{pokemonName}}[[는]]\n정신을 차려 싸울 수 있게 되었다!",
"swapArenaTags": "{{pokemonName}}[[는]]\n서로의 필드 효과를 교체했다!",
- "exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!"
-}
\ No newline at end of file
+ "exposedMove": "{{pokemonName}}[[는]]\n{{targetPokemonName}}의 정체를 꿰뚫어 보았다!",
+ "safeguard": "{{targetName}}[[는]] 신비의 베일이 지켜 주고 있다!"
+}
diff --git a/src/locales/ko/settings.json b/src/locales/ko/settings.json
index b7fc01cb148..c10046385e1 100644
--- a/src/locales/ko/settings.json
+++ b/src/locales/ko/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "터치 컨트롤 이동",
"shopOverlayOpacity": "상점 오버레이 투명도",
"shopCursorTarget": "상점 커서 위치",
- "items": "아이템",
+ "rewards": "아이템",
"reroll": "갱신",
"shop": "상점",
"checkTeam": "파티 확인"
diff --git a/src/locales/pt_BR/achv.json b/src/locales/pt_BR/achv.json
index aee3dd48cc5..93e982b60ea 100644
--- a/src/locales/pt_BR/achv.json
+++ b/src/locales/pt_BR/achv.json
@@ -84,7 +84,7 @@
"100_RIBBONS": {
"name": "Fita de Diamante"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "Trabalho em Equipe",
"description": "Use Baton Pass com pelo menos um atributo aumentado ao máximo"
},
@@ -264,5 +264,9 @@
"FRESH_START": {
"name": "De Primeira!",
"description": "Complete o desafio de novo começo."
+ },
+ "INVERSE_BATTLE": {
+ "name": "A torre da derrotA",
+ "description": "Complete o desafio da Batalha Inversa.\n.asrevnI ahlataB ad oifased o etelpmoC"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/pt_BR/arena-tag.json b/src/locales/pt_BR/arena-tag.json
index 20ef208c8fc..7ab1ecea721 100644
--- a/src/locales/pt_BR/arena-tag.json
+++ b/src/locales/pt_BR/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "O Tailwind de sua equipe acabou!",
"tailwindOnRemoveEnemy": "O Tailwind da equipe adversária acabou!",
"happyHourOnAdd": "Todos foram envolvidos por uma atmosfera alegre!",
- "happyHourOnRemove": "A atmosfera retornou ao normal."
+ "happyHourOnRemove": "A atmosfera retornou ao normal.",
+ "safeguardOnAdd": "O campo de batalha está envolto num véu místico!",
+ "safeguardOnAddPlayer": "Sua equipe se envolveu num véu místico!",
+ "safeguardOnAddEnemy": "A equipe adversária se envolveu num véu místico!",
+ "safeguardOnRemove": "O campo não está mais protegido por Safeguard!",
+ "safeguardOnRemovePlayer": "Sua equipe não está mais protegido por Safeguard!",
+ "safeguardOnRemoveEnemy": "A equipe adversária não está mais protegido por Safeguard!"
}
\ No newline at end of file
diff --git a/src/locales/pt_BR/challenges.json b/src/locales/pt_BR/challenges.json
index 43a40e29b56..8402ad106b6 100644
--- a/src/locales/pt_BR/challenges.json
+++ b/src/locales/pt_BR/challenges.json
@@ -25,5 +25,12 @@
"desc": "Você só pode usar os iniciais originais, como se tivesse acabado de começar o PokéRogue.",
"value.0": "Desligado",
"value.1": "Ligado"
+ },
+ "inverseBattle": {
+ "name": "Batalha Inversa",
+ "shortName": "Inversa",
+ "desc": "Fraquezas e resistências de tipos são invertidas e nenhum tipo é imune a outro tipo.\nDesativa as conquistas de outros desafios.",
+ "value.0": "Desligado",
+ "value.1": "Ligado"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/pt_BR/config.ts b/src/locales/pt_BR/config.ts
index 9d7dee178b6..9e8377149c1 100644
--- a/src/locales/pt_BR/config.ts
+++ b/src/locales/pt_BR/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const ptBrConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/pt_BR/dialogue-double-battle-female.json b/src/locales/pt_BR/dialogue-double-battle-female.json
deleted file mode 100644
index d8c28a51796..00000000000
--- a/src/locales/pt_BR/dialogue-double-battle-female.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "Blue: Ei Red, vamos mostrar do que somos feitos!\n$Red: ...\n$Blue: Este é o poder da Cidade de Pallet!"
- },
- "victory": {
- "1": "Blue: Essa foi uma ótima batalha!\n$Red: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "Red: ...!\n$Blue: Ele nunca fala muito.\n$Blue: Mas não se deixe enganar! Ele é um campeão, afinal!"
- },
- "victory": {
- "1": "Red: ...!\n$Blue: Da próxima vez, vamos vencer você!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "Tate: Está surpreso?\n$Liza: Somos dois líderes de ginásio ao mesmo tempo!\n$Tate: Somos gêmeos!\n$Liza: Não precisamos falar para nos entender!\n$Tate: Duas vezes o poder...\n$Liza: Você consegue lidar com isso?"
- },
- "victory": {
- "1": "Tate: O quê? Nossa combinação foi perfeita!\n$Liza: Parece que precisamos treinar mais..."
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "Liza: Hihihi... Está surpreso?\n$Tate: Sim, somos realmente dois líderes de ginásio ao mesmo tempo!\n$Liza: Este é meu irmão gêmeo Tate!\n$Tate: E esta é minha irmã gêmea Liza!\n$Liza: Não acha que somos uma combinação perfeita?"
- },
- "victory": {
- "1": "Liza: Nós somos...\n$Tate: ...não tão fortes quanto pensávamos?"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "Steven: Wallace, vamos mostrar a eles o poder dos campeões!\n$Wallace: Vamos mostrar o poder de Hoenn!\n$Steven: Vamos lá!"
- },
- "victory": {
- "1": "Steven: Essa foi uma ótima batalha!\n$Wallace: Vamos vencer da próxima vez!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "Steven: Você tem algum Pokémon raro?\n$Wallace: Steven... Estamos aqui para uma batalha, não para mostrar nossos Pokémon.\n$Steven: Ah... Entendi... Vamos lá então!"
- },
- "victory": {
- "1": "Steven: Agora que terminamos a batalha, vamos mostrar nossos Pokémon!\n$Wallace: Steven..."
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "Alder: Somos os treinadores mais fortes de Unova!\n$Iris: Lutas contra treinadores fortes são as melhores!"
- },
- "victory": {
- "1": "Alder: Uau! Você é super forte!\n$Iris: Vamos vencer da próxima vez!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "Iris: Bem-vinda, Desafiante! Eu sou A Campeã de Unova!\n$Alder: Iris, você não está um pouco empolgada demais?"
- },
- "victory": {
- "1": "Iris: Uma derrota como essa não é fácil de engolir...\n$Alder: Mas só ficaremos mais fortes a cada derrota!"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "Marnie: Irmão, vamos mostrar a eles o poder de Spikemuth!\n$Piers: Nós trazemos a escuridão!"
- },
- "victory": {
- "1": "Marnie: Você trouxe luz para nossa escuridão!\n$Piers: Está muito claro..."
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "Piers: Prontos para um show?\n$Marnie: Irmão... Eles estão aqui para lutar, não para cantar..."
- },
- "victory": {
- "1": "Piers: Agora esse foi um ótimo show!\n$Marnie: Irmão..."
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/pt_BR/dialogue-double-battle-male.json b/src/locales/pt_BR/dialogue-double-battle.json
similarity index 93%
rename from src/locales/pt_BR/dialogue-double-battle-male.json
rename to src/locales/pt_BR/dialogue-double-battle.json
index 4c2196de7f6..4d1c7d90c9b 100644
--- a/src/locales/pt_BR/dialogue-double-battle-male.json
+++ b/src/locales/pt_BR/dialogue-double-battle.json
@@ -57,7 +57,8 @@
},
"iris_alder_double": {
"encounter": {
- "1": "Iris: Bem-vindo, Desafiante! Eu sou A Campeã de Unova!\n$Alder: Iris, você não está um pouco empolgada demais?"
+ "1": "Iris: Bem-vindo, Desafiante! Eu sou A Campeã de Unova!\n$Alder: Iris, você não está um pouco empolgada demais?",
+ "1_female": "Iris: Bem-vinda, Desafiante! Eu sou A Campeã de Unova!\n$Alder: Iris, você não está um pouco empolgada demais?"
},
"victory": {
"1": "Iris: Uma derrota como essa não é fácil de engolir...\n$Alder: Mas só ficaremos mais fortes a cada derrota!"
diff --git a/src/locales/pt_BR/dialogue-female.json b/src/locales/pt_BR/dialogue-female.json
deleted file mode 100644
index a25230117e3..00000000000
--- a/src/locales/pt_BR/dialogue-female.json
+++ /dev/null
@@ -1,2691 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "Eai, quer batalhar?",
- "2": "Você também é uma treinadora nova?",
- "3": "Eai, nunca te vi antes. Vamos batalhar!",
- "4": "Acabei de perder, então estou tentando encontrar mais Pokémon.\nEspera! Você parece fraca! Vamos batalhar!",
- "5": "A gente já se conheceu antes? Não lembro muito bem. Enfim, prazer te conhecer!",
- "6": "Beleza! Vamos nessa!",
- "7": "Beleza! Lá vou eu! Vou te mostrar meu poder!",
- "8": "Hahaha... Vou te mostrar o quão incríveis são meus Pokémon!",
- "9": "Sem perder tempo com cumprimentos. Vamos logo, quando estiver pronta!",
- "10": "Não baixe a guarda, ou você pode acabar chorando quando uma criança te vencer.",
- "11": "Eu criei meus Pokémon com muito cuidado. Você não tem permissão para machucá-los!",
- "12": "Que bom que você chegou! Não vai ser fácil daqui pra frente.",
- "13": "As batalhas continuam para sempre! Bem-vinda ao mundo sem fim!"
- },
- "victory": {
- "1": "Uau! Você é forte!",
- "2": "Eu não tive chance, né?",
- "3": "Vou te encontrar de novo quando for mais velho e te vencer!",
- "4": "Ugh. Não tenho mais Pokémon.",
- "5": "Não acredito… NÃO ACREDITO! Como pude de novo…",
- "6": "Não! Eu perdi!",
- "7": "Uau! Você é incrível! Estou surpreso!",
- "8": "Pode ser… Como… Eu e meus Pokémon somos os mais fortes, porém…",
- "9": "Não vou perder da próxima vez! Vamos batalhar de novo algum dia!",
- "10": "Aff! Não vê que sou apenas uma criança? Não foi justo você ir com tudo!",
- "11": "Seus Pokémon são incríveis! Troca comigo!",
- "12": "Me empolguei um pouco antes, mas sobre qual trabalho eu estava falando?",
- "13": "Ahaha! É isso aí! Você já está em casa nesse mundo!"
- }
- },
- "lass": {
- "encounter": {
- "1": "Vamos batalhar, pode ser?",
- "2": "Você parece uma treinadora nova. Vamos batalhar!",
- "3": "Não te reconheço. Que tal uma batalha?",
- "4": "Vamos ter uma batalha Pokémon divertida!",
- "5": "Vou te mostrar como realmente usar Pokémon!",
- "6": "Uma batalha séria começa com um começo sério! Tem certeza que está pronta?",
- "7": "Você só é jovem uma vez. E só tem uma chance em cada batalha. Logo, você será apenas uma memória.",
- "8": "Vai com calma comigo, tá? Mas vou lutar sério!",
- "9": "A escola é chata. Não tenho nada para fazer. Só estou batalhando para passar o tempo."
- },
- "victory": {
- "1": "Isso foi impressionante! Tenho muito a aprender.",
- "2": "Não pensei que você me venceria tão fácil…",
- "3": "Espero que possamos ter uma revanche um dia.",
- "4": "Isso foi incrivelmente divertido! Você me esgotou totalmente…",
- "5": "Você realmente me ensinou uma lição! Você é incrível!",
- "6": "Sério, eu perdi. Isso é, tipo, seriamente deprimente, mas você foi seriamente legal.",
- "7": "Não preciso de memórias como essa. Deletando memória…",
- "8": "Ei! Eu te disse para pegar leve comigo! Mesmo assim, você é legal quando fica séria.",
- "9": "Estou realmente cansando de batalhar… Deve haver algo novo para fazer…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "Pokémon obedientes, Pokémon egoístas… Pokémon têm características únicas.",
- "2": "Embora minha criação e comportamento sejam ruins, criei meus Pokémon bem.",
- "3": "Hmm, você disciplina seus Pokémon? Mimar demais não é bom."
- },
- "victory": {
- "1": "É importante nutrir e treinar as características de cada Pokémon.",
- "2": "Ao contrário do meu lado diabólico, esses são bons Pokémon.",
- "3": "Muito elogio pode estragar tanto Pokémon quanto pessoas."
- },
- "defeat": {
- "1": "Você não deve ficar com raiva dos seus Pokémon, mesmo se perder uma batalha.",
- "2": "Certo? Pokémon bons, né? Eu sou adequado para criar coisas.",
- "3": "Não importa o quanto você ame seus Pokémon, ainda precisa discipliná-los quando se comportam mal."
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "Pokémon nunca te traem. Eles retribuem todo o amor que você dá a eles.",
- "2": "Quer uma dica para treinar bons Pokémon?",
- "3": "Eu criei esses Pokémon muito especiais usando um método especial."
- },
- "victory": {
- "1": "Ugh… Não era para ser assim. Será que administrei a mistura errada?",
- "2": "Como isso aconteceu com meus Pokémon… O que você está dando de comer aos seus Pokémon?",
- "3": "Se eu perder, isso significa que eu estava só matando o tempo. Não machuca meu ego nem um pouco."
- },
- "defeat": {
- "1": "Isso prova que meus Pokémon aceitaram meu amor.",
- "2": "O verdadeiro truque para treinar bons Pokémon é capturar bons Pokémon.",
- "3": "Pokémon serão fortes ou fracos dependendo de como você os cria."
- }
- },
- "fisherman": {
- "encounter": {
- "1": "Anem! Você me fez perder uma fisgada!\nO que vai fazer sobre isso?",
- "2": "Sai daqui! Você está assustando os Pokémon!",
- "3": "Vamos ver se você consegue fisgar uma vitória!"
- },
- "victory": {
- "1": "Esqueça isso.",
- "2": "Da próxima vez, eu vou pescar a vitória!",
- "3": "Acho que subestimei a força das correntes dessa vez."
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "Uau! Peguei um grande!",
- "2": "Linha lançada, pronta para pescar o sucesso!",
- "3": "Pronta para fazer ondas!"
- },
- "victory": {
- "1": "Vou voltar com um anzol mais forte.",
- "2": "Vou pescar a vitória na próxima vez.",
- "3": "Estou só afiando meus anzóis para a revanche!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "Hora de mergulhar!",
- "2": "Vamos surfar nas ondas da vitória!",
- "3": "Pronto para fazer um splash!"
- },
- "victory": {
- "1": "Molhado na derrota!",
- "2": "Uma onda de derrota!",
- "3": "De volta à praia, eu acho."
- }
- },
- "backpacker": {
- "encounter": {
- "1": "Prepare-se, vamos começar!",
- "2": "Vamos ver se você consegue acompanhar!",
- "3": "Prepare-se, desafiante!",
- "4": "Passei 20 anos tentando me encontrar… Mas onde estou?"
- },
- "victory": {
- "1": "Dessa vez tropecei!",
- "2": "Ah, acho que estou perdido.",
- "3": "Caminho sem saída!",
- "4": "Espere um segundo! Ei! Você não sabe quem eu sou?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "Você parece bastante confiante.",
- "2": "Seus Pokémon… Mostre-os para mim…",
- "3": "Como sou um Treinador Ás, as pessoas acham que sou forte.",
- "4": "Você sabe o que é preciso para ser um Treinador Ás?"
- },
- "victory": {
- "1": "Sim… Você tem bons Pokémon…",
- "2": "O quê?! Mas sou um gênio das batalhas!",
- "3": "Claro, você é a personagem principal!",
- "4": "OK! OK! Você poderia ser uma Treinador Ás!"
- },
- "defeat": {
- "1": "Estou dedicando corpo e alma às batalhas de Pokémon!",
- "2": "Tudo dentro das minhas expectativas… Nada para se surpreender…",
- "3": "Eu achava que cresceria para ser uma pessoa frágil que parecia que quebraria se você apertasse muito.",
- "4": "Claro que sou forte e não perco. É importante ganhar com graça."
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "Hora de embelezar o campo de batalha com elegância e postura!"
- },
- "victory": {
- "1": "Minha elegância permanece inabalável!"
- }
- },
- "twins": {
- "encounter": {
- "1": "Prepare-se, porque quando nos unimos, é o dobro do problema!",
- "2": "Dois corações, uma estratégia – vamos ver se você consegue acompanhar nosso poder de gêmeos!",
- "3": "Espero que esteja pronta para o dobro do problema, porque estamos prestes a causar!"
- },
- "victory": {
- "1": "Podemos ter perdido essa rodada, mas nosso vínculo permanece inquebrável!",
- "2": "Nosso espírito de gêmeos não será apagado por muito tempo.",
- "3": "Voltaremos mais fortes como uma dupla dinâmica!"
- },
- "defeat": {
- "1": "O poder dos gêmeos reina supremo!",
- "2": "Dois corações, um triunfo!",
- "3": "Dobro de sorrisos, dobro da dança da vitória!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "Prepare-se para comer poeira!",
- "2": "Prepare-se, desafiante! Estou prestes a te deixar para trás!",
- "3": "Pé no pedal, vamos ver se você consegue acompanhar!"
- },
- "victory": {
- "1": "As rodas podem estar paradas, mas a determinação continua a pedalar.",
- "2": "Fui mais rápido!",
- "3": "O caminho para a vitória tem muitas curvas e voltas para explorar."
- }
- },
- "black_belt": {
- "encounter": {
- "1": "Elogio sua coragem ao me desafiar! Pois eu sou o que tem o chute mais forte!",
- "2": "Oh, entendo. Você gostaria de ser cortada em pedaços? Ou prefere o papel de saco de pancadas?"
- },
- "victory": {
- "1": "Oh. Os Pokémon fizeram a luta. Meu chute forte não ajudou em nada.",
- "2": "Hmmm… Se eu ia perder de qualquer maneira, esperava ficar totalmente destruído no processo."
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "Você não precisa tentar me impressionar. Você pode perder contra mim."
- },
- "victory": {
- "1": "É difícil dizer adeus, mas estamos ficando sem tempo…"
- }
- },
- "hiker": {
- "encounter": {
- "1": "Minha barriga de meia-idade me deu tanta gravidade quanto as montanhas que eu escalo!",
- "2": "Herdei esse corpo ossudo dos meus pais… Sou como uma cadeia de montanhas viva…"
- },
- "victory": {
- "1": "Pelo menos não posso perder quando se trata de IMC!",
- "2": "Não é suficiente… Nunca é suficiente. Meu colesterol ruim não está alto o suficiente…"
- }
- },
- "ranger": {
- "encounter": {
- "1": "Quando estou cercado pela natureza, a maioria das outras coisas deixa de importar.",
- "2": "Quando estou vivendo sem natureza na minha vida, às vezes sinto uma crise de ansiedade se aproximando."
- },
- "victory": {
- "1": "Não importa para a vastidão da natureza se eu ganhar ou perder…",
- "2": "Algo assim é bastante trivial comparado aos sentimentos sufocantes da vida na cidade."
- },
- "defeat": {
- "1": "Ganhei a batalha. Mas a vitória não é nada comparada à vastidão da natureza…",
- "2": "Tenho certeza de que como você se sente não é tão ruim se comparar aos meus ataques de ansiedade…"
- }
- },
- "scientist": {
- "encounter": {
- "1": "Minha pesquisa levará este mundo à paz e alegria."
- },
- "victory": {
- "1": "Sou um gênio… Não devo perder para alguém como você…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "Heehee. Estou confiante nos meus cálculos e análises.",
- "2": "Estou ganhando o máximo de experiência que posso porque quero ser um Líder de Ginásio um dia."
- },
- "victory": {
- "1": "Aff… Cálculo e análise talvez não sejam páreo para o acaso…",
- "2": "Até experiências difíceis e desafiadoras têm seu propósito, eu acho."
- }
- },
- "artist": {
- "encounter": {
- "1": "Eu costumava ser popular, mas agora estou acabado."
- },
- "victory": {
- "1": "À medida que os tempos mudam, os valores também mudam. Percebi isso tarde demais."
- }
- },
- "guitarist": {
- "encounter": {
- "1": "Prepare-se para sentir o ritmo da derrota enquanto eu toco minha vitória!"
- },
- "victory": {
- "1": "Silenciado por agora, mas minha melodia de resiliência continuará a tocar."
- }
- },
- "worker": {
- "encounter": {
- "1": "Me incomoda que as pessoas sempre me entendam mal. Sou muito mais puro do que todos pensam."
- },
- "victory": {
- "1": "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho."
- }
- },
- "worker_female": {
- "encounter": {
- "1": "Me incomoda que as pessoas sempre me entendam mal.\n$Sou muito mais pura do que todos pensam."
- },
- "victory": {
- "1": "Eu realmente não quero que minha pele queime, então quero ficar na sombra enquanto trabalho."
- },
- "defeat": {
- "1": "Meu corpo e mente nem sempre estão necessariamente em sincronia."
- }
- },
- "worker_double": {
- "encounter": {
- "1": "Vou te mostrar que podemos te quebrar. Estamos treinando no campo!"
- },
- "victory": {
- "1": "Que estranho… Como isso pode ser… Não deveria ter sido superado."
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "Normalmente, só escuto música clássica, mas se eu perder, acho que vou tentar um pouco de new age!",
- "2": "Eu fico mais forte a cada lágrima que derramo."
- },
- "victory": {
- "1": "É o início da era de Aquário?",
- "2": "Agora posso ficar ainda mais forte. Cresço com cada rancor."
- },
- "defeat": {
- "1": "New age se refere simplesmente aos compositores clássicos do século XX, certo?",
- "2": "Não fique presa na tristeza ou frustração. Você pode usar seus rancores para se motivar."
- }
- },
- "psychic": {
- "encounter": {
- "1": "Oi! Concentre-se!"
- },
- "victory": {
- "1": "Perdi minha concentração!"
- }
- },
- "officer": {
- "encounter": {
- "1": "Prepare-se, porque a justiça está prestes a ser servida!",
- "2": "Pronto para defender a lei e servir a justiça no campo de batalha!"
- },
- "victory": {
- "1": "O peso da justiça parece mais pesado do que nunca…",
- "2": "As sombras da derrota pairam no distrito."
- }
- },
- "beauty": {
- "encounter": {
- "1": "Minha última batalha… É assim que eu gostaria que víssemos esta partida…"
- },
- "victory": {
- "1": "Foi divertido… Vamos ter outra última batalha algum dia…"
- }
- },
- "baker": {
- "encounter": {
- "1": "Espero que esteja pronta para saborear a derrota!"
- },
- "victory": {
- "1": "Vou assar uma revanche."
- }
- },
- "biker": {
- "encounter": {
- "1": "Hora de acelerar e te deixar na poeira!"
- },
- "victory": {
- "1": "Vou me ajustar para a próxima corrida."
- }
- },
- "firebreather": {
- "encounter": {
- "1": "Minhas chamas irão te consumir!",
- "2": "Minha alma está pegando fogo. Irei te mostrar como queima!",
- "3": "Cola aqui e dá uma olhada!"
- },
- "victory": {
- "1": "Fui reduzido a cinzas…",
- "2": "Uau! Isso foi quente!",
- "3": "Ai! Queimei minha língua!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "Mano, você vai andar na prancha se perder!",
- "2": "Vem com tudo! Sou um marinheiro com orgulho!",
- "3": "Ahoy maruja! Tá enjoada, é?!"
- },
- "victory": {
- "1": "Argh! Perdi pra uma criança!",
- "2": "Sua vontade de ganhar me afogou!",
- "3": "Estou achando que quem tá enjoado sou eu..."
- }
- },
- "archer": {
- "encounter": {
- "1": "Antes de você ir mais longe, vamos ver como você se sai contra nós, Equipe Rocket!",
- "2": "Eu tenho recebido relatórios de que suas habilidades não são insignificantes. Vamos ver se são verdadeiros.",
- "3": "Eu sou Archer, um Admin da Equipe Rocket. E não tenho piedade dos inimigos da nossa organização."
- },
- "victory": {
- "1": "Que vexame!",
- "2": "Com minhas habilidades atuais, eu não estava à altura da tarefa, afinal.",
- "3": "M-me perdoe, Giovanni... Por ser derrotado por um mero treinador..."
- }
- },
- "ariana": {
- "encounter": {
- "1": "Pera aí! Não podemos deixar alguém solto por aí. Isso é prejudicial para o orgulho da Equipe Rocket, entende?",
- "2": "Eu não sei ou me importo se o que estou fazendo é certo ou errado... Eu apenas coloco minha fé em Giovanni e faço o que me é dito.",
- "3": "Sua viagem termina aqui. Vou te derrubar!"
- },
- "victory": {
- "1": "Uau, você é forte. Que desperdício. Se você se juntasse à Equipe Rocket, poderia se tornar uma Executiva.",
- "2": "Eu... Eu estou arrasada...",
- "3": "Aaaieeeee! Isso não pode estar acontecendo! Eu lutei muito, mas ainda perdi…"
- }
- },
- "proton": {
- "encounter": {
- "1": "O que você quer? Se você interromper nosso trabalho, não espere misericórdia!",
- "2": "O que temos aqui? Costumam me chamar de o cara mais assustador e cruel da Equipe Rocket… Eu recomendo fortemente que você não interfira nos nossos negócios!",
- "3": "Eu sou Proton, um Admin da Equipe Rocket. Estou aqui para acabar com a sua intromissão!"
- },
- "victory": {
- "1": "A fortaleza caiu!",
- "2": "Você pode ter vencido desta vez… Mas tudo o que fez foi aumentar a ira da Equipe Rocket…",
- "3": "Fui derrotado… Mas não esquecerei disso!"
- }
- },
- "petrel": {
- "encounter": {
- "1": "Muhahaha, estávamos esperando por você. Eu? Você não sabe quem eu sou? Sou eu, Giovanni. O majestoso Giovanni em pessoa! Wahahaha! ...Huh? Eu não pareço nada com Giovanni? Eu nem mesmo pareço com Giovanni? Como assim? Trabalhei tanto para imitá-lo!",
- "2": "Eu sou Petrel, um Admin da Equipe Rocket. Não permitirei que você interfira em nossos planos!",
- "3": "O Executivo da Rocket, Petrel, vai lidar com este intruso!"
- },
- "victory": {
- "1": "OK, OK. Vou te contar onde ele está.",
- "2": "Eu... Eu não consegui fazer nada... Giovanni, por favor, me perdoe...",
- "3": "Não, eu não posso deixar isso me afetar. Tenho que informar os outros…"
- }
- },
- "tabitha": {
- "encounter": {
- "1": "Hehehe! Então você veio até aqui! Mas você chegou tarde demais!",
- "2": "Hehehe... Já chegou aqui, não é? Nós subestimamos você! Mas é isso! Eu sou um passo acima dos Capangas que você viu até agora. Não estou ganhando tempo. Vou te pulverizar!",
- "3": "Vou te dar um gostinho da dor! Resigne-se a isso!"
- },
- "victory": {
- "1": "Hehehe! Você pode ter me derrotado, mas não tem chance contra o Chefe! Se você se perder agora, não terá que enfrentar uma surra sonora!",
- "2": "Hehehe... Então, eu também perdi...",
- "3": "Ahya! Como isso pode ser? Para um Admin como eu perder para uma treinadora qualquer..."
- }
- },
- "courtney": {
- "encounter": {
- "1": "A coisa... A coisa que você segura... É o que... É o que nós da Equipe Magma procuramos...",
- "2": "... Bem então... Deletando...",
- "3": "...Ha. ...Analisando... ...Hah♪"
- },
- "victory": {
- "1": "... ...Mudar...o mundo.",
- "2": "Como antecipado. Não antecipado. Você. Bloqueio de alvo... concluído. Iniciando... experimento. Você. Para sempre. Aha... ♪",
- "3": "... De novo? Isso não foi antecipado. ...Eu sabia. Você... é interessante! ...Haha. ♪"
- }
- },
- "shelly": {
- "encounter": {
- "1": "Ahahahaha! Você vai se meter nos assuntos da Equipe Aqua? Você é absolutamente destemida, simplesmente ignorante ou ambos! Você é tão fofa que chega a ser nojenta! Vou te derrubar",
- "2": "O que é isso? Quem é essa criança mimada?",
- "3": "Relaxe. Seja paciente. Vou te esmagar em breve."
- },
- "victory": {
- "1": "Ahahahaha! Fomos surpreendidos inesperadamente! Estamos sem opções. Teremos que recuar. Mas esta não é a última vez que você verá a Equipe Aqua! Temos outros planos! Não se esqueça disso!",
- "2": "Ahhh?! Fui muito fácil com você?!",
- "3": "Uh. Você está me dizendo que melhorou seu jogo ainda mais durante a luta? Você é uma pirralha com um futuro brilhante… Meu Pokémon e eu não temos mais forças para lutar… Vá em frente… Vá e seja destruída por Archie."
- }
- },
- "matt": {
- "encounter": {
- "1": "Hoohahaha! O que, você tem um parafuso solto ou algo assim? Olhe para você, pequena pessoa Makuhita!",
- "2": "Oho! Você! Você é aquela criança engraçada!",
- "3": "O que você está fazendo aqui? Você nos seguiu?"
- },
- "victory": {
- "1": "Muito bem, até que o Chefe tenha tempo para você, serei seu oponente!",
- "2": "Posso sentir! Posso sentir, tudo bem! A força saindo de você! Mais! Eu ainda quero mais! Mas parece que estamos sem tempo...",
- "3": "Isso foi divertido! Eu sabia que você me mostraria um bom tempo! Estou ansioso para enfrentá-la novamente algum dia!"
- }
- },
- "mars": {
- "encounter": {
- "1": "Sou Mars, uma das principais Comandantes da Equipe Galáctica.",
- "2": "A visão da Equipe Galáctica para o futuro é inabalável. A oposição será esmagada sem piedade!",
- "3": "Sentindo-se nervosa? Você deveria estar!"
- },
- "victory": {
- "1": "Isso não pode estar acontecendo! Como eu perdi?!",
- "2": "Você tem alguma habilidade, eu admito isso.",
- "3": "Derrotada... Este foi um erro caro."
- }
- },
- "jupiter": {
- "encounter": {
- "1": "Júpiter, Comandante da Equipe Galáctica, ao seu serviço.",
- "2": "A resistência é inútil. A Equipe Galáctica prevalecerá!",
- "3": "Você está tremendo... já está com medo?"
- },
- "victory": {
- "1": "De jeito nenhum... Eu perdi?!",
- "2": "Impressionante, você tem coragem!",
- "3": "Perder assim... Que embaraço."
- }
- },
- "saturn": {
- "encounter": {
- "1": "Eu sou Saturno, Comandante da Equipe Galáctica.",
- "2": "Nossa missão é absoluta. Qualquer obstáculo será obliterado!",
- "3": "É medo o que vejo em seus olhos?"
- },
- "victory": {
- "1": "Impossível... Derrotado por você?!",
- "2": "Você provou ser um adversário digno.",
- "3": "Derrotado... Isso é inaceitável."
- }
- },
- "zinzolin": {
- "encounter": {
- "1": "Você poderia se tornar uma ameaça para a Equipe Plasma, então vamos eliminá-la aqui e agora!",
- "2": "Oh, pelo amor de Deus... Eu não esperava ter que lutar neste frio congelante!",
- "3": "Você é uma treinadora impressionante para ter chegado tão longe. Mas termina aqui."
- },
- "victory": {
- "1": "Ghetsis... Eu falhei com você...",
- "2": "Está amargamente frio. Estou tremendo. Estou sofrendo. Ainda assim, estou vitorioso.",
- "3": "Hmph. Você é uma treinadora mais esperta do que eu esperava, mas não esperta o suficiente."
- }
- },
- "rood": {
- "encounter": {
- "1": "Você é uma ameaça para a Equipe Plasma. Não podemos deixá-la ir embora daqui e agora!",
- "2": "Oh, este vento gelado... Eu nunca pensei que teria que lutar aqui!",
- "3": "Você é uma treinadora notável para ter chegado tão longe. Mas é aqui que termina."
- },
- "victory": {
- "1": "Ghetsis... Eu falhei em minha missão...",
- "2": "O frio é penetrante. Estou tremendo. Estou sofrendo. Ainda assim, triunfei.",
- "3": "Hm. Você é uma treinadora talentosa, mas infelizmente não talentosa o suficiente."
- }
- },
- "xerosic": {
- "encounter": {
- "1": "Ah ha ha! Será um prazer. Vamos lá, pequena treinadora! Vamos ver o que você tem!",
- "2": "Hmm... Você é mais poderosa do que parece. Eu me pergunto quanta energia há dentro de você.",
- "3": "Eu estava esperando por você! Preciso fazer uma pequena pesquisa sobre você! Vamos começar!"
- },
- "victory": {
- "1": "Ah, você é bastante forte. Oh sim—muito forte, de fato.",
- "2": "Ding-ding-ding! Você conseguiu! À vencedora, os despojos!",
- "3": "Maravilhoso! Incrível! Você tem uma tremenda habilidade e coragem!"
- }
- },
- "bryony": {
- "encounter": {
- "1": "Eu sou Bryony, e será um prazer lutar com você. Mostre-me o que você tem.",
- "2": "Impressionante... Você é mais poderosa do que parece. Vamos ver a verdadeira extensão de sua energia.",
- "3": "Eu antecipei sua chegada. É hora de um pequeno teste. Vamos começar?"
- },
- "victory": {
- "1": "Você é bastante forte. Oh sim—muito forte, de fato.",
- "2": "Ding-ding-ding! Você se saiu bem. A vitória é sua.",
- "3": "Maravilhoso! Notável! Sua habilidade e coragem são admiráveis."
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "Se prepara pra encrenca!",
- "2": "Estamos realizando um grande trabalho aqui! Cai fora, garota!",
- "3": "Entregue seus Pokémon ou enfrente a ira da Equipe Rocket!",
- "4": "Você está prestes a experimentar o verdadeiro terror da Equipe Rocket!",
- "5": "Ei, garota! Eu sou um tipo de cara da Equipe Rocket!"
- },
- "victory": {
- "1": "Equipe Rocket decolando de novo!",
- "2": "Oh não! Eu deixei a Chave de Elevação cair!",
- "3": "Eu estraguei tudo!",
- "4": "Meus associados não vão tolerar isso!",
- "5": "Você diz o que? Equipe Rocket tchau-tchau a vai-vai? Quebrado é diz você?"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": "Se você se meter com a Equipe Magma, não teremos piedade!",
- "2": "É melhor você não interferir em nossos planos! Estamos tornando o mundo um lugar melhor!",
- "3": "Você está no caminho! A Equipe Magma não tem tempo para crianças como você!",
- "4": "Espero que você tenha trazido marshmallows porque as coisas estão prestes a esquentar!",
- "5": "Vamos usar o poder de um vulcão! Vai ser... explosivo! Entendeu? Heh heh!"
- },
- "victory": {
- "1": "Ahn? Eu perdi?!",
- "2": "Não posso acreditar que perdi! Até pulei o almoço por isso.",
- "3": "De jeito nenhum! Você é apenas uma criança!",
- "4": "Urrrgh... Eu deveria ter me escondido em nosso esconderijo imediatamente...",
- "5": "Você me venceu... Você acha que o chefe vai cortar meu salário por isso?"
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "Não pegamos leve com quem se mete com a Equipe Aqua, nem mesmo crianças!",
- "2": "Grrr... Você tem coragem de se intrometer com a Equipe Aqua!",
- "3": "Você está prestes a se molhar! E não apenas por causa dos meus Pokémon aquáticos!",
- "4": "Nós, da Equipe Aqua, existimos para o bem de todos!",
- "5": "Prepare-se para ser levado pelas ondas do meu... uh, Pokémon! Sim, meu Pokémon!"
- },
- "victory": {
- "1": "Tá de brincadeira!",
- "2": "Arrgh, eu não contei que seria atrapalhado por uma criança intrometida!",
- "3": "Eu perdi?! Acho que vou ter que nadar de volta para o esconderijo agora...",
- "4": "Oh, cara, que desastre... O chefe vai ficar furioso...",
- "5": "Você me venceu... Você acha que o chefe vai me fazer andar na prancha por isso?"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "Não mexa com a Equipe Galáctica!",
- "2": "Presencie o poder da nossa tecnologia e o futuro que vislumbramos!",
- "3": "Em nome da Equipe Galáctica, eliminarei qualquer um que ficar em nosso caminho!",
- "4": "Prepare-se para perder!",
- "5": "Espero que você esteja pronta para uma surra cósmica!"
- },
- "victory": {
- "1": "Fui amassado...",
- "2": "Este contratempo não significa nada no grande esquema.",
- "3": "Nossos planos são maiores que esta derrota.",
- "4": "Como?!",
- "5": "Nota para mim mesmo: praticar batalhas Pokémon, o mais rápido possível."
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "Não toleramos pessoas que pensam diferente de nós!",
- "2": "Se eu ganhar de você, liberte seus Pokémon!",
- "3": "Se você atrapalhar a Equipe Plasma, eu cuidarei de você!",
- "4": "A Equipe Plasma vai libertar os Pokémon de humanos egoístas como você!",
- "5": "Nossos penteados são de outro mundo... mas nossas habilidades de batalha? Você descobrirá em breve."
- },
- "victory": {
- "1": "Plasmaaaaaaaaa!",
- "2": "Como eu pude perder...",
- "3": "...Que Pokémon fraco, vou ter que roubar alguns melhores!",
- "4": "Grandes planos são sempre interrompidos.",
- "5": "Isso é ruim... Ruim ruim ruim ruim ruim ruim ruim! Ruim para a Equipe Plasma! Ou Plasruim, para abreviar!"
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "Seus Pokémon não são páreo para a elegância da Equipe Flare.",
- "2": "Espero que você tenha trazido seus óculos de sol, porque as coisas vão ficar brilhantes!",
- "3": "A Equipe Flare vai purificar o mundo da imperfeição!",
- "4": "Prepare-se para enfrentar o brilho da Equipe Flare!",
- "5": "A moda é o mais importante para nós!"
- },
- "victory": {
- "1": "O futuro não parece brilhante para mim.",
- "2": "Talvez haja mais na batalha do que eu pensei. De volta à prancheta.",
- "3": "Gahh?! Eu perdi?!",
- "4": "Mesmo na derrota, a elegância da Equipe Flare brilha.",
- "5": "Você pode ter me vencido, mas quando eu perco, eu saio com estilo!"
- }
- },
- "aether_grunt": {
- "encounter": {
- "1": "Eu vou lutar com tudo o que tenho para te eliminar!",
- "2": "Eu não me importo se você é uma criança ou o que. Eu vou te mandar voando se você nos ameaçar!",
- "3": "Me mandaram afastar Treinadores, não importa quem sejam!",
- "4": "Eu vou te mostrar o poder do Paraíso Aether!",
- "5": "Agora que você descobriu a escuridão no coração do Paraíso Aether, precisamos que você desapareça convenientemente!"
- },
- "victory": {
- "1": "Aff! Você parece ter muita habilidade.",
- "2": "O que isso significa? O que isso significa!",
- "3": "Ei! Você é tão forte que não há como eu te afastar!",
- "4": "Hmm... Parece que eu posso ter perdido.",
- "5": "Aqui está uma resposta para você: Aiyee!"
- }
- },
- "faba": {
- "encounter": {
- "1": "Eu, o Chefe de Ramo Faba, vou te mostrar a dureza do mundo real!",
- "2": "O homem chamado de última linha de defesa do Paraíso Aether vai batalhar com uma mera criança?",
- "3": "Eu, Faba, sou o Chefe de Ramo do Paraíso Aether. O único no mundo, eu sou insubstituível."
- },
- "victory": {
- "1": "Aiyee!",
- "2": "C-c-como assim?! Como uma criança...",
- "3": "Isso é por que... Isso é por que eu não consigo gostar de crianças."
- }
- },
- "skull_grunt": {
- "encounter": {
- "1": "Nós não somos maus, somos apenas durões!",
- "2": "Quer um pouco de nós? É assim que dizemos olá! Prazer em conhecê-los, otários!",
- "3": "Somos só um bando de caras e minas com um grande interesse nos Pokémon dos outros!",
- "4": "Por que você está tentando agir durão quando já somos durões como ossos aqui fora, mano?",
- "5": "Equipe Skull na área! Não podemos pagar o aluguel! Nos divertimos muito, mas nossa juventude foi desperdiçada!"
- },
- "victory": {
- "1": "Ahn? Já acabou?",
- "2": "Hora de dar o fora, mano! Vamos ter que dizer tchau, mano!",
- "3": "Nem precisamos dos seus Pokémon fracotes mesmo!",
- "4": "Que?! Esse muleque é muito forte! Não tem como negar!",
- "5": "Então, o que? Eu sou pior que um Pokémon?! Eu já tenho problemas de autoestima, cara."
- }
- },
- "plumeria": {
- "encounter": {
- "1": " ...Hmph. Você não parece nada especial para mim.",
- "2": "Esses Capangas gastam muito tempo tentando lidar com crianças como você...",
- "3": "Mexe com qualquer um da Equipe Skull, e eu vou te mostrar o quão séria eu posso ficar."
- },
- "victory": {
- "1": "Aff! Você é bem forte. Tenho que admitir.",
- "2": "Aff! Você é bem forte. Agora eu entendi por que meus Capangas gastam tanto tempo batalhando com crianças.",
- "3": "Aff! Acho que eu só tenho que aceitar essa derrota."
- }
- },
- "macro_grunt": {
- "encounter": {
- "1": "Parece que aqui é o fim da linha para você!",
- "2": "Você é um treinador, não é? Temo que isso não lhe dê o direito de interferir em nosso trabalho.",
- "3": "Sou da Macro Cosmos Seguros! Já tem um seguro de vida?"
- },
- "victory": {
- "1": "Eu não tenho muita escolha a não ser recuar respeitosamente.",
- "2": "Ter que desistir do meu dinheiro... Perder significa que estou de volta no vermelho...",
- "3": "Ninguém pode vencer a Macro Cosmos quando se trata de nossa dedicação ao trabalho!"
- }
- },
- "oleana": {
- "encounter": {
- "1": "Eu não vou deixar ninguém interferir no plano do Sr. Rose!",
- "2": "Então, você passou por todo o pessoal especial que eu ordenei para te parar. Eu não esperaria nada menos.",
- "3": "Pelo presidente! Eu não vou perder!"
- },
- "victory": {
- "1": "*suspiro* Eu não consegui vencer... Oleana... você realmente é uma mulher sem esperança.",
- "2": "Aff! Isso é inaceitável... O que eu estava pensando... Qualquer treinador que chega tão longe não seria um fracote...",
- "3": "*suspiro* Eu sou uma Oleana cansada..."
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "Tenho que admitir, estou impressionado que tenha chegado até aqui!"
- },
- "victory": {
- "1": "QUÊ! Isso não é possível!"
- },
- "defeat": {
- "1": "Guarde minhas palavras.\nNão ser capaz de medir sua própria força mostra que você ainda é uma criança."
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "Meus antigos associados precisam de mim... Você vai ficar no meu caminho?"
- },
- "victory": {
- "1": "Como isso é possível...?\nO precioso sonho da Equipe Rocket se tornou pouco mais que uma ilusão..."
- },
- "defeat": {
- "1": "A Equipe Rocket renascerá, e eu dominarei o mundo!"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "Eu vou te enterrar com minhas próprias mãos.\nEspero que você aprecie essa honra!"
- },
- "victory": {
- "1": "Ugh! Você é... bastante capaz...\nEu fiquei para trás, mas apenas por um triz..."
- },
- "defeat": {
- "1": "A Equipe Magma vai prevalecer!"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "Você é o último obstáculo entre mim e meus objetivos.\nPrepare-se para meu ataque final! Fuhahaha!"
- },
- "victory": {
- "1": "Isso... Isso não é... Ngh..."
- },
- "defeat": {
- "1": "E agora... Eu transformarei este planeta em uma terra ideal para a humanidade."
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "Eu sou o líder da Equipe Aqua, então temo que esse seja o fim da linha para você."
- },
- "victory": {
- "1": "Vamos nos encontrar de novo em algum lugar. Eu vou ter certeza de lembrar desse rosto."
- },
- "defeat": {
- "1": "Brilhante! Nada vai parar minha equipe agora!"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "Estive esperando tanto tempo por este dia.\nEste é o verdadeiro poder da minha equipe!"
- },
- "victory": {
- "1": "Como eu suspeitava..."
- },
- "defeat": {
- "1": "Eu vou voltar tudo neste mundo ao seu estado puro e original!!"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "Você foi compelida a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!"
- },
- "victory": {
- "1": "Interessante. E bastante curioso."
- },
- "defeat": {
- "1": "Eu criarei meu novo mundo..."
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "Nos encontramos novamente. Parece que nossos destinos estão entrelaçados.\nMas aqui e agora, eu finalmente quebrarei esse vínculo!"
- },
- "victory": {
- "1": "Como? Como? COMO?!"
- },
- "defeat": {
- "1": "Até logo."
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "Ninguém pode me deter! Não importa quem seja ou o que faça!"
- },
- "victory": {
- "1": "Como isso é possível? Eu sou o criador da Equipe Plasma! Eu sou perfeito!"
- },
- "defeat": {
- "1": "Eu sou o governante perfeito de um novo mundo perfeito! Mwa ha ha!"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "Vamos! Eu quero ver sua cara depois que você perder toda a esperança!"
- },
- "victory": {
- "1": "Meus cálculos... Não! Meus planos cuidadosos! O mundo deveria ser meu!"
- },
- "defeat": {
- "1": "Kyurem! Use Absofusion!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "Você está aqui para me deter? Mostre-me em batalha."
- },
- "victory": {
- "1": "Você está aqui para me deter. Mas eu peço que você espere."
- },
- "defeat": {
- "1": "Pokémon... não devem mais existir."
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "O futuro que você quer, ou o futuro que eu quero... Vamos ver qual é o mais merecedor, não é mesmo?"
- },
- "victory": {
- "1": "Uau!"
- },
- "defeat": {
- "1": "Tolos sem visão continuarão a poluir este belo mundo."
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "Você vai assustar minha fera querida! Parece que eu vou precisar te silenciar primeiro."
- },
- "victory": {
- "1": "Como... como você pode ser tão terrível!"
- },
- "defeat": {
- "1": "Aff..."
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "Por que você continua a me incomodar?! Estou cansada de você. Cansada até a alma!\n$Chega de papo furado... Com o poder de Nihilego, vou mostrar o quão errado você estava em vir aqui!"
- },
- "victory": {
- "1": "Aaauuuggghhhhhhhhh!!!"
- },
- "defeat": {
- "1": "Tudo o que eu quero é minha fera preciosa! Eu não me importo com nenhum de vocês!"
- }
- },
- "skull_boss_guzma_1": {
- "encounter": {
- "1": "O odiado chefe que te bate e te bate e nunca para...\n$É. O grande e mau Guzma está aqui!"
- },
- "victory": {
- "1": "Tss. Eu vou te bater um dia desses!"
- },
- "defeat": {
- "1": "E você veio até aqui só pra isso, né?"
- }
- },
- "skull_boss_guzma_2": {
- "encounter": {
- "1": "Não importa contra quem eu esteja, eu vou derrotá-los!\n$Isso é o que o grande e mau Guzma é!"
- },
- "victory": {
- "1": "Guzma!!! O que há de errado com você?!"
- },
- "defeat": {
- "1": "Vocês são tudo uns idiotas!"
- }
- },
- "macro_boss_rose_1": {
- "encounter": {
- "1": "Devo fornecer energia ilimitada para garantir a prosperidade eterna para todos...\n$É meu propósito, meu dever, meu destino!"
- },
- "victory": {
- "1": "Você ainda não entendeu, treinador...\n$Nós... Não, eu vou mudar o rumo da história!"
- },
- "defeat": {
- "1": "Você ainda não entende nada!"
- }
- },
- "macro_boss_rose_2": {
- "encounter": {
- "1": "Estou comprometido em resolver o problema de energia na região de Galar e, claro, em todo o mundo.\n$Minha experiência e conquistas que fizeram da Macro Cosmos um sucesso são a prova de que meus métodos funcionam.\n$Não pretendo mudar de ideia, mesmo que eu perca."
- },
- "victory": {
- "1": "Eu esqueci o quão incríveis são as batalhas Pokémon! Faz tanto tempo desde que eu batalhei...\n$Isso foi realmente satisfatório, eu aceito a derrota para esta batalha."
- },
- "defeat": {
- "1": "Eu suponho que deve parecer que estou fazendo algo terrível. Eu não espero que você entenda.\n$Mas eu devo fornecer à região de Galar energia ilimitada para garantir prosperidade eterna."
- }
- },
- "brock": {
- "encounter": {
- "1": "Minha especialidade em Pokémon do tipo Pedra vai te derrubar! Vamos lá!",
- "2": "Minha vontade firme como pedra vai te sobrecarregar!",
- "3": "Permita-me mostrar a verdadeira força dos meus Pokémon!"
- },
- "victory": {
- "1": "A força dos seus Pokémon superou minhas defesas de pedra!",
- "2": "O mundo é enorme! Estou feliz por ter tido a chance de batalhar com você.",
- "3": "Talvez eu deva voltar a perseguir meu sonho de ser Criador de Pokémon…"
- },
- "defeat": {
- "1": "A melhor defesa é um bom ataque!\nEssa é a minha maneira de fazer as coisas!",
- "2": "Venha estudar rochas comigo da próxima vez para aprender melhor a combatê-las!",
- "3": "Hah, todas as minhas viagens pelas regiões estão valendo a pena!"
- }
- },
- "misty": {
- "encounter": {
- "1": "Minha política é um ataque total com Pokémon do tipo Água!",
- "2": "Oi, vou mostrar a força dos meus Pokémon aquáticos!",
- "3": "Meu sonho era viajar e batalhar com treinadores poderosos…\nVocê será um desafio suficiente?"
- },
- "victory": {
- "1": "Você realmente é forte… Vou admitir que você é habilidosa…",
- "2": "Hmm… Você sabe que só teve sorte, certo?!",
- "3": "Uau, você é demais! Não acredito que me venceu!"
- },
- "defeat": {
- "1": "A poderosa Misty foi demais para você?",
- "2": "Espero que você tenha visto as técnicas de natação elegantes dos meus Pokémon!",
- "3": "Seus Pokémon não foram páreo para meus orgulhos e alegrias!"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "Meus Pokémon Elétricos me salvaram durante a guerra! Vou te mostrar como!",
- "2": "Em sentido! Vou te chocar até você se render!",
- "3": "Vou te eletrizar como faço com todos os meus inimigos na batalha!"
- },
- "victory": {
- "1": "Whoa! Seu time é de verdade, garota!",
- "2": "Uau, você é forte! Até meus truques elétricos perderam para você.",
- "3": "Isso foi uma derrota absolutamente chocante!"
- },
- "defeat": {
- "1": "Oh sim! Quando se trata de Pokémon do tipo Elétrico, sou o número um do mundo!",
- "2": "Hahaha! Foi uma batalha eletrizante, garota!",
- "3": "Uma batalha de Pokémon é guerra, e eu te mostrei combate em primeira mão!"
- }
- },
- "erika": {
- "encounter": {
- "1": "Ah, o tempo está adorável aqui…\nOh, uma batalha? Muito bem então.",
- "2": "Minhas habilidades de batalha Pokémon rivalizam com minhas habilidades de arranjo de flores.",
- "3": "Oh, espero que o aroma agradável dos meus Pokémon não me faça dormir de novo…",
- "4": "Ver flores em um jardim é tão calmante."
- },
- "victory": {
- "1": "Oh! Eu concedo a derrota.",
- "2": "Aquela partida foi muito agradável.",
- "3": "Ah, parece que perdi…",
- "4": "Oh, meu Deus."
- },
- "defeat": {
- "1": "Tinha medo de adormecer…",
- "2": "Oh, meu Deus, parece que meus Pokémon de Grama te dominaram.",
- "3": "Essa batalha foi uma experiência tão calmante.",
- "4": "Oh… É só isso?"
- }
- },
- "janine": {
- "encounter": {
- "1": "Estou dominando a arte dos ataques venenosos.\nVou lutar com você hoje!",
- "2": "Meu pai confia que posso me defender.\nVou provar que ele está certo!",
- "3": "Minhas técnicas de ninja só perdem para as do meu pai!\nVocê consegue acompanhar?"
- },
- "victory": {
- "1": "Ainda preciso de treinamento… Entendi.",
- "2": "Sua técnica de batalha superou a minha.",
- "3": "Vou me aplicar de verdade e melhorar minhas habilidades."
- },
- "defeat": {
- "1": "Hehe… o veneno drenou todas as suas forças para lutar.",
- "2": "Ha! Você não teve chance contra minhas habilidades superiores de ninja!",
- "3": "A fé do meu pai em mim não foi mal colocada."
- }
- },
- "sabrina": {
- "encounter": {
- "1": "Através da minha habilidade psíquica, tive uma visão da sua chegada!",
- "2": "Não gosto de lutar, mas se você quiser, vou mostrar meus poderes!",
- "3": "Posso sentir grande ambição em você. Vou ver se não é infundada."
- },
- "victory": {
- "1": "Seu poder… Ele supera o que eu previa…",
- "2": "Não consegui prever seu poder com precisão.",
- "3": "Mesmo com meus imensos poderes psíquicos, não consigo sentir outro tão forte quanto você."
- },
- "defeat": {
- "1": "Essa vitória… É exatamente como previ nas minhas visões!",
- "2": "Talvez fosse outra pessoa que eu sentisse um grande desejo…",
- "3": "Aprimore suas habilidades antes de entrar em batalha precipitadamente.\nVocê nunca sabe o que o futuro pode reservar se fizer isso…"
- }
- },
- "blaine": {
- "encounter": {
- "1": "Hah! Espero que tenha trazido uma Cura de Queimadura!",
- "2": "Meus Pokémon de Fogo vão incinerar todos os desafiantes!",
- "3": "Prepare-se para brincar com fogo!"
- },
- "victory": {
- "1": "Queimei até não restar nada! Nem cinzas sobraram!",
- "2": "Não acendi as chamas alto o suficiente?",
- "3": "Estou completamente exausto… Mas isso faz minha motivação para melhorar queimar ainda mais!"
- },
- "defeat": {
- "1": "Meu inferno ardente não pode ser apagado!",
- "2": "Meus Pokémon foram fortalecidos com o calor desta vitória!",
- "3": "Hah! Minha paixão queima mais do que a sua!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "Eu, o líder da Equipe Rocket, vou te fazer sentir um mundo de dor!",
- "2": "Meu treinamento aqui será vital antes de enfrentar meus antigos associados novamente.",
- "3": "Não acho que você está preparada para o nível de fracasso que está prestes a experimentar!"
- },
- "victory": {
- "1": "O QUE! Eu, perder?! Não tenho nada a dizer a você!",
- "2": "Hmm… Você nunca entenderia o que quero alcançar.",
- "3": "Esta derrota está apenas adiando o inevitável.\nVou ressurgir a Equipe Rocket das cinzas a tempo."
- },
- "defeat": {
- "1": "Não ser capaz de medir sua própria força mostra que você ainda é apenas uma criança.",
- "2": "Não tente interferir comigo novamente.",
- "3": "Espero que entenda o quão tolo foi me desafiar."
- }
- },
- "roxanne": {
- "encounter": {
- "1": "Você poderia gentilmente demonstrar como batalha?",
- "2": "Você pode aprender muitas coisas batalhando com muitos treinadores.",
- "3": "Oh, você me pegou estrategizando.\nGostaria de batalhar?"
- },
- "victory": {
- "1": "Oh, parece que perdi.\nEu entendo.",
- "2": "Parece que ainda tenho muito mais a aprender quando se trata de batalhas.",
- "3": "Vou levar o que aprendi aqui hoje a sério."
- },
- "defeat": {
- "1": "Aprendi muitas coisas com nossa batalha.\nEspero que você também tenha aprendido.",
- "2": "Espero batalhar com você novamente.\nEspero que use o que aprendeu aqui.",
- "3": "Venci devido a tudo o que aprendi."
- }
- },
- "brawly": {
- "encounter": {
- "1": "Oh cara, uma desafiante!\nVamos ver o que você pode fazer!",
- "2": "Você parece uma grande onda.\nVamos batalhar!",
- "3": "Hora de criar uma tempestade!\nVamos!"
- },
- "victory": {
- "1": "Uau, você me derrotou!",
- "2": "Você surfou minha onda e me derrubou!",
- "3": "Sinto-me perdido na Caverna Granito!"
- },
- "defeat": {
- "1": "Haha, eu surfei a grande onda!\nDesafie-me novamente algum dia.",
- "2": "Surfe comigo novamente algum dia!",
- "3": "Assim como as marés vão e vêm, espero que você volte para me desafiar novamente."
- }
- },
- "wattson": {
- "encounter": {
- "1": "Hora de levar um choque!\nWahahahaha!",
- "2": "Vou fazer faíscas voarem!\nWahahahaha!",
- "3": "Espero que tenha trazido Cura de Paralisia!\nWahahahaha!"
- },
- "victory": {
- "1": "Parece que estou sem carga!\nWahahahaha!",
- "2": "Você me aterrissou completamente!\nWahahahaha!",
- "3": "Obrigado pela emoção!\nWahahahaha!"
- },
- "defeat": {
- "1": "Você está totalmente carregada agora!\nWahahahaha!",
- "2": "Espero ver você faíscando em batalhas futuras!\nWahahahaha!",
- "3": "Wahahahaha! Que batalha eletrizante!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "Meus Pokémon de fogo estão prontos para queimar a concorrência!\nVamos nessa!",
- "2": "Prepare-se para sentir o calor da minha determinação!\nNão vou segurar nada!",
- "3": "Minhas habilidades vão incinerar você!\nPrepare-se para a batalha mais quente da sua vida!"
- },
- "victory": {
- "1": "Essa derrota só faz minha determinação queimar mais!",
- "2": "Essa perda não apagará minhas chamas!\nEstarei de volta mais forte!",
- "3": "Vou usar essa experiência para reacender meu espírito competitivo!"
- },
- "defeat": {
- "1": "Minhas chamas nunca se apagarão!\nSou muito apaixonada por isso!",
- "2": "Você foi incrível!\nVamos fazer isso de novo algum dia!",
- "3": "Que batalha ardente!\nMal posso esperar pela próxima!"
- }
- },
- "norman": {
- "encounter": {
- "1": "Você está pronto para enfrentar a força pura do meu time?\nVou te mostrar o poder do equilíbrio!",
- "2": "Minha experiência em batalha vai fazer você suar!\nPrepare-se!",
- "3": "Treinei meu time rigorosamente.\nVamos ver se você consegue igualar!"
- },
- "victory": {
- "1": "Parece que subestimei você.\nFoi uma batalha dura.",
- "2": "Você é forte, mas ainda há muito para aprender.",
- "3": "Essa derrota não abalará minha determinação.\nEstarei de volta mais forte!"
- },
- "defeat": {
- "1": "Você lutou bravamente!\nEspero batalhar com você novamente.",
- "2": "Sua força é incrível!\nNão posso esperar pela nossa próxima batalha.",
- "3": "Foi uma honra batalhar com você!\nAté a próxima!"
- }
- },
- "winona": {
- "encounter": {
- "1": "Tenho sobrevoado os céus em busca de presas...\nE você é meu alvo!",
- "2": "Não importa como será nossa batalha, meus Pokémon Voadores e eu triunfaremos com graça. Vamos batalhar!",
- "3": "Espero que você não tenha medo de altura.\nVamos subir!"
- },
- "victory": {
- "1": "Você é a primeira Treinadora que vejo com mais graça do que eu.\nJogou excelentemente.",
- "2": "Oh, meus Pokémon Voadores despencaram!\nMuito bem.",
- "3": "Embora eu tenha caído, meus Pokémon continuarão a voar!"
- },
- "defeat": {
- "1": "Meus Pokémon Voadores e eu sempre dançaremos com elegância!",
- "2": "Espero que tenha gostado do nosso show.\nNossa dança graciosa terminou.",
- "3": "Você não quer ver nossa coreografia elegante novamente?"
- }
- },
- "tate": {
- "encounter": {
- "1": "Hehehe... Ficou surpresa de me ver sem minha irmã?",
- "2": "Posso ver o que você está pensando...\nVocê quer batalhar!",
- "3": "Como você pode derrotar alguém...\nQue sabe todos os seus movimentos?"
- },
- "victory": {
- "1": "Não pode ser ajudado...\nSinto falta da Liza...",
- "2": "Seu vínculo com seus Pokémon era mais forte que o meu.",
- "3": "Se eu estivesse com Liza, teríamos vencido.\nConseguimos completar os pensamentos um do outro!"
- },
- "defeat": {
- "1": "Meus Pokémon e eu somos superiores!",
- "2": "Se você não consegue nem me derrotar, nunca será capaz de derrotar Liza também.",
- "3": "Tudo graças ao meu treinamento rigoroso com Liza.\nPosso me tornar um com os Pokémon."
- }
- },
- "liza": {
- "encounter": {
- "1": "Fufufu... Ficou surpresa de me ver sem meu irmão?",
- "2": "Posso determinar o que você deseja...\nVocê quer batalhar, não quer?",
- "3": "Como você pode derrotar alguém...\nQue é um com seus Pokémon?"
- },
- "victory": {
- "1": "Não pode ser ajudado...\nSinto falta do Tate...",
- "2": "Seu vínculo com seus Pokémon...\nÉ mais forte que o meu.",
- "3": "Se eu estivesse com Tate, teríamos vencido.\nPodemos terminar as frases um do outro!"
- },
- "defeat": {
- "1": "Meus Pokémon e eu somos vitoriosos.",
- "2": "Se você não consegue nem me derrotar, nunca será capaz de derrotar Tate também.",
- "3": "Tudo graças ao meu treinamento rigoroso com Tate.\nPosso me sincronizar com meus Pokémon."
- }
- },
- "juan": {
- "encounter": {
- "1": "Agora não é hora de agir timidamente.\nVamos batalhar!",
- "2": "Ahahaha, você será testemunha da minha arte com Pokémon de Água!",
- "3": "Um tufão se aproxima!\nVocê será capaz de me testar?",
- "4": "Por favor, você será testemunha da nossa arte.\nUma grande ilusão de água esculpida por meus Pokémon e por mim!"
- },
- "victory": {
- "1": "Você pode ser um gênio que pode enfrentar Wallace!",
- "2": "Eu me concentrei na elegância enquanto você treinava.\nÉ natural que você me derrotasse.",
- "3": "Ahahaha!\nMuito bem, você venceu desta vez.",
- "4": "De você, sinto o brilho brilhante da habilidade que superará tudo."
- },
- "defeat": {
- "1": "Meus Pokémon e eu esculpimos uma ilusão de Água e saímos vitoriosos.",
- "2": "Ahahaha, eu venci, e você perdeu.",
- "3": "Posso emprestar meu traje? Pode te ajudar a batalhar!\nAhahaha, estou brincando!",
- "4": "Eu sou o vencedor! O que quer dizer, você perdeu."
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "Crash! Crash! Cuidado!\nDemolidor Wake… está… aqui!",
- "2": "Crash! Crash! Demolidor Wake!",
- "3": "Sou a onda de poder que vai te lavar!"
- },
- "victory": {
- "1": "Isso coloca um sorriso no meu rosto!\nGuhahaha! Foi uma explosão!",
- "2": "Hunwah! Acabou e terminou!\nComo vou dizer isso...\nQuero mais! Queria batalhar muito mais!",
- "3": "O QUÊ?!"
- },
- "defeat": {
- "1": "Siiiiim! Isso mesmo!",
- "2": "Eu venci, mas quero mais! Queria batalhar muito mais!",
- "3": "Até logo!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "Vou mostrar o verdadeiro poder dos magníficos Pokémon pássaros!",
- "2": "Ventos, fiquem comigo!",
- "3": "Pai! Espero que esteja vendo minha batalha de cima!"
- },
- "victory": {
- "1": "Eu entendo... Vou sair graciosamente.",
- "2": "Uma derrota é uma derrota. Você é realmente forte.",
- "3": "...Droga! Sim, eu perdi."
- },
- "defeat": {
- "1": "Pai! Venci com seus amados Pokémon pássaros...",
- "2": "Pokémon pássaros são os melhores afinal!",
- "3": "Sinto que estou alcançando meu pai!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-la.",
- "2": "Não estou aqui para conversar. Estou aqui para vencer!",
- "3": "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-la!"
- },
- "victory": {
- "1": "Você e seus Pokémon são demais...",
- "2": "Como...? Como isso pode ser?!",
- "3": "Fui totalmente arrastada!"
- },
- "defeat": {
- "1": "A onda furiosa ataca novamente!",
- "2": "Hora de surfar na onda da vitória!",
- "3": "Hehe!"
- }
- },
- "melony": {
- "encounter": {
- "1": "Não vou me segurar!",
- "2": "Tudo bem, acho que devemos começar.",
- "3": "Vou congelar você completamente!"
- },
- "victory": {
- "1": "Você... Você é muito boa, hein?",
- "2": "Se você encontrar Gordie por aí, certifique-se de dar uma boa surra nele, ok?",
- "3": "Acho que você levou a quebra de gelo um pouco literalmente demais..."
- },
- "defeat": {
- "1": "Agora você vê como as batalhas podem ser severas?",
- "2": "Hee! Parece que ganhei de novo!",
- "3": "Você está segurando?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "Você parece forte! Vamos começar!",
- "2": "Sou forte como a amplitude do oceano. Você vai ser varrida, com certeza.",
- "3": "Oh ho, então estou enfrentando você! Isso é fora do comum."
- },
- "victory": {
- "1": "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinadora!",
- "2": "Você não apenas parece forte, você é forte de verdade! Eh, eu também fui varrido!",
- "3": "Você é forte como uma onda impressionante!"
- },
- "defeat": {
- "1": "Você é forte, mas não é o suficiente para mudar o mar, ok!",
- "2": "Hee! Parece que ganhei de novo!",
- "3": "Doce, doce vitória!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "Com licença. Você é uma desafiante, certo?\nSou a usuária de Pokémon do tipo Fantasma da Elite dos Quatro, Shauntal, e serei sua oponente.",
- "2": "Adoro escrever sobre Treinadores que vêm aqui e os Pokémon que treinam.\nPosso usar você e seus Pokémon como tema?",
- "3": "Cada pessoa que trabalha com Pokémon tem uma história para contar.\nQue história está prestes a ser contada?"
- },
- "victory": {
- "1": "Uau. Estou sem palavras!",
- "2": "D-desculpe! Primeiro, preciso me desculpar com meus Pokémon...\n\nLamento muito que você tenha tido uma experiência ruim por minha causa!",
- "3": "Mesmo com isso, ainda sou uma da Elite dos Quatro!"
- },
- "defeat": {
- "1": "Hehe.",
- "2": "Isso me deu um excelente material para meu próximo romance!",
- "3": "E assim, outra história termina..."
- }
- },
- "marshal": {
- "encounter": {
- "1": "Meu mentor, Alder, vê seu potencial como Treinadora e está interessado em você.\nMeu objetivo é testá-la—levar você aos limites da sua força. Kiai!",
- "2": "Vitória, vitória decisiva, é meu objetivo! Desafiante, aqui vou eu!",
- "3": "Em mim mesmo, procuro desenvolver a força de um lutador e eliminar qualquer fraqueza em mim!\nPrevalecendo com a força de minhas convicções!"
- },
- "victory": {
- "1": "Ufa! Bem feito!",
- "2": "À medida que suas batalhas continuarem, mire em alturas ainda maiores!",
- "3": "A força demonstrada por você e seus Pokémon me impressionou profundamente..."
- },
- "defeat": {
- "1": "Hmm.",
- "2": "Isso foi uma boa batalha.",
- "3": "Haaah! Haaah! Haiyaaaah!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "Você me lembra um velho amigo. Isso me deixa animado para essa batalha Pokémon!",
- "2": "As batalhas Pokémon não têm sentido se você não pensa por que você batalha.\nOu melhor, isso torna as batalhas junto com Pokémon sem sentido.",
- "3": "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-la."
- },
- "victory": {
- "1": "Obrigado! Vi o que estava faltando em mim.",
- "2": "Obrigado! Sinto que vi um pouco do caminho em direção aos meus ideais.",
- "3": "Hmm... Isso é problemático."
- },
- "defeat": {
- "1": "Como Líder de Ginásio, meu objetivo é ser um obstáculo para você superar.",
- "2": "Tudo bem!",
- "3": "Cheguei onde estou porque os Pokémon estavam ao meu lado.\nTalvez precisemos pensar por que os Pokémon nos ajudam, não em termos de Pokémon e Treinadores, mas como uma relação entre seres vivos."
- }
- },
- "chili": {
- "encounter": {
- "1": "Yeeeeeooow! Hora de brincar com FOGO!! Eu sou o mais forte de nós irmãos!",
- "2": "Tcharan! O escaldante Chili tipo Fogo (sou eu) será seu oponente!",
- "3": "Vou te mostrar o que eu e meus ardentes tipo Fogo podemos fazer!"
- },
- "victory": {
- "1": "Você me pegou. Eu estou… queimado… esgotado…",
- "2": "Uau! Você tá pegando fogo!",
- "3": "Ai! Você me pegou!"
- },
- "defeat": {
- "1": "Estou pegando fogo! Brinque comigo e você vai se queimar!",
- "2": "Quando você brinca com fogo, você se queima!",
- "3": "Quero dizer, fala sério, seu oponente era eu! Você não teve chance!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\n$Hum... Nós iremos batalhar, aconteça o que acontecer.",
- "2": "Então, hum, se você estiver bem comigo, eu vou, hum, dar tudo o que tenho para ser, hum, você sabe, seu oponente.",
- "3": "OK... Então, eu sou Cilan, eu gosto de Pokémon do tipo Grama."
- },
- "victory": {
- "1": "Er… Já acabou?",
- "2": "…Que surpresa. Você é muito forte, não é? \n$Eu acho que meus irmãos também não conseguiriam derrotar você…",
- "3": "…Huh. Parece que meu timing estava, hum, errado?"
- },
- "defeat": {
- "1": "Hein? Eu ganhei?",
- "2": "Eu acho... \n$Eu acho que ganhei, porque eu estava competindo com meus irmãos Chili e Cress, e todos nós conseguimos ficar mais fortes.",
- "3": "Foi… foi uma experiência bastante emocionante…"
- }
- },
- "roark": {
- "encounter": {
- "1": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!",
- "2": "Vamos lá! Estes são meus Pokémon de pedra, meu orgulho e alegria!",
- "3": "Pokémon do tipo Pedra são simplesmente os melhores!",
- "4": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!"
- },
- "victory": {
- "1": "O-o que? Isso não pode ser! Meus Pokémon fortificados!",
- "2": "...Perdemos o controle. Da próxima vez, gostaria de desafiá-la a uma corrida de escavação de fósseis no subsolo.",
- "3": "Com habilidade como a sua, é natural que você vença.",
- "4": "O-o que?! Não pode ser! Nem isso foi suficiente?",
- "5": "Eu estraguei tudo."
- },
- "defeat": {
- "1": "Veja? Estou orgulhoso do meu estilo de batalha rochoso!",
- "2": "Obrigado! A batalha me deu confiança de que talvez eu consiga vencer meu pai!",
- "3": "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!"
- }
- },
- "morty": {
- "encounter": {
- "1": "Com um pouco mais, eu poderia ver um futuro em que encontro o Pokémon lendário.\nVocê vai me ajudar a alcançar esse nível!",
- "2": "Dizem que um Pokémon com cores de arco-íris aparecerá diante de um Treinador verdadeiramente poderoso.\nAcreditei nessa história, então treinei secretamente aqui a vida toda. Como resultado, agora posso ver o que os outros não podem.\nVejo uma sombra da pessoa que fará o Pokémon aparecer.\nAcredito que essa pessoa sou eu! Você vai me ajudar a alcançar esse nível!",
- "3": "Quer você escolha acreditar ou não, o poder místico existe.",
- "4": "Você pode testemunhar os frutos do meu treinamento.",
- "5": "Você deve fazer sua alma se tornar uma com a dos Pokémon. Você pode fazer isso?",
- "6": "Diga, você quer fazer parte do meu treinamento?"
- },
- "victory": {
- "1": "Ainda não sou bom o suficiente...",
- "2": "Eu vejo... Sua jornada a levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...",
- "3": "Como isso é possível...",
- "4": "Não acho que nossos potenciais sejam tão diferentes.\nMas você parece ter algo mais do que isso... Que seja.",
- "5": "Acho que preciso de mais treinamento.",
- "6": "Isso é uma pena."
- },
- "defeat": {
- "1": "Eu me movi... mais um passo adiante.",
- "2": "Fufufu...",
- "3": "O-o que?! Não pode ser! Nem isso foi suficiente?",
- "4": "Sinto como se tivesse acabado de quebrar uma pedra muito teimosa!",
- "5": "Ahahahah!",
- "6": "Eu sabia que venceria!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "Quero vencer, então é exatamente isso que vou fazer!",
- "2": "Eu batalho porque quero batalhar! E sabe de uma coisa? É assim que deve ser!"
- },
- "victory": {
- "1": "Queria vencer... mas perdi!",
- "2": "Eu perdi... porque não consegui vencer!"
- },
- "defeat": {
- "1": "Ei, espere um segundo. Eu acabei de vencer? Acho que acabei de vencer! Que satisfação!",
- "2": "Uou! Isso foi incrível!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "Quero ser a pessoa a ajudar alguém em particular. Sendo assim, não posso me dar ao luxo de perder.\n... Nossa batalha começa agora."
- },
- "victory": {
- "1": "Eu sou... não o suficiente, eu vejo."
- },
- "defeat": {
- "1": "A vitória pertence a mim. Bem lutado."
- }
- },
- "lacey": {
- "encounter": {
- "1": "Vou enfrentar você com meu time usual como membro da Elite dos Quatro."
- },
- "victory": {
- "1": "Foi uma excelente batalha. Estou ansiosa para o próximo desafio."
- },
- "defeat": {
- "1": "Fufufu... Nada mal.\nDesafiantes que derrotam a Elite dos Quatro são dignos de notar."
- }
- },
- "drayton": {
- "encounter": {
- "1": "Cara, eu amo cadeiras. Você não ama cadeiras? Que salva-vidas.\n$Não entendo por que todo mundo não fica sentado o tempo todo. Ficar de pé é cansativo!"
- },
- "victory": {
- "1": "Acho que deveria ter esperado por isso!"
- },
- "defeat": {
- "1": "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateada, mas não vá dar uma de Kieran comigo, OK?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas?\n$A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronta para enfrentar tudo isso?"
- },
- "victory": {
- "1": "Você acredita nos seus Pokémon... E eles acreditam em você também... Foi uma boa batalha, broto."
- },
- "defeat": {
- "1": "Hohoho... De fato. Pequenas lâminas frágeis de grama conseguem quebrar até mesmo concreto."
- }
- },
- "viola": {
- "encounter": {
- "1": "Seja as lágrimas de frustração que seguem uma derrota ou o florescer da alegria que vem com a vitória…\n$Ambos são ótimos temas para minha câmera! Fantástico! Isso vai ser simplesmente fantástico!\n$Agora venha para cima de mim!",
- "2": "Minha lente está sempre focada na vitória – não vou deixar nada estragar esta foto!"
- },
- "victory": {
- "1": "Você e seus Pokémon me mostraram uma nova profundidade de campo! Fantástico! Simplesmente fantástico!",
- "2": "O mundo que você vê através de uma lente, e o mundo que você vê com um Pokémon ao seu lado…\n$O mesmo mundo pode parecer completamente diferente dependendo do seu ponto de vista."
- },
- "defeat": {
- "1": "A foto do momento da minha vitória vai ser um verdadeiro sucesso!",
- "2": "Sim! Tirei ótimas fotos!"
- }
- },
- "candice": {
- "encounter": {
- "1": "Você quer desafiar a Candice? Com certeza! Eu estava esperando por alguém forte!\n$Mas devo te avisar, sou forte porque sei como focar.",
- "2": "Pokémon, moda, romance… É tudo uma questão de foco!\n$Vou te mostrar exatamente o que quero dizer. Prepare-se para perder!"
- },
- "victory": {
- "1": "Devo dizer, estou aquecida para você! Posso até te admirar um pouco.",
- "2": "Uau! Você é ótima! Ganhou meu respeito!\n$Acho que seu foco e vontade nos derrubaram totalmente."
- },
- "defeat": {
- "1": "Eu senti sua vontade de vencer, mas eu não perco!",
- "2": "Viu? O foco da Candice! O foco dos meus Pokémon também é ótimo!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "Você tem uma aura vencedora. Então, de qualquer forma, isso vai ser divertido. Vamos ter nossa batalha!"
- },
- "victory": {
- "1": "Incrível! Você é muito boa, não é?"
- },
- "defeat": {
- "1": "Sim! Meus Pokémon e eu somos perfeitamente bons!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "Ok! Deixe-me enfrentar você!"
- },
- "victory": {
- "1": "Batalhar é um assunto profundo e complexo..."
- },
- "defeat": {
- "1": "Vencer um membro da Elite dos Quatro não é fácil."
- }
- },
- "cress": {
- "encounter": {
- "1": "Isso mesmo! Serei eu e meus estimados tipos Água que você deve enfrentar na batalha!"
- },
- "victory": {
- "1": "Perder? Eu? Não acredito nisso."
- },
- "defeat": {
- "1": "Este é o resultado apropriado quando eu sou seu oponente."
- }
- },
- "allister": {
- "encounter": {
- "1": "Sou Allister.\nA-aqui... vou eu..."
- },
- "victory": {
- "1": "Quase perdi minha máscara de tanto choque... Isso foi…\n$Uau. Posso ver sua habilidade pelo que ela é."
- },
- "defeat": {
- "1": "I-isso foi incrível!"
- }
- },
- "clay": {
- "encounter": {
- "1": "Harrumph! Me deixou esperando, não foi, garota? Tudo bem, hora de ver o que você pode fazer!"
- },
- "victory": {
- "1": "Cara, como é bom dar tudo de si e ainda assim ser derrotado!"
- },
- "defeat": {
- "1": "O que importa é como você reage à derrota.\n$É por isso que as pessoas que usam a derrota como combustível para melhorar são duras."
- }
- },
- "kofu": {
- "encounter": {
- "1": "Vou te servir um prato completo de Pokémon do tipo Água! Mas não tente comê-los!"
- },
- "victory": {
- "1": "Vaultin' Veluza! Você é animada, não é! Um pouco ANIMADA DEMAIS, se me permite dizer!"
- },
- "defeat": {
- "1": "Volte para me ver novamente, ouviu?"
- }
- },
- "tulip": {
- "encounter": {
- "1": "Permita-me usar minhas habilidades para deixar seus lindos Pokémon ainda mais bonitos!"
- },
- "victory": {
- "1": "Sua força tem uma magia que não pode ser apagada."
- },
- "defeat": {
- "1": "Você sabe, na minha linha de trabalho, pessoas que carecem de talento em uma área ou outra frequentemente desaparecem rapidamente - nunca mais se ouve falar delas."
- }
- },
- "sidney": {
- "encounter": {
- "1": "Gostei desse olhar que você me deu. Acho que você vai ser um bom desafio.\n$Isso é ótimo! Parece muito bom! Vamos nessa!\n$Você e eu, vamos curtir uma batalha que só pode acontecer aqui!"
- },
- "victory": {
- "1": "E aí, gostou? Eu perdi! Mas foi divertido, então não importa."
- },
- "defeat": {
- "1": "Sem ressentimentos, beleza?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "Enquanto treinava, adquiri a habilidade de me comunicar com Pokémon do tipo Fantasma. \n$Sim, o vínculo que desenvolvi com os Pokémon é extremamente forte. \n$Então, vamos lá, tente ver se você consegue até mesmo causar dano aos meus Pokémon!"
- },
- "victory": {
- "1": "Ah, droga. Eu perdi."
- },
- "defeat": {
- "1": "Estou ansiosa para batalhar com você de novo algum dia!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "Tudo o que vi foram desafios de Treinadores fracos e seus Pokémon. \n$E você? Ficaria extremamente satisfeita se pudesse dar tudo de mim contra você!"
- },
- "victory": {
- "1": "Você e seus Pokémon… Como seus espíritos queimam!\n$O calor consumido é esmagador. \n$Não é surpresa que minhas habilidades geladas falharam em te machucar."
- },
- "defeat": {
- "1": "Uma batalha intensamente apaixonada, sem dúvida."
- }
- },
- "drake": {
- "encounter": {
- "1": "Para nós, batalhar com Pokémon como parceiros, você sabe o que é necessário? Você sabe o que precisa? \n$Se não souber, nunca prevalecerá contra mim!"
- },
- "victory": {
- "1": "Excelente, deve-se dizer."
- },
- "defeat": {
- "1": "Dei meu máximo nessa batalha!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "Há algo em você… Uma diferença na sua postura. \n$Acho que sinto isso em você. Agora, me mostre. Mostre-me o poder que você tem com seus Pokémon. \n$E eu, por minha vez, apresentarei uma performance de ilusões na água com meus Pokémon!"
- },
- "victory": {
- "1": "Bravo. Agora percebo sua autenticidade e magnificência como Treinadora de Pokémon. \n$Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digna."
- },
- "defeat": {
- "1": "Uma grande ilusão!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos!\n$Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronta?"
- },
- "victory": {
- "1": "Como ousa!"
- },
- "defeat": {
- "1": "Não há nada que você possa fazer quando está congelada."
- }
- },
- "will": {
- "encounter": {
- "1": "Treinei por todo o mundo, tornando meus Pokémon psíquicos poderosos.\n$Eu só posso melhorar! Perder não é uma opção!"
- },
- "victory": {
- "1": "Eu… Eu não… acredito…"
- },
- "defeat": {
- "1": "Isso foi por pouco. Me pergunto o que está faltando em você."
- }
- },
- "malva": {
- "encounter": {
- "1": "Sinto que meu coração pode explodir em chamas. \n$Estou ardendo de ódio por você, pirralha!"
- },
- "victory": {
- "1": "Que novidade… Uma nova desafiadora derrotou Malva!"
- },
- "defeat": {
- "1": "Estou encantada! Sim, encantada por poder esmagar você sob meu calcanhar."
- }
- },
- "hala": {
- "encounter": {
- "1": "O velho Hala está aqui para fazer você gritar!"
- },
- "victory": {
- "1": "Pude sentir o poder que você ganhou na sua jornada."
- },
- "defeat": {
- "1": "Haha! Que batalha deliciosa!"
- }
- },
- "molayne": {
- "encounter": {
- "1": "Dei a posição de capitão ao meu primo Sophocles, mas estou confiante na minha habilidade. \n$Minha força é como a de uma supernova!"
- },
- "victory": {
- "1": "Certamente encontrei uma Treinadora interessante para enfrentar!"
- },
- "defeat": {
- "1": "Ahaha. Que batalha interessante."
- }
- },
- "rika": {
- "encounter": {
- "1": "Eu diria que vou pegar leve com você, mas… estaria mentindo! Pense rápido!"
- },
- "victory": {
- "1": "Nada mal, garota."
- },
- "defeat": {
- "1": "Nahahaha! Você realmente é algo mais, garota!"
- }
- },
- "bruno": {
- "encounter": {
- "1": "Nós vamos te triturar com nosso poder superior! Hoo hah!"
- },
- "victory": {
- "1": "Por quê? Como eu poderia perder?"
- },
- "defeat": {
- "1": "Você pode me desafiar o quanto quiser, mas os resultados nunca vão mudar!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "Sou Bugsy! Eu nunca perco quando se trata de Pokémon do tipo Inseto!"
- },
- "victory": {
- "1": "Uau, incrível! Você é uma especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu."
- },
- "defeat": {
- "1": "Obrigado! Graças à nossa batalha, eu também pude fazer progressos na minha pesquisa!"
- }
- },
- "koga": {
- "encounter": {
- "1": "Fwahahahaha! Pokémon não são apenas sobre força bruta--você verá em breve!"
- },
- "victory": {
- "1": "Ah! Você provou seu valor!"
- },
- "defeat": {
- "1": "Você aprendeu a temer as técnicas do ninja?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "Bem, você mostraria a esta velha senhora o quanto aprendeu?"
- },
- "victory": {
- "1": "Bem! Querida criança, devo dizer, isso foi muito impressionante. \n$Seus Pokémon acreditaram em você e fizeram o melhor para te dar a vitória. \n$Mesmo tendo perdido, me encontro com esse sorriso bobo!"
- },
- "defeat": {
- "1": "Hahahahah! Parece que esta velha senhora ganhou!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "Bem, desafiadora, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!"
- },
- "victory": {
- "1": "Minha teoria sobre você estava correta. Você é mais do que talentosa… Você é motivada! Eu te saúdo!"
- },
- "defeat": {
- "1": "Ah ha ha! Se você perder, certifique-se de analisar o porquê e use esse conhecimento na próxima batalha!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "Enquanto eu estiver vivo, continuarei em busca da culinária suprema... e dos oponentes mais fortes em batalha!"
- },
- "victory": {
- "1": "Guardarei minha memória de você e seus Pokémon para sempre em meu coração."
- },
- "defeat": {
- "1": "Nossa batalha Pokémon foi como alimento para minha alma. Isso vai me manter em frente. \n$É assim que vou prestar meus respeitos a você por dar tudo de si na batalha!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "Prepare-se! Vou arrancar algum senso de você!"
- },
- "victory": {
- "1": "Selvagem! Sua razão já é mais tóxica que a minha!"
- },
- "defeat": {
- "1": "Ei, vamos lá! Seja séria! Você tem que dar mais de si!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "Não precisa de introdução aqui. Hora de batalhar comigo, Olivia!"
- },
- "victory": {
- "1": "Realmente encantador… Tanto você quanto seus Pokémon…"
- },
- "defeat": {
- "1": "Mmm-hmm."
- }
- },
- "poppy": {
- "encounter": {
- "1": "Oooh! Você quer ter uma batalha Pokémon comigo?"
- },
- "victory": {
- "1": "Uagh?! Mmmuuuggghhh…"
- },
- "defeat": {
- "1": "Yaaay! Eu consegui! Eu der-ro-tei você! Você pode vir para… Para… Uma revanche? \n$Venha para uma revanche quando quiser!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "Pokémon são para batalhas! Vou te mostrar como um verdadeiro Treinador batalha!"
- },
- "victory": {
- "1": "Oh meu! Você é algo especial, criança!"
- },
- "defeat": {
- "1": "Bahaha. É assim que uma batalha adequada é feita!"
- }
- },
- "flint": {
- "encounter": {
- "1": "Espero que você esteja aquecida, porque aqui vem o Big Bang!"
- },
- "victory": {
- "1": "Incrível! Seus movimentos são tão quentes que fazem os meus parecerem mornos!"
- },
- "defeat": {
- "1": "Huh? Isso é tudo? Acho que você precisa de um pouco mais de paixão."
- }
- },
- "grimsley": {
- "encounter": {
- "1": "O vencedor leva tudo, e não sobra nada para o perdedor."
- },
- "victory": {
- "1": "Quando se perde, perde-se tudo… A próxima coisa que vou procurar será a vitória, também!"
- },
- "defeat": {
- "1": "Se alguém vence, a pessoa que lutou contra essa pessoa perde."
- }
- },
- "caitlin": {
- "encounter": {
- "1": "Sou eu que apareci quando a flor se abriu. Você que estava esperando…\n$Você parece uma Treinadora de Pokémon com força refinada e bondade profunda. \n$O que eu procuro no meu oponente é uma força soberba… \n$Por favor, libere seu poder ao máximo!"
- },
- "victory": {
- "1": "Meus Pokémon e eu aprendemos muito! Agradeço a você."
- },
- "defeat": {
- "1": "Aspiro a reivindicar a vitória com elegância e graça."
- }
- },
- "diantha": {
- "encounter": {
- "1": "Batalhar contra você e seus Pokémon, todos vocês cheios de esperança para o futuro… \n$Honestamente, isso apenas me enche da energia que preciso para continuar enfrentando cada novo dia! Sim!"
- },
- "victory": {
- "1": "Testemunhar os espíritos nobres de você e seus Pokémon em batalha realmente tocou meu coração…"
- },
- "defeat": {
- "1": "Oh, fantástico! O que achou? Minha equipe foi bem legal, né?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "Bem encontrado, jovem desafiadora! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! \n$Que a batalha comece! En garde!"
- },
- "victory": {
- "1": "Gloriosa! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!"
- },
- "defeat": {
- "1": "Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! \n$Vencer contra uma oponente tão digna dá asas à minha alma--assim eu voo!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "Batalhar é simplesmente divertido! Vamos lá, eu posso te derrotar!"
- },
- "victory": {
- "1": "Eu… Estou sem palavras! Como você conseguiu?!"
- },
- "defeat": {
- "1": "Ehaha! Que vitória incrível!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "Olá… Sou eu, Larry.\n$Eu também sou membro da Elite dos Quatro, sim… Infelizmente para mim."
- },
- "victory": {
- "1": "Bem, isso tirou o vento debaixo das nossas asas…"
- },
- "defeat": {
- "1": "É hora de uma reunião com o chefe."
- }
- },
- "lance": {
- "encounter": {
- "1": "Estive esperando por você. Permita-me testar suas habilidades.",
- "2": "Achei que você conseguiria chegar tão longe. Vamos começar."
- },
- "victory": {
- "1": "Você me pegou. Você é magnífica!",
- "2": "Nunca esperei que outra Treinadora me derrotasse… Estou surpreso."
- },
- "defeat": {
- "1": "Isso foi por pouco. Quer tentar de novo?",
- "2": "Não é que você seja fraca. Não se incomode com isso."
- }
- },
- "karen": {
- "encounter": {
- "1": "Eu sou Karen. Você gostaria de um duelo com meus Pokémon do tipo Sombrio?",
- "2": "Sou diferente daqueles que você já conheceu.",
- "3": "Você montou uma equipe charmosa. Nossa batalha deve ser boa."
- },
- "victory": {
- "1": "Não! Eu não posso vencer. Como você ficou tão forte?",
- "2": "Não me desviarei do meu caminho escolhido.",
- "3": "O Campeão está ansioso para te conhecer."
- },
- "defeat": {
- "1": "Isso era o que eu esperava.",
- "2": "Bem, isso foi relativamente divertido.",
- "3": "Venha me visitar a qualquer momento."
- }
- },
- "milo": {
- "encounter": {
- "1": "Parece que você entende bem os Pokémon. \n$Isso vai ser uma batalha e tanto! \n$Vou ter que usar a Dynamax no meu Pokémon se eu quiser vencer!"
- },
- "victory": {
- "1": "O poder da Grama murchou… Que desafiadora incrível!"
- },
- "defeat": {
- "1": "Isso realmente vai te deixar em choque e admiração."
- }
- },
- "lucian": {
- "encounter": {
- "1": "Só um momento, por favor. O livro que estou lendo está quase no clímax emocionante… \n$O herói obteve uma espada mística e está prestes a enfrentar sua prova final… Ah, tanto faz. \n$Já que você chegou tão longe, vou deixar isso de lado e batalhar com você. \n$Deixe-me ver se você alcançará tanta glória quanto o herói do meu livro!"
- },
- "victory": {
- "1": "Eu vejo… Parece que você me colocou em xeque-mate."
- },
- "defeat": {
- "1": "Tenho uma reputação a manter."
- }
- },
- "drasna": {
- "encounter": {
- "1": "Você deve ser uma Treinadora forte. Sim, bastante forte…\n$Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!"
- },
- "victory": {
- "1": "Oh, meu Deus. Isso foi uma batalha rápida… Espero que você volte novamente algum dia!"
- },
- "defeat": {
- "1": "Como isso é possível?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "Então, aqui está você… Por que não vemos para quem os ventos favorecem hoje, você… ou eu?"
- },
- "victory": {
- "1": "É frustrante para mim como membro da Elite dos Quatro, mas parece que sua força é real."
- },
- "defeat": {
- "1": "Essa foi uma jogada de mestre!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "Prepare-se para aprender em primeira mão como é a respiração ardente de uma batalha feroz!"
- },
- "victory": {
- "1": "A sorte sorriu para mim desta vez, mas… \n$Julgando pelo andamento da luta, quem sabe se serei tão sortudo na próxima vez."
- },
- "defeat": {
- "1": "Essa foi uma jogada de mestre!"
- }
- },
- "blue": {
- "encounter": {
- "1": "Você deve ser muito boa para chegar tão longe."
- },
- "victory": {
- "1": "Só perdi para ele e agora para você… Ele? Hee, hee…"
- },
- "defeat": {
- "1": "Viu? Meu poder é o que me trouxe até aqui."
- }
- },
- "piers": {
- "encounter": {
- "1": "Prepare-se para uma mosh pit comigo e minha galera! Spikemuth, é hora de roquear!"
- },
- "victory": {
- "1": "Eu e minha equipe demos o nosso melhor. Vamos nos encontrar novamente para uma batalha algum dia…"
- },
- "defeat": {
- "1": "Minha garganta está desgastada de tanto gritar… Mas essa foi uma batalha empolgante!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "Oh… Seus Pokémon são impressionantes. Acho que vou gostar disso."
- },
- "victory": {
- "1": "Você é realmente forte. Vou ter que me esforçar muito mais também."
- },
- "defeat": {
- "1": "Eu nunca esperei ganhar."
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "Ainda sou o Campeão. Não vou segurar nada."
- },
- "victory": {
- "1": "Esta é a emergência de uma nova Campeã."
- },
- "defeat": {
- "1": "Defendi com sucesso meu Campeonato."
- }
- },
- "steven": {
- "encounter": {
- "1": "Diga-me… O que você viu na sua jornada com seus Pokémon? \n$O que você sentiu, encontrando tantos outros Treinadores por aí? \n$Viajar por esta terra rica… Isso despertou algo dentro de você? \n$Quero que você venha até mim com tudo o que aprendeu. \n$Meus Pokémon e eu responderemos com tudo o que sabemos!"
- },
- "victory": {
- "1": "Então eu, o Campeão, caio em derrota…"
- },
- "defeat": {
- "1": "Esse tempo foi bem gasto! Obrigado!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "Eu, Cynthia, aceito seu desafio! Não haverá nenhuma trégua da minha parte!"
- },
- "victory": {
- "1": "Não importa o quão divertida a batalha seja, ela sempre terminará algum dia…"
- },
- "defeat": {
- "1": "Mesmo que você perca, nunca perca o amor pelos Pokémon."
- }
- },
- "iris": {
- "encounter": {
- "1": "Sabe de uma coisa? Estou realmente ansiosa para ter batalhas sérias com Treinadores fortes! \n$Quero dizer, vamos lá! Os Treinadores que chegam aqui são Treinadores que desejam a vitória com todas as fibras do seu ser! \n$E eles estão batalhando ao lado de Pokémon que passaram por inúmeras batalhas difíceis! \n$Se eu batalhar com pessoas assim, não só eu ficarei mais forte, meus Pokémon também! \n$E nós vamos nos conhecer ainda melhor! OK! Prepare-se! \n$Sou Iris, a Campeã da Liga Pokémon, e vou te derrotar!"
- },
- "victory": {
- "1": "Aghhhh… Eu dei o meu melhor, mas nós perdemos…"
- },
- "defeat": {
- "1": "Yay! Nós vencemos!"
- }
- },
- "hau": {
- "encounter": {
- "1": "Eu me pergunto se um Treinador batalha de maneira diferente dependendo se ele é de uma região quente ou fria.\n$Vamos testar isso!"
- },
- "victory": {
- "1": "Isso foi incrível! Acho que entendi um pouco melhor seu estilo agora!"
- },
- "defeat": {
- "1": "Cara, essa foi uma batalha e tanto!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "Decidi entrar na batalha mais uma vez. \n$Venha agora… Mostre-me os frutos do seu treinamento."
- },
- "victory": {
- "1": "Estou ansiosa para notícias de todas as suas conquistas!"
- },
- "defeat": {
- "1": "Qual o problema? Isso é tudo?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "Yesss! Estou tão empolgada! Hora de soltar tudo!"
- },
- "victory": {
- "1": "Bem, isso foi ruim, mas ainda me diverti! Eu te pego na próxima!"
- },
- "defeat": {
- "1": "Bem, essa foi uma ótima batalha! Frutífera, com certeza."
- }
- },
- "leon": {
- "encounter": {
- "1": "Vamos ter um tempo absolutamente campeão!"
- },
- "victory": {
- "1": "Meu tempo como Campeão acabou… \n$Mas que tempo campeão foi! \n$Obrigado pela melhor batalha que já tive!"
- },
- "defeat": {
- "1": "Um tempo absolutamente campeão, foi!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "Eai! Você não acha que os Pokémon são, tipo, super fofos?"
- },
- "victory": {
- "1": "Waaah! Waaah! Você é tão má!"
- },
- "defeat": {
- "1": "E é isso!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "Hah! Você quer me desafiar? É corajosa ou apenas ignorante?"
- },
- "victory": {
- "1": "Você é forte! Por favor, me faça seu aprendiz?"
- },
- "defeat": {
- "1": "Aí está. Você percebe o quanto sou mais poderoso que você?"
- }
- },
- "katy": {
- "encounter": {
- "1": "Não baixe a guarda, a menos que queira se ver jogada no chão!"
- },
- "victory": {
- "1": "Todos os meus adoráveis Pokémon caíram como moscas!"
- },
- "defeat": {
- "1": "Coma, meu adorável Vivillon!"
- }
- },
- "pryce": {
- "encounter": {
- "1": "A juventude sozinha não garante a vitória! Experiência é o que conta."
- },
- "victory": {
- "1": "Excelente! Isso foi perfeito. Tente não esquecer o que sente agora."
- },
- "defeat": {
- "1": "Exatamente como eu imaginei."
- }
- },
- "clair": {
- "encounter": {
- "1": "Você sabe quem eu sou? E ainda se atreve a me desafiar?"
- },
- "victory": {
- "1": "Eu me pergunto até onde você pode ir com seu nível de habilidade. Isso deve ser fascinante."
- },
- "defeat": {
- "1": "E é isso."
- }
- },
- "maylene": {
- "encounter": {
- "1": "Vim desafiá-la agora e não vou segurar nada. \n$Por favor, prepare-se para a batalha!"
- },
- "victory": {
- "1": "Eu admito a derrota…"
- },
- "defeat": {
- "1": "Isso foi incrível."
- }
- },
- "fantina": {
- "encounter": {
- "1": "Você vai me desafiar, não é? Mas eu vou ganhar. \n$É o que a Líder do Ginásio de Hearthome faz, não?"
- },
- "victory": {
- "1": "Você é tão incrivelmente forte. Sei porque perdi."
- },
- "defeat": {
- "1": "Estou tão, tão, muito feliz!"
- }
- },
- "byron": {
- "encounter": {
- "1": "Treinadora! Você é jovem, assim como meu filho, Roark. \n$Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! \n$Então, como uma parede para os jovens, aceitarei seu desafio!"
- },
- "victory": {
- "1": "Hmm! Meus Pokémon robustos--derrotados!"
- },
- "defeat": {
- "1": "Gwahahaha! Como foram meus Pokémon robustos?!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "Um costume antigo decidindo o destino de alguém. A batalha começa!"
- },
- "victory": {
- "1": "Crie seu próprio caminho. Não deixe nada te atrapalhar. Seu destino, seu futuro."
- },
- "defeat": {
- "1": "Nosso caminho está claro agora."
- }
- },
- "volkner": {
- "encounter": {
- "1": "Já que você chegou tão longe, deve ser bastante forte…\n$Espero que você seja a Treinadora que me faça lembrar como é divertido batalhar!"
- },
- "victory": {
- "1": "Você me venceu…\n$Seu desejo e a maneira nobre como seus Pokémon batalharam por você… \n$Eu até me senti emocionado durante nossa luta. Foi uma batalha muito boa."
- },
- "defeat": {
- "1": "Não foi nada chocante…\n$Isso não é o que eu queria!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "M'hm… Se eu ganhar esta batalha, sinto que posso desenhar um quadro diferente de qualquer outro. \n$OK! Posso ouvir minha musa da batalha claramente. Vamos direto ao ponto!",
- "2": "Claro, estou realmente orgulhoso de todos os meus Pokémon! \n$Bem agora… Vamos direto ao ponto!"
- },
- "victory": {
- "1": "Acabou? Minha musa me abandonou?",
- "2": "Hmm… Acabou! Você é incrível!"
- },
- "defeat": {
- "1": "Uau… É bonito de alguma forma, não é…",
- "2": "Às vezes ouço as pessoas dizerem que foi uma vitória feia. \n$Acho que se você está dando o seu melhor, qualquer vitória é bonita."
- }
- },
- "elesa": {
- "encounter": {
- "1": "C'est fini! Quando tenho certeza disso, sinto um choque elétrico percorrer meu corpo! \n$Quero sentir essa sensação, então agora meus amados Pokémon vão fazer sua cabeça girar!"
- },
- "victory": {
- "1": "Eu queria fazer sua cabeça girar, mas você me surpreendeu."
- },
- "defeat": {
- "1": "Isso foi insatisfatório de alguma forma… Você dará tudo de si na próxima vez?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "Finalmente é hora do confronto! Isso significa a batalha Pokémon que decide quem está no topo, certo? \n$Eu amo estar no topo! Porque você pode ver para sempre e sempre de lugares altos! \n$Então, que tal nós nos divertirmos?"
- },
- "victory": {
- "1": "Ser seu oponente na batalha é uma nova fonte de força para mim. Obrigada!"
- },
- "defeat": {
- "1": "Ganhar ou perder, você sempre ganha algo com uma batalha, certo?"
- }
- },
- "brycen": {
- "encounter": {
- "1": "Há também força em estar com outras pessoas e Pokémon. \n$Receber o apoio deles te fortalece. Vou te mostrar esse poder!"
- },
- "victory": {
- "1": "A maravilhosa combinação de você e seus Pokémon! Que amizade linda!"
- },
- "defeat": {
- "1": "Condições extremas realmente testam e treinam você!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "O que eu quero encontrar é um jovem Treinador que possa me mostrar um futuro brilhante. \n$Vamos batalhar com tudo o que temos: sua habilidade, minha experiência e o amor com que criamos nossos Pokémon!"
- },
- "victory": {
- "1": "Esse sentimento intenso que me invade após uma derrota… Não sei como descrevê-lo."
- },
- "defeat": {
- "1": "Harrumph! Sei que sua habilidade é maior que isso!"
- }
- },
- "grant": {
- "encounter": {
- "1": "Só há uma coisa que desejo. \n$Que, superando um ao outro, encontremos um caminho para alturas ainda maiores."
- },
- "victory": {
- "1": "Você é uma parede que não consigo superar!"
- },
- "defeat": {
- "1": "Não desista. \n$Isso é tudo o que realmente importa. \n$As lições mais importantes da vida são simples."
- }
- },
- "korrina": {
- "encounter": {
- "1": "Hora da grande aparição de Lady Korrina!"
- },
- "victory": {
- "1": "É o seu próprio ser que permite que seus Pokémon evoluam!"
- },
- "defeat": {
- "1": "Que batalha explosiva!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "Oh! Estou feliz por termos nos encontrado!"
- },
- "victory": {
- "1": "Sua paixão pela batalha me inspira!"
- },
- "defeat": {
- "1": "Parece que minha Máquina Treinadora-Crescer-Forte, Mach 2 está realmente funcionando!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "Oh, se não é uma jovem Treinadora… É adorável conhecê-la assim. \n$Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. \n$Uma elusiva Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte."
- },
- "victory": {
- "1": "Espero que você encontre coisas para sorrir amanhã…"
- },
- "defeat": {
- "1": "Oh meu Deus, que pena…"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "Sabe de uma coisa? Todos falamos muito sobre o que você aprende com as batalhas e os laços e tudo mais…\n$Mas realmente, eu só faço isso porque é divertido. \n$Quem se importa com o grandioso? Vamos batalhar!"
- },
- "victory": {
- "1": "Incrível! Sou duro como um iceberg, mas você me quebrou por completo!"
- },
- "defeat": {
- "1": "Lute comigo e é isso que acontece!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "Todo Treinador e Pokémon treina duro em busca da vitória. \n$Mas isso significa que seu oponente também está se esforçando para vencer. \n$No final, a partida é decidida por qual lado é capaz de liberar seu verdadeiro potencial."
- },
- "victory": {
- "1": "Estou feliz por poder lutar com você hoje!"
- },
- "defeat": {
- "1": "É uma ótima maneira de sentir meu próprio crescimento!"
- }
- },
- "bea": {
- "encounter": {
- "1": "Você tem um espírito inabalável que não será movido, não importa como você seja atacado? \n$Acho que vou testar isso, certo?"
- },
- "victory": {
- "1": "Senti o espírito de luta de seus Pokémon enquanto você os liderava na batalha."
- },
- "defeat": {
- "1": "Essa foi a melhor partida que alguém poderia esperar."
- }
- },
- "opal": {
- "encounter": {
- "1": "Deixe-me ver como você e seu Pokémon parceiro se comportam!"
- },
- "victory": {
- "1": "Seu rosa ainda está faltando, mas você é uma Treinadora excelente com Pokémon excelentes."
- },
- "defeat": {
- "1": "Muito ruim para você, eu acho."
- }
- },
- "bede": {
- "encounter": {
- "1": "Suponho que devo provar além de qualquer dúvida o quão patética você é e quão forte eu sou."
- },
- "victory": {
- "1": "Eu vejo… Bem, tudo bem. Eu não estava me esforçando muito de qualquer maneira."
- },
- "defeat": {
- "1": "Bom trabalho, eu suponho."
- }
- },
- "gordie": {
- "encounter": {
- "1": "Então, vamos acabar com isso."
- },
- "victory": {
- "1": "Eu só quero me enterrar em um buraco… Bem, acho que seria mais como cair daqui."
- },
- "defeat": {
- "1": "Batalhe como sempre faz, a vitória seguirá!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "A verdade é que, quando tudo está dito e feito… Eu realmente só quero me tornar Campeã por mim mesma! \n$Então, não leve para o pessoal quando eu chutar seu traseiro!"
- },
- "victory": {
- "1": "OK, então eu perdi… Mas consegui ver muitos dos pontos bons de você e seus Pokémon!"
- },
- "defeat": {
- "1": "Espero que você tenha gostado das nossas táticas de batalha."
- }
- },
- "raihan": {
- "encounter": {
- "1": "Vou derrotar o Campeão, vencer todo o torneio e provar ao mundo o quão forte o grande Raihan realmente é!"
- },
- "victory": {
- "1": "Eu pareço bem mesmo quando perco. \n$É uma verdadeira maldição. \n$Acho que é hora de mais uma selfie!"
- },
- "defeat": {
- "1": "Vamos tirar uma selfie para lembrar disso."
- }
- },
- "brassius": {
- "encounter": {
- "1": "Pressuponho que você está pronta? Que nossa obra de arte colaborativa comece!"
- },
- "victory": {
- "1": "Ahhh…avant-garde!"
- },
- "defeat": {
- "1": "Começarei uma nova peça imediatamente!"
- }
- },
- "iono": {
- "encounter": {
- "1": "Como você está se sentindo sobre esta batalha?\n$...\n$Vamos começar o show! Quão forte é o nossa desafiadora? \n$Eu não sei! Vamos descobrir juntos!"
- },
- "victory": {
- "1": "Você é tão chamativa e brilhante quanto um Raio do Trovão de 10.000.000 volts, amiga!"
- },
- "defeat": {
- "1": "Seus olhos são MEUS!"
- }
- },
- "larry": {
- "encounter": {
- "1": "Quando tudo está dito e feito, a simplicidade é mais forte."
- },
- "victory": {
- "1": "Uma porção de derrota, hein?"
- },
- "defeat": {
- "1": "Vou encerrar o dia."
- }
- },
- "ryme": {
- "encounter": {
- "1": "Vamos lá, baby! Me agite até os ossos!"
- },
- "victory": {
- "1": "Você é legal, minha amiga, você move minha ALMA!"
- },
- "defeat": {
- "1": "Até mais, baby!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "Tudo o que preciso fazer é garantir que o poder do meu Pokémon te arrependa até os ossos!"
- },
- "victory": {
- "1": "Sua paixão ardente... Eu meio que gosto, para ser honesto."
- },
- "defeat": {
- "1": "As coisas não esquentaram para você."
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "Você chegou até aqui, hein? Vamos ver se você pode lidar com meus Pokémon!",
- "2": "Vou dar o meu melhor, mas não pense que vou pegar leve com você!"
- },
- "victory": {
- "1": "Não acredito que perdi... Mas você mereceu essa vitória. Bem feito!",
- "2": "Parece que ainda tenho muito a aprender. Porém, grande batalha!"
- },
- "defeat": {
- "1": "Você lutou bem, mas eu tenho a vantagem! Melhor sorte na próxima vez!",
- "2": "Parece que meu treinamento valeu a pena. Obrigado pela batalha!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "As marés estão mudando a meu favor. Pronta para ser levada pela corrente?",
- "2": "Vamos fazer ondas com esta batalha! Espero que esteja preparada!"
- },
- "victory": {
- "1": "Você navegou nessas águas perfeitamente... Bem feito!",
- "2": "Parece que minhas correntes não foram páreo para você. Bom trabalho!"
- },
- "defeat": {
- "1": "A água sempre encontra um caminho. Essa foi uma batalha refrescante!",
- "2": "Você lutou bem, mas o poder do oceano é imparável!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "Prepare-se! Meu espírito de luta brilha intensamente!",
- "2": "Vamos ver se você consegue acompanhar meu ritmo implacável!"
- },
- "victory": {
- "1": "Sua força... É impressionante. Você realmente merece essa vitória.",
- "2": "Nunca senti essa intensidade antes. Trabalho incrível!"
- },
- "defeat": {
- "1": "Outra vitória para meu rigoroso regime de treinamento! Bem feito!",
- "2": "Você tem força, mas eu treinei mais. Grande batalha!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "As sombras caem... Você está pronta para enfrentar seus medos?",
- "2": "Vamos ver se você pode lidar com a escuridão que eu comando."
- },
- "victory": {
- "1": "Você dissipou as sombras... Por enquanto. Bem feito.",
- "2": "Sua luz atravessou minha escuridão. Ótimo trabalho."
- },
- "defeat": {
- "1": "As sombras falaram... Sua força não é suficiente.",
- "2": "A escuridão triunfa... Talvez na próxima vez você veja a luz."
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "Tempestade se formando! Vamos ver se você aguenta essa luta!",
- "2": "Prepare-se para enfrentar o olho da tempestade!"
- },
- "victory": {
- "1": "Você enfrentou a tempestade... Trabalho incrível!",
- "2": "Você navegou nos ventos perfeitamente... Grande batalha!"
- },
- "defeat": {
- "1": "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!",
- "2": "Você foi pega na minha tempestade! Melhor sorte na próxima vez!"
- }
- },
- "alder": {
- "encounter": {
- "1": "Se prepare para uma batalha contra o Treinador mais forte de Unova!"
- },
- "victory": {
- "1": "Muito bem! Você certamente é um talento incomparável."
- },
- "defeat": {
- "1": "Um vento fresco sopra em meu coração...\n$Que esforço extraordinário!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "Através do trabalho duro, eu me torno cada vez mais forte!\n$Eu não perco."
- },
- "victory": {
- "1": "Eu não acredito...\n$Que batalha divertida e emocionante!"
- },
- "defeat": {
- "1": "Uau, que batalha!\n$Hora de você treinar ainda mais."
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}Eai, estava procurando você! Sabia que você estava ansiosa para começar, mas esperava pelo menos um tchau…\n$@c{smile_eclosed}Então você está realmente perseguindo seu sonho, hein?\n Quase não consigo acreditar.\n$@c{serious_smile_fists}Já que estamos aqui, que tal uma batalha?\nAfinal, quero ter certeza de que você está pronta.\n$@c{serious_mopen_fists}Não se segure, quero que você dê tudo de si!"
- },
- "victory": {
- "1": "@c{shock}Caramba… Você me limpou.\nVocê é mesmo uma novata?\n$@c{smile}Talvez tenha sido um pouco de sorte, mas…\nQuem sabe você consiga chegar até o fim.\n$Aliás, o professor me pediu para te dar esses itens. Eles parecem bem legais.\n$@c{serious_smile_fists}Boa sorte lá fora!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}Aí está você! Procurei você em todo lugar!\n@c{angry_mopen}Esqueceu de se despedir da sua melhor amiga?\n$@c{smile_ehalf}Você está indo atrás do seu sonho, né?\nEsse dia realmente chegou, não é…\n$@c{smile}Enfim, vou te perdoar por ter me esquecido, mas com uma condição. @c{smile_wave_wink}Você tem que lutar comigo!\n$@c{angry_mopen}Dê o seu melhor! Não quer que sua aventura acabe antes de começar, né?"
- },
- "victory": {
- "1": "@c{shock}Você acabou de começar e já está tão forte?!@d{96}\n@c{angry}Você trapaceou, não foi?\n$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile_eclosed}Eu perdi de forma justa… Tenho a sensação de que você vai se sair muito bem lá fora.\n$@c{smile}Aliás, o professor pediu para eu te dar alguns itens. Espero que sejam úteis!\n$@c{smile_wave}Dê o seu melhor, como sempre! Eu acredito em você!"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}Eai, você também está aqui?\n@c{smile_eclosed}Ainda com um recorde perfeito, hein…?\n$@c{serious_mopen_fists}Sei que parece que eu te segui até aqui, mas isso não é totalmente verdade.\n$@c{serious_smile_fists}Sinceramente, tenho estado ansioso por uma revanche desde que você me venceu em casa.\n$Tenho treinado bastante, então vou dar uma luta difícil desta vez.\n$@c{serious_mopen_fists}Não se segure, assim como antes!\nVamos lá!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}Ah. Acho que fui confiante demais.\n$@c{smile}Tudo bem, no entanto. Eu imaginei que isso poderia acontecer.\n@c{serious_mopen_fists}Isso só significa que preciso me esforçar mais para a próxima vez!\n\n$@c{smile}Ah, não que você precise realmente de ajuda, mas eu tinha um extra desses itens e pensei que você poderia querer.\n$@c{serious_smile_fists}Não espere outro depois deste!\nNão posso continuar dando vantagem ao meu oponente.\n$@c{smile}Enfim, cuide-se, e aproveite o evento!"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}Oh, que surpresa te encontrar aqui. Parece que você ainda está invicta. @c{angry_mopen}Hum… Nada mal!\n$@c{angry_mopen}Eu sei o que você está pensando, e não, eu não estava te espionando. @c{smile_eclosed}Acontece que eu estava na área.\n$@c{smile_ehalf}Estou feliz por você, mas só quero te avisar que está tudo bem perder às vezes.\n$@c{smile}Aprendemos com nossos erros, muitas vezes mais do que se continuássemos vencendo.\n$@c{angry_mopen}De qualquer forma, tenho treinado duro para nossa revanche, então é melhor você dar o seu melhor!"
- },
- "victory": {
- "1": "@c{neutral}Eu… não era para eu perder dessa vez…\n$@c{smile}Ah bem. Isso só significa que vou ter que treinar ainda mais para a próxima vez!\n$@c{smile_wave}Também consegui mais dois desses para você!\n@c{smile_wave_wink}Não precisa me agradecer~.\n$@c{angry_mopen}Estes são os últimos, hein! Você não vai ganhar mais nenhum presente de mim depois desse!\n$@c{smile_wave}Continue assim, e aproveite o evento!"
- },
- "defeat": {
- "1": "Está tudo bem perder às vezes…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}Eai, olha quem é! Faz um tempo.\n@c{neutral}Você… ainda está invicta? Hum.\n$@c{neutral_eclosed}As coisas têm sido meio… estranhas.\nNão é a mesma coisa em casa sem você.\n$@c{serious}Eu sei que é egoísta, mas preciso desabafar.\n@c{neutral_eclosed}Acho que você está se metendo em algo grande demais aqui.\n$@c{serious}Nunca perder é irrealista.\nPrecisamos perder às vezes para crescer.\n$@c{neutral_eclosed}Você teve uma grande jornada, mas ainda há muito pela frente, e só vai ficar mais difícil. @c{neutral}Você está preparada para isso?\n$@c{serious_mopen_fists}Se sim, prove para mim."
- },
- "victory": {
- "1": "@c{angry_mhalf}Isso é ridículo… Eu mal parei de treinar…\nComo ainda estamos tão distantes?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}Quanto tempo! Ainda não perdeu, né.\n@c{angry}Você está começando a me irritar. @c{smile_wave_wink}Brincadeirinha!\n$@c{smile_ehalf}Mas sério, você não sente saudades de casa? Ou… de mim?\nEu… Eu quero dizer, sentimos muito a sua falta.\n$@c{smile_eclosed}Eu apoio o seu sonho e tudo mais, mas a realidade é que você vai perder mais cedo ou mais tarde.\n$@c{smile}E quando isso acontecer, estarei lá para você, como sempre.\n@c{angry_mopen}Agora, deixe-me mostrar o quão forte eu me tornei!"
- },
- "victory": {
- "1": "@c{shock}Depois de tudo isso… não foi o suficiente…?\nVocê nunca vai voltar a esse ritmo…"
- },
- "defeat": {
- "1": "Você deu o seu melhor, agora vamos para casa."
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}Oi.\n$Não vou enrolar com você.\n@c{neutral_eclosed}Estou aqui para vencer, simples assim.\n$@c{serious_mhalf_fists}Aprendi a maximizar meu potencial dedicando todo o meu tempo ao treino.\n$@c{smile}Você ganha muito tempo extra quando corta o sono e a interação social desnecessários.\n$@c{serious_mopen_fists}Nada disso importa mais, não até eu vencer.\n$@c{neutral_eclosed}Cheguei ao ponto de não perder mais.\n@c{smile_eclosed}Acho que sua filosofia não estava tão errada afinal.\n$@c{angry_mhalf}Perder é para os fracos, e eu não sou mais fraco.\n$@c{serious_mopen_fists}Prepare-se."
- },
- "victory": {
- "1": "@c{neutral}O que…@d{64} O que é você?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}Sou eu! Você não esqueceu de mim de novo… esqueceu?\n$@c{smile}Você deveria se orgulhar de até onde chegou. Parabéns!\nMas parece que é o fim da sua jornada.\n$@c{smile_eclosed}Você despertou algo em mim que eu nunca soube que existia.\nParece que agora tudo o que faço é treinar.\n$@c{smile_ehalf}Eu mal como ou durmo agora, só treino meus Pokémon o dia todo, ficando mais forte a cada vez.\n$@c{neutral}Na verdade, eu… mal me reconheço.\n$E agora, finalmente atingi o desempenho máximo.\nNão acho que alguém poderia me vencer agora.\n$E sabe de uma coisa? É tudo por sua causa.\n@c{smile_ehalf}Eu não sei se te agradeço ou te odeio.\n$@c{angry_mopen}Prepare-se."
- },
- "victory": {
- "1": "@c{neutral}O que…@d{64} O que é você?"
- },
- "defeat": {
- "1": "$@c{smile}Você deveria se orgulhar de até onde chegou."
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}Nos encontramos de novo.\n$@c{neutral}Tive um tempo para refletir sobre tudo isso.\nHá uma razão para tudo isso parecer tão estranho.\n$@c{neutral_eclosed}Seu sonho, minha vontade de te vencer…\nTudo faz parte de algo maior.\n$@c{serious}Isso não é sobre mim, nem sobre você… É sobre o mundo, @c{serious_mhalf_fists}e é meu propósito te levar ao limite.\n$@c{neutral_eclosed}Se cumpri esse propósito, não posso dizer, mas fiz tudo ao meu alcance.\n$@c{neutral}Este lugar em que acabamos é assustador… Mas de alguma forma me sinto indiferente, como se já tivesse estado aqui antes.\n$@c{serious_mhalf_fists}Você sente o mesmo, não sente?\n$@c{serious}…é como se algo aqui estivesse falando comigo.\nIsso é tudo o que o mundo conhece há muito tempo.\n$Aqueles momentos que apreciamos juntos que parecem tão recentes não passam de uma memória distante.\n$@c{neutral_eclosed}Quem pode dizer se eles foram realmente reais em primeiro lugar.\n$@c{serious_mopen_fists}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é a única que pode fazer isso.\n$@c{serious_smile_fists}Eu mal sei o que tudo isso significa, só sei que é verdade.\n$@c{serious_mopen_fists}Se você não pode me derrotar aqui e agora, você não terá chance."
- },
- "victory": {
- "1": "@c{smile_eclosed}Parece que meu trabalho aqui está feito.\n$Quero que você me prometa uma coisa.\n@c{smile}Depois que curar o mundo, por favor, volte para casa."
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}Então somos só nós de novo.\n$@c{smile_eclosed}Sabe, continuo pensando nisso…\n$@c{smile_ehalf}Há algo nisso tudo, por que tudo parece tão estranho agora…\n$@c{smile}Você tem seu sonho, e eu tenho essa ambição em mim…\n$Não consigo evitar sentir que há um propósito maior em tudo isso, no que estamos fazendo, você e eu.\n$@c{smile_eclosed}Acho que devo te levar ao limite.\n$@c{smile_ehalf}Não tenho certeza se estou fazendo um bom trabalho nisso, mas tentei meu melhor até agora.\n$Há algo neste lugar estranho e terrível… Tudo parece tão claro…\n$Isso… é tudo o que o mundo conhece há muito tempo.\n$@c{smile_eclosed}É como se eu mal pudesse lembrar das memórias que apreciamos juntos.\n$@c{smile_ehalf}Elas foram reais? Elas parecem tão distantes agora…\n$@c{angry_mopen}Você precisa continuar empurrando, porque se não o fizer, isso nunca vai acabar. Você é o único que pode fazer isso.\n$@c{smile_ehalf}Eu… não sei o que tudo isso significa… mas sinto que é verdade.\n$@c{neutral}Se você não pode me derrotar aqui e agora, você não terá chance."
- },
- "victory": {
- "1": "@c{smile_ehalf}Eu… acho que cumpri meu propósito…\n$@c{smile_eclosed}Prometa-me… Depois que curar o mundo… Por favor… volte para casa.\n$@c{smile_ehalf}…Obrigada."
- }
- }
-}
diff --git a/src/locales/pt_BR/dialogue-final-boss-female.json b/src/locales/pt_BR/dialogue-final-boss-female.json
deleted file mode 100644
index 7f7c04acaff..00000000000
--- a/src/locales/pt_BR/dialogue-final-boss-female.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe?\n$Você foi atraída para cá, porque já esteve aqui antes.\nInúmeras vezes.\n$Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu {{cycleCount}}º ciclo.\n$A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos \"eus\" permanecem.\n$Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n\n$Você é a única aqui, embora pareça haver... outro.\n$Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios?\n$Vamos começar.",
- "firstStageWin": "Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar.\n$Não me decepcione.",
- "secondStageWin": "…Magnífico."
-}
\ No newline at end of file
diff --git a/src/locales/pt_BR/dialogue-final-boss-male.json b/src/locales/pt_BR/dialogue-final-boss.json
similarity index 55%
rename from src/locales/pt_BR/dialogue-final-boss-male.json
rename to src/locales/pt_BR/dialogue-final-boss.json
index 0a261ba151e..7009f00db5b 100644
--- a/src/locales/pt_BR/dialogue-final-boss-male.json
+++ b/src/locales/pt_BR/dialogue-final-boss.json
@@ -1,5 +1,6 @@
{
"encounter": "Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe?\n$Você foi atraído para cá, porque já esteve aqui antes.\nInúmeras vezes.\n$Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu {{cycleCount}}º ciclo.\n$A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos \"eus\" permanecem.\n$Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n\n$Você é o único aqui, embora pareça haver... outro.\n$Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios?\n$Vamos começar.",
+ "encounter_female": "Parece que a hora finalmente chegou novamente.\nVocê sabe por que veio aqui, não sabe?\n$Você foi atraída para cá, porque já esteve aqui antes.\nInúmeras vezes.\n$Embora talvez isso possa ser contado.\nPara ser preciso, este é de fato o seu {{cycleCount}}º ciclo.\n$A cada ciclo, sua mente retorna ao seu estado anterior.\nMesmo assim, de alguma forma, vestígios de seus antigos \"eus\" permanecem.\n$Até agora, você ainda não conseguiu, mas sinto uma presença diferente em você desta vez.\n\n$Você é a única aqui, embora pareça haver... outro.\n$Você finalmente vai se mostrar um desafio formidável para mim?\nO desafio que anseio há milênios?\n$Vamos começar.",
"firstStageWin": "Entendo. A presença que senti era realmente real.\nParece que não preciso mais me segurar.\n$Não me decepcione.",
"secondStageWin": "…Magnífico."
}
\ No newline at end of file
diff --git a/src/locales/pt_BR/dialogue-misc-female.json b/src/locales/pt_BR/dialogue-misc-female.json
deleted file mode 100644
index 761570a7f80..00000000000
--- a/src/locales/pt_BR/dialogue-misc-female.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora.\n$@c{smile}Acabou.@d{64} Você quebrou o ciclo.\n$@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez.\n$@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é?\n$@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações.\n$@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa.\n$@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver disposta.",
- "ending_female": "@c{shock}Você está de volta?@d{32} Isso significa que…@d{96} você venceu?!\n@c{smile_ehalf}Eu deveria saber que você conseguiria.\n$@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo.\n$@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez.\n$Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer!\n$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações.\n$@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar.\n$Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?",
- "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.",
- "ending_name": "Desenvolvedores"
-}
\ No newline at end of file
diff --git a/src/locales/pt_BR/dialogue-misc-male.json b/src/locales/pt_BR/dialogue-misc-male.json
deleted file mode 100644
index 18eb2ba8c91..00000000000
--- a/src/locales/pt_BR/dialogue-misc-male.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "ending": "@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora.\n$@c{smile}Acabou.@d{64} Você quebrou o ciclo.\n$@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez.\n$@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é?\n$@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações.\n$@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa.\n$@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver disposto.",
- "ending_female": "@c{shock}Você está de volta?@d{32} Isso significa que…@d{96} você venceu?!\n@c{smile_ehalf}Eu deveria saber que você conseguiria.\n$@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo.\n$@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez.\n$Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer!\n$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações.\n$@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar.\n$Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?",
- "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.",
- "ending_name": "Desenvolvedores"
-}
\ No newline at end of file
diff --git a/src/locales/pt_BR/dialogue-misc.json b/src/locales/pt_BR/dialogue-misc.json
new file mode 100644
index 00000000000..10e50aaa7e1
--- /dev/null
+++ b/src/locales/pt_BR/dialogue-misc.json
@@ -0,0 +1,6 @@
+{
+ "ending": "@c{shock}Você está de volta?@d{32} Isso significa que…@d{96} você venceu?!\n@c{smile_ehalf}Eu deveria saber que você conseguiria.\n$@c{smile_eclosed}Claro… Eu sempre tive essa sensação.\n@c{smile}Acabou agora, certo? Você quebrou o ciclo.\n$@c{smile_ehalf}Você também realizou seu sonho, não foi?\nVocê não perdeu nenhuma vez.\n$Eu serei a única a lembrar o que você fez.\n@c{angry_mopen}Eu tentarei não esquecer!\n$@c{smile_wave_wink}Brincadeirinha!@d{64} @c{smile}Eu nunca esqueceria.@d{32}\nSua lenda viverá em nossos corações.\n$@c{smile_wave}De qualquer forma,@d{64} está ficando tarde…@d{96} Eu acho?\nÉ difícil dizer neste lugar.\n$Vamos para casa. @c{smile_wave_wink}Talvez amanhã possamos ter outra batalha, pelos velhos tempos?",
+ "ending_female": "@c{smile}Oh? Você venceu?@d{96} @c{smile_eclosed}Acho que eu deveria saber.\nMas, você está de volta agora.\n$@c{smile}Acabou.@d{64} Você quebrou o ciclo.\n$@c{serious_smile_fists}Você também realizou seu sonho, não é?\nVocê não perdeu nenhuma vez.\n$@c{neutral}Eu sou o único que vai lembrar o que você fez.@d{96}\nAcho que está tudo bem, não é?\n$@c{serious_smile_fists}Sua lenda sempre viverá em nossos corações.\n$@c{smile_eclosed}Enfim, já tive o suficiente deste lugar, não é? Vamos para casa.\n$@c{serious_smile_fists}Talvez quando voltarmos, possamos ter outra batalha?\nSe você estiver disposto.",
+ "ending_endless": "Parabéns por alcançar o final atual!\nMais conteúdo chegará em breve.",
+ "ending_name": "Desenvolvedores"
+}
diff --git a/src/locales/pt_BR/dialogue-male.json b/src/locales/pt_BR/dialogue.json
similarity index 87%
rename from src/locales/pt_BR/dialogue-male.json
rename to src/locales/pt_BR/dialogue.json
index 2978bb9a6a5..2f39442ee5a 100644
--- a/src/locales/pt_BR/dialogue-male.json
+++ b/src/locales/pt_BR/dialogue.json
@@ -3,17 +3,21 @@
"encounter": {
"1": "Eai, quer batalhar?",
"2": "Você também é um treinador novo?",
+ "2_female": "Você também é uma treinadora nova?",
"3": "Eai, nunca te vi antes. Vamos batalhar!",
"4": "Acabei de perder, então estou tentando encontrar mais Pokémon.\nEspera! Você parece fraco! Vamos batalhar!",
+ "4_female": "Acabei de perder, então estou tentando encontrar mais Pokémon.\nEspera! Você parece fraca! Vamos batalhar!",
"5": "A gente já se conheceu antes? Não lembro muito bem. Enfim, prazer te conhecer!",
"6": "Beleza! Vamos nessa!",
"7": "Beleza! Lá vou eu! Vou te mostrar meu poder!",
"8": "Hahaha... Vou te mostrar o quão incríveis são meus Pokémon!",
"9": "Sem perder tempo com cumprimentos. Vamos logo, quando estiver pronto!",
+ "9_female": "Sem perder tempo com cumprimentos. Vamos logo, quando estiver pronta!",
"10": "Não baixe a guarda, ou você pode acabar chorando quando uma criança te vencer.",
"11": "Eu criei meus Pokémon com muito cuidado. Você não tem permissão para machucá-los!",
"12": "Que bom que você chegou! Não vai ser fácil daqui pra frente.",
- "13": "As batalhas continuam para sempre! Bem-vindo ao mundo sem fim!"
+ "13": "As batalhas continuam para sempre! Bem-vinda ao mundo sem fim!",
+ "13_female": "As batalhas continuam para sempre! Bem-vindo ao mundo sem fim!"
},
"victory": {
"1": "Uau! Você é forte!",
@@ -21,6 +25,7 @@
"3": "Vou te encontrar de novo quando for mais velho e te vencer!",
"4": "Ugh. Não tenho mais Pokémon.",
"5": "Não acredito… NÃO ACREDITO! Como pude perder de novo…",
+ "5_female": "Não acredito… NÃO ACREDITO! Como pude de novo…",
"6": "Não! Eu perdi!",
"7": "Uau! Você é incrível! Estou surpreso!",
"8": "Pode ser… Como… Eu e meus Pokémon somos os mais fortes, porém…",
@@ -35,10 +40,12 @@
"encounter": {
"1": "Vamos batalhar, pode ser?",
"2": "Você parece um treinador novo. Vamos batalhar!",
+ "2_female": "Você parece uma treinadora nova. Vamos batalhar!",
"3": "Não te reconheço. Que tal uma batalha?",
"4": "Vamos ter uma batalha Pokémon divertida!",
"5": "Vou te mostrar como realmente usar Pokémon!",
"6": "Uma batalha séria começa com um começo sério! Tem certeza que está pronto?",
+ "6_female": "Uma batalha séria começa com um começo sério! Tem certeza que está pronta?",
"7": "Você só é jovem uma vez. E só tem uma chance em cada batalha. Logo, você será apenas uma memória.",
"8": "Vai com calma comigo, tá? Mas vou lutar sério!",
"9": "A escola é chata. Não tenho nada para fazer. Só estou batalhando para passar o tempo."
@@ -52,6 +59,7 @@
"6": "Sério, eu perdi. Isso é, tipo, seriamente deprimente, mas você foi seriamente legal.",
"7": "Não preciso de memórias como essa. Deletando memória…",
"8": "Ei! Eu te disse para pegar leve comigo! Mesmo assim, você é legal quando fica sério.",
+ "8_female": "Ei! Eu te disse para pegar leve comigo! Mesmo assim, você é legal quando fica séria.",
"9": "Estou realmente cansando de batalhar… Deve haver algo novo para fazer…"
}
},
@@ -150,7 +158,9 @@
"1": "Sim… Você tem bons Pokémon…",
"2": "O quê?! Mas sou um gênio das batalhas!",
"3": "Claro, você é o personagem principal!",
- "4": "OK! OK! Você poderia ser um Treinador Ás!"
+ "3_female": "Claro, você é a personagem principal!",
+ "4": "OK! OK! Você poderia ser um Treinador Ás!",
+ "4_female": "OK! OK! Você poderia ser uma Treinador Ás!"
},
"defeat": {
"1": "Estou dedicando corpo e alma às batalhas de Pokémon!",
@@ -171,7 +181,8 @@
"encounter": {
"1": "Prepare-se, porque quando nos unimos, é o dobro do problema!",
"2": "Dois corações, uma estratégia – vamos ver se você consegue acompanhar nosso poder de gêmeos!",
- "3": "Espero que esteja pronto para o dobro do problema, porque estamos prestes a causar!"
+ "3": "Espero que esteja pronto para o dobro do problema, porque estamos prestes a causar!",
+ "3_female": "Espero que esteja pronta para o dobro do problema, porque estamos prestes a causar!"
},
"victory": {
"1": "Podemos ter perdido essa rodada, mas nosso vínculo permanece inquebrável!",
@@ -199,7 +210,8 @@
"black_belt": {
"encounter": {
"1": "Elogio sua coragem ao me desafiar! Pois eu sou o que tem o chute mais forte!",
- "2": "Oh, entendo. Você gostaria de ser cortado em pedaços? Ou prefere o papel de saco de pancadas?"
+ "2": "Oh, entendo. Você gostaria de ser cortado em pedaços? Ou prefere o papel de saco de pancadas?",
+ "2_female": "Oh, entendo. Você gostaria de ser cortada em pedaços? Ou prefere o papel de saco de pancadas?"
},
"victory": {
"1": "Oh. Os Pokémon fizeram a luta. Meu chute forte não ajudou em nada.",
@@ -310,7 +322,8 @@
},
"defeat": {
"1": "New age se refere simplesmente aos compositores clássicos do século XX, certo?",
- "2": "Não fique preso na tristeza ou frustração. Você pode usar seus rancores para se motivar."
+ "2": "Não fique preso na tristeza ou frustração. Você pode usar seus rancores para se motivar.",
+ "2_female": "Não fique presa na tristeza ou frustração. Você pode usar seus rancores para se motivar."
}
},
"psychic": {
@@ -341,7 +354,8 @@
},
"baker": {
"encounter": {
- "1": "Espero que esteja pronto para saborear a derrota!"
+ "1": "Espero que esteja pronto para saborear a derrota!",
+ "1_female": "Espero que esteja pronta para saborear a derrota!"
},
"victory": {
"1": "Vou assar uma revanche."
@@ -371,7 +385,8 @@
"encounter": {
"1": "Mano, você vai andar na prancha se perder!",
"2": "Vem com tudo! Sou um marinheiro com orgulho!",
- "3": "Ahoy marujo! Tá enjoado, é?!"
+ "3": "Ahoy marujo! Tá enjoado, é?!",
+ "3_female": "Ahoy maruja! Tá enjoada, é?!"
},
"victory": {
"1": "Argh! Perdi pra uma criança!",
@@ -399,6 +414,7 @@
},
"victory": {
"1": "Uau, você é forte. Que desperdício. Se você se juntasse à Equipe Rocket, poderia se tornar um Executivo.",
+ "1_female": "Uau, você é forte. Que desperdício. Se você se juntasse à Equipe Rocket, poderia se tornar uma Executiva.",
"2": "Eu... Eu estou arrasada...",
"3": "Aaaieeeee! Isso não pode estar acontecendo! Eu lutei muito, mas ainda perdi…"
}
@@ -436,7 +452,8 @@
"victory": {
"1": "Hehehe! Você pode ter me derrotado, mas não tem chance contra o Chefe! Se você se perder agora, não terá que enfrentar uma surra sonora!",
"2": "Hehehe... Então, eu também perdi...",
- "3": "Ahya! Como isso pode ser? Para um Admin como eu perder para um treinador qualquer..."
+ "3": "Ahya! Como isso pode ser? Para um Admin como eu perder para um treinador qualquer...",
+ "3_female": "Ahya! Como isso pode ser? Para um Admin como eu perder para uma treinadora qualquer..."
}
},
"courtney": {
@@ -454,13 +471,15 @@
"shelly": {
"encounter": {
"1": "Ahahahaha! Você vai se meter nos assuntos da Equipe Aqua? Você é absolutamente destemido, simplesmente ignorante ou ambos! Você é tão fofo que chega a ser nojento! Vou te derrubar",
+ "1_female": "Ahahahaha! Você vai se meter nos assuntos da Equipe Aqua? Você é absolutamente destemida, simplesmente ignorante ou ambos! Você é tão fofa que chega a ser nojenta! Vou te derrubar",
"2": "O que é isso? Quem é essa criança mimada?",
"3": "Relaxe. Seja paciente. Vou te esmagar em breve."
},
"victory": {
"1": "Ahahahaha! Fomos surpreendidos inesperadamente! Estamos sem opções. Teremos que recuar. Mas esta não é a última vez que você verá a Equipe Aqua! Temos outros planos! Não se esqueça disso!",
"2": "Ahhh?! Fui muito fácil com você?!",
- "3": "Uh. Você está me dizendo que melhorou seu jogo ainda mais durante a luta? Você é um pirralho com um futuro brilhante… Meu Pokémon e eu não temos mais forças para lutar… Vá em frente… Vá e seja destruído por Archie."
+ "3": "Uh. Você está me dizendo que melhorou seu jogo ainda mais durante a luta? Você é um pirralho com um futuro brilhante… Meu Pokémon e eu não temos mais forças para lutar… Vá em frente… Vá e seja destruído por Archie.",
+ "3_female": "Uh. Você está me dizendo que melhorou seu jogo ainda mais durante a luta? Você é uma pirralha com um futuro brilhante… Meu Pokémon e eu não temos mais forças para lutar… Vá em frente… Vá e seja destruída por Archie."
}
},
"matt": {
@@ -472,14 +491,16 @@
"victory": {
"1": "Muito bem, até que o Chefe tenha tempo para você, serei seu oponente!",
"2": "Posso sentir! Posso sentir, tudo bem! A força saindo de você! Mais! Eu ainda quero mais! Mas parece que estamos sem tempo...",
- "3": "Isso foi divertido! Eu sabia que você me mostraria um bom tempo! Estou ansioso para enfrentá-lo novamente algum dia!"
+ "3": "Isso foi divertido! Eu sabia que você me mostraria um bom tempo! Estou ansioso para enfrentá-lo novamente algum dia!",
+ "3_female": "Isso foi divertido! Eu sabia que você me mostraria um bom tempo! Estou ansioso para enfrentá-la novamente algum dia!"
}
},
"mars": {
"encounter": {
"1": "Sou Mars, uma das principais Comandantes da Equipe Galáctica.",
"2": "A visão da Equipe Galáctica para o futuro é inabalável. A oposição será esmagada sem piedade!",
- "3": "Sentindo-se nervoso? Você deveria estar!"
+ "3": "Sentindo-se nervoso? Você deveria estar!",
+ "3_female": "Sentindo-se nervosa? Você deveria estar!"
},
"victory": {
"1": "Isso não pode estar acontecendo! Como eu perdi?!",
@@ -514,36 +535,45 @@
"zinzolin": {
"encounter": {
"1": "Você poderia se tornar uma ameaça para a Equipe Plasma, então vamos eliminá-lo aqui e agora!",
+ "1_female": "Você poderia se tornar uma ameaça para a Equipe Plasma, então vamos eliminá-la aqui e agora!",
"2": "Oh, pelo amor de Deus... Eu não esperava ter que lutar neste frio congelante!",
- "3": "Você é um treinador impressionante para ter chegado tão longe. Mas termina aqui."
+ "3": "Você é um treinador impressionante para ter chegado tão longe. Mas termina aqui.",
+ "3_female": "Você é uma treinadora impressionante para ter chegado tão longe. Mas termina aqui."
},
"victory": {
"1": "Ghetsis... Eu falhei com você...",
"2": "Está amargamente frio. Estou tremendo. Estou sofrendo. Ainda assim, estou vitorioso.",
- "3": "Hmph. Você é um treinador mais esperto do que eu esperava, mas não esperto o suficiente."
+ "3": "Hmph. Você é um treinador mais esperto do que eu esperava, mas não esperto o suficiente.",
+ "3_female": "Hmph. Você é uma treinadora mais esperta do que eu esperava, mas não esperta o suficiente."
}
},
"rood": {
"encounter": {
"1": "Você é uma ameaça para a Equipe Plasma. Não podemos deixá-lo ir embora daqui e agora!",
+ "1_female": "Você é uma ameaça para a Equipe Plasma. Não podemos deixá-la ir embora daqui e agora!",
"2": "Oh, este vento gelado... Eu nunca pensei que teria que lutar aqui!",
- "3": "Você é um treinador notável para ter chegado tão longe. Mas é aqui que termina."
+ "3": "Você é um treinador notável para ter chegado tão longe. Mas é aqui que termina.",
+ "3_female": "Você é uma treinadora notável para ter chegado tão longe. Mas é aqui que termina."
},
"victory": {
"1": "Ghetsis... Eu falhei em minha missão...",
"2": "O frio é penetrante. Estou tremendo. Estou sofrendo. Ainda assim, triunfei.",
- "3": "Hm. Você é um treinador talentoso, mas infelizmente não talentoso o suficiente."
+ "3": "Hm. Você é um treinador talentoso, mas infelizmente não talentoso o suficiente.",
+ "3_female": "Hm. Você é uma treinadora talentosa, mas infelizmente não talentosa o suficiente."
}
},
"xerosic": {
"encounter": {
"1": "Ah ha ha! Será um prazer. Vamos lá, pequeno treinador! Vamos ver o que você tem!",
+ "1_female": "Ah ha ha! Será um prazer. Vamos lá, pequena treinadora! Vamos ver o que você tem!",
"2": "Hmm... Você é mais poderoso do que parece. Eu me pergunto quanta energia há dentro de você.",
+ "2_female": "Hmm... Você é mais poderosa do que parece. Eu me pergunto quanta energia há dentro de você.",
"3": "Eu estava esperando por você! Preciso fazer uma pequena pesquisa sobre você! Vamos começar!"
},
"victory": {
"1": "Ah, você é bastante forte. Oh sim—muito forte, de fato.",
"2": "Ding-ding-ding! Você conseguiu! Ao vencedor, os despojos!",
+ "2_female": "Ding-ding-ding! Você conseguiu! À vencedora, os despojos!",
"3": "Maravilhoso! Incrível! Você tem uma tremenda habilidade e coragem!"
}
},
@@ -551,6 +581,7 @@
"encounter": {
"1": "Eu sou Bryony, e será um prazer lutar com você. Mostre-me o que você tem.",
"2": "Impressionante... Você é mais poderoso do que parece. Vamos ver a verdadeira extensão de sua energia.",
+ "2_female": "Impressionante... Você é mais poderosa do que parece. Vamos ver a verdadeira extensão de sua energia.",
"3": "Eu antecipei sua chegada. É hora de um pequeno teste. Vamos começar?"
},
"victory": {
@@ -563,9 +594,11 @@
"encounter": {
"1": "Se prepara pra encrenca!",
"2": "Estamos realizando um grande trabalho aqui! Cai fora, moleque!",
+ "2_female": "Estamos realizando um grande trabalho aqui! Cai fora, garota!",
"3": "Entregue seus Pokémon ou enfrente a ira da Equipe Rocket!",
"4": "Você está prestes a experimentar o verdadeiro terror da Equipe Rocket!",
- "5": "Ei, moleque! Eu sou um tipo de cara da Equipe Rocket!"
+ "5": "Ei, moleque! Eu sou um tipo de cara da Equipe Rocket!",
+ "5_female": "Ei, garota! Eu sou um tipo de cara da Equipe Rocket!"
},
"victory": {
"1": "Equipe Rocket decolando de novo!",
@@ -613,7 +646,8 @@
"2": "Presencie o poder da nossa tecnologia e o futuro que vislumbramos!",
"3": "Em nome da Equipe Galáctica, eliminarei qualquer um que ficar em nosso caminho!",
"4": "Prepare-se para perder!",
- "5": "Espero que você esteja pronto para uma surra cósmica!"
+ "5": "Espero que você esteja pronto para uma surra cósmica!",
+ "5_female": "Espero que você esteja pronta para uma surra cósmica!"
},
"victory": {
"1": "Fui amassado...",
@@ -803,7 +837,8 @@
},
"galactic_boss_cyrus_1": {
"encounter": {
- "1": "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!"
+ "1": "Você foi compelido a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!",
+ "1_female": "Você foi compelida a vir aqui por tal sentimentalismo vazio\nEu farei você se arrepender de ter ouvido seu coração!"
},
"victory": {
"1": "Interessante. E bastante curioso."
@@ -958,6 +993,7 @@
},
"victory": {
"1": "Você realmente é forte… Vou admitir que você é habilidoso…",
+ "1_female": "Você realmente é forte… Vou admitir que você é habilidosa…",
"2": "Hmm… Você sabe que só teve sorte, certo?!",
"3": "Uau, você é demais! Não acredito que me venceu!"
},
@@ -975,12 +1011,14 @@
},
"victory": {
"1": "Whoa! Seu time é de verdade, garoto!",
+ "1_female": "Whoa! Seu time é de verdade, garota!",
"2": "Uau, você é forte! Até meus truques elétricos perderam para você.",
"3": "Isso foi uma derrota absolutamente chocante!"
},
"defeat": {
"1": "Oh sim! Quando se trata de Pokémon do tipo Elétrico, sou o número um do mundo!",
"2": "Hahaha! Foi uma batalha eletrizante, garoto!",
+ "2_female": "Hahaha! Foi uma batalha eletrizante, garota!",
"3": "Uma batalha de Pokémon é guerra, e eu te mostrei combate em primeira mão!"
}
},
@@ -1059,7 +1097,8 @@
"encounter": {
"1": "Eu, o líder da Equipe Rocket, vou te fazer sentir um mundo de dor!",
"2": "Meu treinamento aqui será vital antes de enfrentar meus antigos associados novamente.",
- "3": "Não acho que você está preparado para o nível de fracasso que está prestes a experimentar!"
+ "3": "Não acho que você está preparado para o nível de fracasso que está prestes a experimentar!",
+ "3_female": "Não acho que você está preparada para o nível de fracasso que está prestes a experimentar!"
},
"victory": {
"1": "O QUE! Eu, perder?! Não tenho nada a dizer a você!",
@@ -1092,6 +1131,7 @@
"brawly": {
"encounter": {
"1": "Oh cara, um desafiante!\nVamos ver o que você pode fazer!",
+ "1_female": "Oh cara, uma desafiante!\nVamos ver o que você pode fazer!",
"2": "Você parece uma grande onda.\nVamos batalhar!",
"3": "Hora de criar uma tempestade!\nVamos!"
},
@@ -1119,6 +1159,7 @@
},
"defeat": {
"1": "Você está totalmente carregado agora!\nWahahahaha!",
+ "1_female": "Você está totalmente carregada agora!\nWahahahaha!",
"2": "Espero ver você faíscando em batalhas futuras!\nWahahahaha!",
"3": "Wahahahaha! Que batalha eletrizante!"
}
@@ -1165,6 +1206,7 @@
},
"victory": {
"1": "Você é o primeiro Treinador que vejo com mais graça do que eu.\nJogou excelentemente.",
+ "1_female": "Você é a primeira Treinadora que vejo com mais graça do que eu.\nJogou excelentemente.",
"2": "Oh, meus Pokémon Voadores despencaram!\nMuito bem.",
"3": "Embora eu tenha caído, meus Pokémon continuarão a voar!"
},
@@ -1177,6 +1219,7 @@
"tate": {
"encounter": {
"1": "Hehehe... Ficou surpreso de me ver sem minha irmã?",
+ "1_female": "Hehehe... Ficou surpresa de me ver sem minha irmã?",
"2": "Posso ver o que você está pensando...\nVocê quer batalhar!",
"3": "Como você pode derrotar alguém...\nQue sabe todos os seus movimentos?"
},
@@ -1194,6 +1237,7 @@
"liza": {
"encounter": {
"1": "Fufufu... Ficou surpreso de me ver sem meu irmão?",
+ "1_female": "Fufufu... Ficou surpresa de me ver sem meu irmão?",
"2": "Posso determinar o que você deseja...\nVocê quer batalhar, não quer?",
"3": "Como você pode derrotar alguém...\nQue é um com seus Pokémon?"
},
@@ -1265,8 +1309,10 @@
"nessa": {
"encounter": {
"1": "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-lo.",
+ "1_female": "Não importa que tipo de plano sua mente refinada possa estar tramando, meu parceiro e eu vamos afundá-la.",
"2": "Não estou aqui para conversar. Estou aqui para vencer!",
- "3": "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-lo!"
+ "3": "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-lo!",
+ "3_female": "Este é um pequeno presente dos meus Pokémon... Espero que você possa recebê-la!"
},
"victory": {
"1": "Você e seus Pokémon são demais...",
@@ -1287,6 +1333,7 @@
},
"victory": {
"1": "Você... Você é muito bom, hein?",
+ "1_female": "Você... Você é muito boa, hein?",
"2": "Se você encontrar Gordie por aí, certifique-se de dar uma boa surra nele, ok?",
"3": "Acho que você levou a quebra de gelo um pouco literalmente demais..."
},
@@ -1300,10 +1347,12 @@
"encounter": {
"1": "Você parece forte! Vamos começar!",
"2": "Sou forte como a amplitude do oceano. Você vai ser varrido, com certeza.",
+ "2_female": "Sou forte como a amplitude do oceano. Você vai ser varrida, com certeza.",
"3": "Oh ho, então estou enfrentando você! Isso é fora do comum."
},
"victory": {
"1": "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinador!",
+ "1_female": "Você foi incrível! Está criando alguns Pokémon incríveis. Você dominou a coisa de Treinadora!",
"2": "Você não apenas parece forte, você é forte de verdade! Eh, eu também fui varrido!",
"3": "Você é forte como uma onda impressionante!"
},
@@ -1316,6 +1365,7 @@
"shauntal": {
"encounter": {
"1": "Com licença. Você é um desafiante, certo?\nSou a usuária de Pokémon do tipo Fantasma da Elite dos Quatro, Shauntal, e serei sua oponente.",
+ "1_female": "Com licença. Você é uma desafiante, certo?\nSou a usuária de Pokémon do tipo Fantasma da Elite dos Quatro, Shauntal, e serei sua oponente.",
"2": "Adoro escrever sobre Treinadores que vêm aqui e os Pokémon que treinam.\nPosso usar você e seus Pokémon como tema?",
"3": "Cada pessoa que trabalha com Pokémon tem uma história para contar.\nQue história está prestes a ser contada?"
},
@@ -1333,6 +1383,7 @@
"marshal": {
"encounter": {
"1": "Meu mentor, Alder, vê seu potencial como Treinador e está interessado em você.\nMeu objetivo é testá-lo—levar você aos limites da sua força. Kiai!",
+ "1_female": "Meu mentor, Alder, vê seu potencial como Treinadora e está interessado em você.\nMeu objetivo é testá-la—levar você aos limites da sua força. Kiai!",
"2": "Vitória, vitória decisiva, é meu objetivo! Desafiante, aqui vou eu!",
"3": "Em mim mesmo, procuro desenvolver a força de um lutador e eliminar qualquer fraqueza em mim!\nPrevalecendo com a força de minhas convicções!"
},
@@ -1351,7 +1402,8 @@
"encounter": {
"1": "Você me lembra um velho amigo. Isso me deixa animado para essa batalha Pokémon!",
"2": "As batalhas Pokémon não têm sentido se você não pensa por que você batalha.\nOu melhor, isso torna as batalhas junto com Pokémon sem sentido.",
- "3": "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-lo."
+ "3": "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-lo.",
+ "3_female": "Meu nome é Cheren! Sou um Líder de Ginásio e professor! Prazer em conhecê-la."
},
"victory": {
"1": "Obrigado! Vi o que estava faltando em mim.",
@@ -1367,47 +1419,65 @@
"chili": {
"encounter": {
"1": "Ihuuu! Hora de brincar com FOGO!! Sou o mais forte dos nossos irmãos!",
+ "1_female": "Yeeeeeooow! Hora de brincar com FOGO!! Eu sou o mais forte de nós irmãos!",
"2": "Ta-da! O incendiário do tipo Fogo Chili—sou eu—será seu oponente!",
- "3": "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!"
+ "2_female": "Tcharan! O escaldante Chili tipo Fogo (sou eu) será seu oponente!",
+ "3": "Vou mostrar o que eu e meus tipos de Fogo podemos fazer!",
+ "3_female": "Vou te mostrar o que eu e meus ardentes tipo Fogo podemos fazer!"
},
"victory": {
"1": "Você me pegou. Estou... queimado...",
+ "1_female": "Você me pegou. Eu estou… queimado… esgotado…",
"2": "Uau! Você está pegando fogo!",
+ "2_female": "Uau! Você tá pegando fogo!",
"3": "Ai! Você me pegou!"
},
"defeat": {
"1": "Estou pegando fogo! Jogue comigo, e você se queimará!",
+ "1_female": "Estou pegando fogo! Brinque comigo e você vai se queimar!",
"2": "Quando você brinca com fogo, você se queima!",
- "3": "Quero dizer, vamos lá, seu oponente era eu! Você não tinha chance!"
+ "3": "Quero dizer, vamos lá, seu oponente era eu! Você não tinha chance!",
+ "3_female": "Quero dizer, fala sério, seu oponente era eu! Você não teve chance!"
}
},
"cilan": {
"encounter": {
"1": "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\nUm... Vamos batalhar, aconteça o que acontecer.",
+ "1_female": "Nada pessoal... Sem ressentimentos... Eu e meus Pokémon do tipo Grama vamos...\n$Hum... Nós iremos batalhar, aconteça o que acontecer.",
"2": "Então, hum, se você está bem comigo, vou, hum, colocar tudo o que tenho em ser, er, você sabe, seu oponente.",
- "3": "OK… Então, hum, eu sou o Cilan, gosto de Pokémon do tipo Grama."
+ "2_female": "Então, hum, se você estiver bem comigo, eu vou, hum, dar tudo o que tenho para ser, hum, você sabe, seu oponente.",
+ "3": "OK… Então, hum, eu sou o Cilan, gosto de Pokémon do tipo Grama.",
+ "3_female": "OK... Então, eu sou Cilan, eu gosto de Pokémon do tipo Grama."
},
"victory": {
"1": "Er... Acabou agora?",
+ "1_female": "Er… Já acabou?",
"2": "…Que surpresa. Você é muito forte, não é?\nAcho que meus irmãos também não teriam sido capazes de te derrotar...",
+ "2_female": "…Que surpresa. Você é muito forte, não é? \n$Eu acho que meus irmãos também não conseguiriam derrotar você…",
"3": "…Huh. Parece que meu timing estava, hum, errado?"
},
"defeat": {
"1": "Huh? Ganhei?",
+ "1_female": "Hein? Eu ganhei?",
"2": "Acho...\nSuponho que ganhei, porque competi com meus irmãos Chili e Cress, e todos conseguimos ficar mais fortes.",
- "3": "Foi... uma experiência bastante emocionante..."
+ "2_female": "Eu acho... \n$Eu acho que ganhei, porque eu estava competindo com meus irmãos Chili e Cress, e todos nós conseguimos ficar mais fortes.",
+ "3": "Foi... uma experiência bastante emocionante...",
+ "3_female": "Foi… foi uma experiência bastante emocionante…"
}
},
"roark": {
"encounter": {
"1": "Preciso ver seu potencial como Treinador. E, vou precisar ver a dureza dos Pokémon que batalham com você!",
+ "1_female": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!",
"2": "Vamos lá! Estes são meus Pokémon de pedra, meu orgulho e alegria!",
"3": "Pokémon do tipo Pedra são simplesmente os melhores!",
- "4": "Preciso ver seu potencial como Treinador. E, vou precisar ver a dureza dos Pokémon que batalham com você!"
+ "4": "Preciso ver seu potencial como Treinador. E, vou precisar ver a dureza dos Pokémon que batalham com você!",
+ "4_female": "Preciso ver seu potencial como Treinadora. E, vou precisar ver a dureza dos Pokémon que batalham com você!"
},
"victory": {
"1": "O-o que? Isso não pode ser! Meus Pokémon fortificados!",
"2": "...Perdemos o controle. Da próxima vez, gostaria de desafiá-lo a uma corrida de escavação de fósseis no subsolo.",
+ "2_female": "...Perdemos o controle. Da próxima vez, gostaria de desafiá-la a uma corrida de escavação de fósseis no subsolo.",
"3": "Com habilidade como a sua, é natural que você vença.",
"4": "O-o que?! Não pode ser! Nem isso foi suficiente?",
"5": "Eu estraguei tudo."
@@ -1430,6 +1500,7 @@
"victory": {
"1": "Ainda não sou bom o suficiente...",
"2": "Eu vejo... Sua jornada o levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...",
+ "2_female": "Eu vejo... Sua jornada a levou a lugares distantes e você testemunhou muito mais do que eu.\nEu invejo você por isso...",
"3": "Como isso é possível...",
"4": "Não acho que nossos potenciais sejam tão diferentes.\nMas você parece ter algo mais do que isso... Que seja.",
"5": "Acho que preciso de mais treinamento.",
@@ -1488,12 +1559,14 @@
"1": "Acho que deveria ter esperado por isso!"
},
"defeat": {
- "1": "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateado, mas não vá dar uma de Kieran comigo, OK?"
+ "1": "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateado, mas não vá dar uma de Kieran comigo, OK?",
+ "1_female": "Heh heh! Não ligue para mim, só pegando uma vitória aqui. Entendo se você estiver chateada, mas não vá dar uma de Kieran comigo, OK?"
}
},
"ramos": {
"encounter": {
- "1": "Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas?\n$A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronto para enfrentar tudo isso?"
+ "1": "Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas?\n$A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronto para enfrentar tudo isso?",
+ "1_female": "Você gostou do jardim de diversão que fiz com todas essas plantas resistentes minhas?\n$A força delas é um sinal da minha força como jardineiro e Líder de Ginásio! Você tem certeza de que está pronta para enfrentar tudo isso?"
},
"victory": {
"1": "Você acredita nos seus Pokémon... E eles acreditam em você também... Foi uma boa batalha, broto."
@@ -1523,7 +1596,8 @@
},
"victory": {
"1": "Devo dizer, estou aquecida para você! Posso até te admirar um pouco.",
- "2": "Uau! Você é ótimo! Ganhou meu respeito!\n$Acho que seu foco e vontade nos derrubaram totalmente."
+ "2": "Uau! Você é ótimo! Ganhou meu respeito!\n$Acho que seu foco e vontade nos derrubaram totalmente.",
+ "2_female": "Uau! Você é ótima! Ganhou meu respeito!\n$Acho que seu foco e vontade nos derrubaram totalmente."
},
"defeat": {
"1": "Eu senti sua vontade de vencer, mas eu não perco!",
@@ -1535,7 +1609,8 @@
"1": "Você tem uma aura vencedora. Então, de qualquer forma, isso vai ser divertido. Vamos ter nossa batalha!"
},
"victory": {
- "1": "Incrível! Você é muito bom, não é?"
+ "1": "Incrível! Você é muito bom, não é?",
+ "1_female": "Incrível! Você é muito boa, não é?"
},
"defeat": {
"1": "Sim! Meus Pokémon e eu somos perfeitamente bons!"
@@ -1576,7 +1651,8 @@
},
"clay": {
"encounter": {
- "1": "Harrumph! Me deixou esperando, não foi, garoto? Tudo bem, hora de ver o que você pode fazer!"
+ "1": "Harrumph! Me deixou esperando, não foi, garoto? Tudo bem, hora de ver o que você pode fazer!",
+ "1_female": "Harrumph! Me deixou esperando, não foi, garota? Tudo bem, hora de ver o que você pode fazer!"
},
"victory": {
"1": "Cara, como é bom dar tudo de si e ainda assim ser derrotado!"
@@ -1590,7 +1666,8 @@
"1": "Vou te servir um prato completo de Pokémon do tipo Água! Mas não tente comê-los!"
},
"victory": {
- "1": "Vaultin' Veluza! Você é animado, não é! Um pouco ANIMADO DEMAIS, se me permite dizer!"
+ "1": "Vaultin' Veluza! Você é animado, não é! Um pouco ANIMADO DEMAIS, se me permite dizer!",
+ "1_female": "Vaultin' Veluza! Você é animada, não é! Um pouco ANIMADA DEMAIS, se me permite dizer!"
},
"defeat": {
"1": "Volte para me ver novamente, ouviu?"
@@ -1656,7 +1733,8 @@
"1": "Há algo em você… Uma diferença na sua postura. \n$Acho que sinto isso em você. Agora, me mostre. Mostre-me o poder que você tem com seus Pokémon. \n$E eu, por minha vez, apresentarei uma performance de ilusões na água com meus Pokémon!"
},
"victory": {
- "1": "Bravo. Agora percebo sua autenticidade e magnificência como Treinador de Pokémon. \n$Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digno."
+ "1": "Bravo. Agora percebo sua autenticidade e magnificência como Treinador de Pokémon. \n$Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digno.",
+ "1_female": "Bravo. Agora percebo sua autenticidade e magnificência como Treinadora de Pokémon. \n$Tenho muita alegria em ter conhecido você e seus Pokémon. Você se mostrou digna."
},
"defeat": {
"1": "Uma grande ilusão!"
@@ -1664,13 +1742,15 @@
},
"lorelei": {
"encounter": {
- "1": "Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos!\n$Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronto?"
+ "1": "Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos!\n$Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronto?",
+ "1_female": "Ninguém me supera quando se trata de Pokémon gelados! Movimentos congelantes são poderosos!\n$Seus Pokémon estarão à minha mercê quando estiverem congelados! Hahaha! Está pronta?"
},
"victory": {
"1": "Como ousa!"
},
"defeat": {
- "1": "Não há nada que você possa fazer quando está congelado."
+ "1": "Não há nada que você possa fazer quando está congelado.",
+ "1_female": "Não há nada que você possa fazer quando está congelada."
}
},
"will": {
@@ -1686,10 +1766,12 @@
},
"malva": {
"encounter": {
- "1": "Sinto que meu coração pode explodir em chamas. \n$Estou ardendo de ódio por você, pirralho!"
+ "1": "Sinto que meu coração pode explodir em chamas. \n$Estou ardendo de ódio por você, pirralho!",
+ "1_female": "Sinto que meu coração pode explodir em chamas. \n$Estou ardendo de ódio por você, pirralha!"
},
"victory": {
- "1": "Que novidade… Um novo desafiador derrotou Malva!"
+ "1": "Que novidade… Um novo desafiador derrotou Malva!",
+ "1_female": "Que novidade… Uma nova desafiadora derrotou Malva!"
},
"defeat": {
"1": "Estou encantada! Sim, encantada por poder esmagar você sob meu calcanhar."
@@ -1711,7 +1793,8 @@
"1": "Dei a posição de capitão ao meu primo Sophocles, mas estou confiante na minha habilidade. \n$Minha força é como a de uma supernova!"
},
"victory": {
- "1": "Certamente encontrei um Treinador interessante para enfrentar!"
+ "1": "Certamente encontrei um Treinador interessante para enfrentar!",
+ "1_female": "Certamente encontrei uma Treinadora interessante para enfrentar!"
},
"defeat": {
"1": "Ahaha. Que batalha interessante."
@@ -1722,10 +1805,12 @@
"1": "Eu diria que vou pegar leve com você, mas… estaria mentindo! Pense rápido!"
},
"victory": {
- "1": "Nada mal, garoto."
+ "1": "Nada mal, garoto.",
+ "1_female": "Nada mal, garota."
},
"defeat": {
- "1": "Nahahaha! Você realmente é algo mais, garoto!"
+ "1": "Nahahaha! Você realmente é algo mais, garoto!",
+ "1_female": "Nahahaha! Você realmente é algo mais, garota!"
}
},
"bruno": {
@@ -1744,7 +1829,8 @@
"1": "Sou Bugsy! Eu nunca perco quando se trata de Pokémon do tipo Inseto!"
},
"victory": {
- "1": "Uau, incrível! Você é um especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu."
+ "1": "Uau, incrível! Você é um especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu.",
+ "1_female": "Uau, incrível! Você é uma especialista em Pokémon!\nMinha pesquisa ainda não está completa. OK, você venceu."
},
"defeat": {
"1": "Obrigado! Graças à nossa batalha, eu também pude fazer progressos na minha pesquisa!"
@@ -1774,10 +1860,12 @@
},
"lenora": {
"encounter": {
- "1": "Bem, desafiador, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!"
+ "1": "Bem, desafiador, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!",
+ "1_female": "Bem, desafiadora, vou pesquisar como você batalha com os Pokémon que criou com tanto carinho!"
},
"victory": {
- "1": "Minha teoria sobre você estava correta. Você é mais do que talentoso… Você é motivado! Eu te saúdo!"
+ "1": "Minha teoria sobre você estava correta. Você é mais do que talentoso… Você é motivado! Eu te saúdo!",
+ "1_female": "Minha teoria sobre você estava correta. Você é mais do que talentosa… Você é motivada! Eu te saúdo!"
},
"defeat": {
"1": "Ah ha ha! Se você perder, certifique-se de analisar o porquê e use esse conhecimento na próxima batalha!"
@@ -1802,7 +1890,8 @@
"1": "Selvagem! Sua razão já é mais tóxica que a minha!"
},
"defeat": {
- "1": "Ei, vamos lá! Seja sério! Você tem que dar mais de si!"
+ "1": "Ei, vamos lá! Seja sério! Você tem que dar mais de si!",
+ "1_female": "Ei, vamos lá! Seja séria! Você tem que dar mais de si!"
}
},
"olivia": {
@@ -1840,7 +1929,8 @@
},
"flint": {
"encounter": {
- "1": "Espero que você esteja aquecido, porque aqui vem o Big Bang!"
+ "1": "Espero que você esteja aquecido, porque aqui vem o Big Bang!",
+ "1_female": "Espero que você esteja aquecida, porque aqui vem o Big Bang!"
},
"victory": {
"1": "Incrível! Seus movimentos são tão quentes que fazem os meus parecerem mornos!"
@@ -1862,7 +1952,8 @@
},
"caitlin": {
"encounter": {
- "1": "Sou eu que apareci quando a flor se abriu. Você que estava esperando…\n$Você parece um Treinador de Pokémon com força refinada e bondade profunda. \n$O que eu procuro no meu oponente é uma força soberba… \n$Por favor, libere seu poder ao máximo!"
+ "1": "Sou eu que apareci quando a flor se abriu. Você que estava esperando…\n$Você parece um Treinador de Pokémon com força refinada e bondade profunda. \n$O que eu procuro no meu oponente é uma força soberba… \n$Por favor, libere seu poder ao máximo!",
+ "1_female": "Sou eu que apareci quando a flor se abriu. Você que estava esperando…\n$Você parece uma Treinadora de Pokémon com força refinada e bondade profunda. \n$O que eu procuro no meu oponente é uma força soberba… \n$Por favor, libere seu poder ao máximo!"
},
"victory": {
"1": "Meus Pokémon e eu aprendemos muito! Agradeço a você."
@@ -1884,13 +1975,16 @@
},
"wikstrom": {
"encounter": {
- "1": "Bem encontrado, jovem desafiador! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! \n$Que a batalha comece! En garde!"
+ "1": "Bem encontrado, jovem desafiador! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! \n$Que a batalha comece! En garde!",
+ "1_female": "Bem encontrado, jovem desafiadora! Verdadeiramente sou a lâmina famosa de aço endurecido, Duque Wikstrom! \n$Que a batalha comece! En garde!"
},
"victory": {
- "1": "Glorioso! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!"
+ "1": "Glorioso! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!",
+ "1_female": "Gloriosa! A confiança que você compartilha com seu honrado Pokémon supera até mesmo a minha!"
},
"defeat": {
- "1": "Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! \n$Vencer contra um oponente tão digno dá asas à minha alma--assim eu voo!"
+ "1": "Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! \n$Vencer contra um oponente tão digno dá asas à minha alma--assim eu voo!",
+ "1_female": "Que tipo de magia é essa? Meu coração bate incessantemente no meu peito! \n$Vencer contra uma oponente tão digna dá asas à minha alma--assim eu voo!"
}
},
"acerola": {
@@ -1922,11 +2016,14 @@
},
"victory": {
"1": "Você me pegou. Você é magnífico!",
- "2": "Nunca esperei que outro Treinador me derrotasse… Estou surpreso."
+ "1_female": "Você me pegou. Você é magnífica!",
+ "2": "Nunca esperei que outro Treinador me derrotasse… Estou surpreso.",
+ "2_female": "Nunca esperei que outra Treinadora me derrotasse… Estou surpreso."
},
"defeat": {
"1": "Isso foi por pouco. Quer tentar de novo?",
- "2": "Não é que você seja fraco. Não se incomode com isso."
+ "2": "Não é que você seja fraco. Não se incomode com isso.",
+ "2_female": "Não é que você seja fraca. Não se incomode com isso."
}
},
"karen": {
@@ -1951,7 +2048,8 @@
"1": "Parece que você entende bem os Pokémon. \n$Isso vai ser uma batalha e tanto! \n$Vou ter que usar a Dynamax no meu Pokémon se eu quiser vencer!"
},
"victory": {
- "1": "O poder da Grama murchou… Que desafiador incrível!"
+ "1": "O poder da Grama murchou… Que desafiador incrível!",
+ "1_female": "O poder da Grama murchou… Que desafiadora incrível!"
},
"defeat": {
"1": "Isso realmente vai te deixar em choque e admiração."
@@ -1970,7 +2068,8 @@
},
"drasna": {
"encounter": {
- "1": "Você deve ser um Treinador forte. Sim, bastante forte…\n$Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!"
+ "1": "Você deve ser um Treinador forte. Sim, bastante forte…\n$Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!",
+ "1_female": "Você deve ser uma Treinadora forte. Sim, bastante forte…\n$Isso é uma notícia maravilhosa! Enfrentar oponentes como você e sua equipe fará meus Pokémon crescerem como ervas daninhas!"
},
"victory": {
"1": "Oh, meu Deus. Isso foi uma batalha rápida… Espero que você volte novamente algum dia!"
@@ -2003,7 +2102,8 @@
},
"blue": {
"encounter": {
- "1": "Você deve ser muito bom para chegar tão longe."
+ "1": "Você deve ser muito bom para chegar tão longe.",
+ "1_female": "Você deve ser muito boa para chegar tão longe."
},
"victory": {
"1": "Só perdi para ele e agora para você… Ele? Hee, hee…"
@@ -2050,7 +2150,8 @@
"1": "Ainda sou o Campeão. Não vou segurar nada."
},
"victory": {
- "1": "Esta é a emergência de um novo Campeão."
+ "1": "Esta é a emergência de um novo Campeão.",
+ "1_female": "Esta é a emergência de uma nova Campeã."
},
"defeat": {
"1": "Defendi com sucesso meu Campeonato."
@@ -2138,7 +2239,8 @@
"1": "Eai! Você não acha que os Pokémon são, tipo, super fofos?"
},
"victory": {
- "1": "Waaah! Waaah! Você é tão mau!"
+ "1": "Waaah! Waaah! Você é tão mau!",
+ "1_female": "Waaah! Waaah! Você é tão má!"
},
"defeat": {
"1": "E é isso!"
@@ -2146,7 +2248,8 @@
},
"chuck": {
"encounter": {
- "1": "Hah! Você quer me desafiar? É corajoso ou apenas ignorante?"
+ "1": "Hah! Você quer me desafiar? É corajoso ou apenas ignorante?",
+ "1_female": "Hah! Você quer me desafiar? É corajosa ou apenas ignorante?"
},
"victory": {
"1": "Você é forte! Por favor, me faça seu aprendiz?"
@@ -2157,7 +2260,8 @@
},
"katy": {
"encounter": {
- "1": "Não baixe a guarda, a menos que queira se ver jogado no chão!"
+ "1": "Não baixe a guarda, a menos que queira se ver jogado no chão!",
+ "1_female": "Não baixe a guarda, a menos que queira se ver jogada no chão!"
},
"victory": {
"1": "Todos os meus adoráveis Pokémon caíram como moscas!"
@@ -2190,7 +2294,8 @@
},
"maylene": {
"encounter": {
- "1": "Vim desafiá-lo agora e não vou segurar nada. \n$Por favor, prepare-se para a batalha!"
+ "1": "Vim desafiá-lo agora e não vou segurar nada. \n$Por favor, prepare-se para a batalha!",
+ "1_female": "Vim desafiá-la agora e não vou segurar nada. \n$Por favor, prepare-se para a batalha!"
},
"victory": {
"1": "Eu admito a derrota…"
@@ -2212,7 +2317,8 @@
},
"byron": {
"encounter": {
- "1": "Treinador! Você é jovem, assim como meu filho, Roark. \n$Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! \n$Então, como uma parede para os jovens, aceitarei seu desafio!"
+ "1": "Treinador! Você é jovem, assim como meu filho, Roark. \n$Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! \n$Então, como uma parede para os jovens, aceitarei seu desafio!",
+ "1_female": "Treinadora! Você é jovem, assim como meu filho, Roark. \n$Com mais Treinadores jovens assumindo o comando, o futuro dos Pokémon é brilhante! \n$Então, como uma parede para os jovens, aceitarei seu desafio!"
},
"victory": {
"1": "Hmm! Meus Pokémon robustos--derrotados!"
@@ -2234,7 +2340,8 @@
},
"volkner": {
"encounter": {
- "1": "Já que você chegou tão longe, deve ser bastante forte…\n$Espero que você seja o Treinador que me faça lembrar como é divertido batalhar!"
+ "1": "Já que você chegou tão longe, deve ser bastante forte…\n$Espero que você seja o Treinador que me faça lembrar como é divertido batalhar!",
+ "1_female": "Já que você chegou tão longe, deve ser bastante forte…\n$Espero que você seja a Treinadora que me faça lembrar como é divertido batalhar!"
},
"victory": {
"1": "Você me venceu…\n$Seu desejo e a maneira nobre como seus Pokémon batalharam por você… \n$Eu até me senti emocionado durante nossa luta. Foi uma batalha muito boa."
@@ -2336,7 +2443,8 @@
},
"valerie": {
"encounter": {
- "1": "Oh, se não é um jovem Treinador… É adorável conhecê-lo assim. \n$Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. \n$Uma elusiva Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte."
+ "1": "Oh, se não é um jovem Treinador… É adorável conhecê-lo assim. \n$Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. \n$Uma elusiva Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte.",
+ "1_female": "Oh, se não é uma jovem Treinadora… É adorável conhecê-la assim. \n$Então, suponho que você ganhou o direito a uma batalha, como recompensa por seus esforços. \n$Uma elusiva Fada pode parecer frágil como a brisa e delicado como uma flor, mas é forte."
},
"victory": {
"1": "Espero que você encontre coisas para sorrir amanhã…"
@@ -2383,7 +2491,8 @@
"1": "Deixe-me ver como você e seu Pokémon parceiro se comportam!"
},
"victory": {
- "1": "Seu rosa ainda está faltando, mas você é um Treinador excelente com Pokémon excelentes."
+ "1": "Seu rosa ainda está faltando, mas você é um Treinador excelente com Pokémon excelentes.",
+ "1_female": "Seu rosa ainda está faltando, mas você é uma Treinadora excelente com Pokémon excelentes."
},
"defeat": {
"1": "Muito ruim para você, eu acho."
@@ -2391,7 +2500,8 @@
},
"bede": {
"encounter": {
- "1": "Suponho que devo provar além de qualquer dúvida o quão patético você é e quão forte eu sou."
+ "1": "Suponho que devo provar além de qualquer dúvida o quão patético você é e quão forte eu sou.",
+ "1_female": "Suponho que devo provar além de qualquer dúvida o quão patética você é e quão forte eu sou."
},
"victory": {
"1": "Eu vejo… Bem, tudo bem. Eu não estava me esforçando muito de qualquer maneira."
@@ -2435,7 +2545,8 @@
},
"brassius": {
"encounter": {
- "1": "Pressuponho que você está pronto? Que nossa obra de arte colaborativa comece!"
+ "1": "Pressuponho que você está pronto? Que nossa obra de arte colaborativa comece!",
+ "1_female": "Pressuponho que você está pronta? Que nossa obra de arte colaborativa comece!"
},
"victory": {
"1": "Ahhh…avant-garde!"
@@ -2446,10 +2557,12 @@
},
"iono": {
"encounter": {
- "1": "Como você está se sentindo sobre esta batalha?\n$...\n$Vamos começar o show! Quão forte é o nosso desafiador? \n$Eu não sei! Vamos descobrir juntos!"
+ "1": "Como você está se sentindo sobre esta batalha?\n$...\n$Vamos começar o show! Quão forte é o nosso desafiador? \n$Eu não sei! Vamos descobrir juntos!",
+ "1_female": "Como você está se sentindo sobre esta batalha?\n$...\n$Vamos começar o show! Quão forte é o nossa desafiadora? \n$Eu não sei! Vamos descobrir juntos!"
},
"victory": {
- "1": "Você é tão chamativo e brilhante quanto um Raio do Trovão de 10.000.000 volts, amigo!"
+ "1": "Você é tão chamativo e brilhante quanto um Raio do Trovão de 10.000.000 volts, amigo!",
+ "1_female": "Você é tão chamativa e brilhante quanto um Raio do Trovão de 10.000.000 volts, amiga!"
},
"defeat": {
"1": "Seus olhos são MEUS!"
@@ -2471,7 +2584,8 @@
"1": "Vamos lá, baby! Me agite até os ossos!"
},
"victory": {
- "1": "Você é legal, meu amigo, você move minha ALMA!"
+ "1": "Você é legal, meu amigo, você move minha ALMA!",
+ "1_female": "Você é legal, minha amiga, você move minha ALMA!"
},
"defeat": {
"1": "Até mais, baby!"
@@ -2505,7 +2619,9 @@
"nessa_elite": {
"encounter": {
"1": "As marés estão mudando a meu favor. Pronto para ser levado pela corrente?",
- "2": "Vamos fazer ondas com esta batalha! Espero que esteja preparado!"
+ "1_female": "As marés estão mudando a meu favor. Pronta para ser levada pela corrente?",
+ "2": "Vamos fazer ondas com esta batalha! Espero que esteja preparado!",
+ "2_female": "Vamos fazer ondas com esta batalha! Espero que esteja preparada!"
},
"victory": {
"1": "Você navegou nessas águas perfeitamente... Bem feito!",
@@ -2533,6 +2649,7 @@
"allister_elite": {
"encounter": {
"1": "As sombras caem... Você está pronto para enfrentar seus medos?",
+ "1_female": "As sombras caem... Você está pronta para enfrentar seus medos?",
"2": "Vamos ver se você pode lidar com a escuridão que eu comando."
},
"victory": {
@@ -2555,7 +2672,8 @@
},
"defeat": {
"1": "Outra tempestade enfrentada, outra vitória conquistada! Bem lutado!",
- "2": "Você foi pego na minha tempestade! Melhor sorte na próxima vez!"
+ "2": "Você foi pego na minha tempestade! Melhor sorte na próxima vez!",
+ "2_female": "Você foi pega na minha tempestade! Melhor sorte na próxima vez!"
}
},
"alder": {
diff --git a/src/locales/pt_BR/menu-ui-handler.json b/src/locales/pt_BR/menu-ui-handler.json
index cc087c8335e..df654976d68 100644
--- a/src/locales/pt_BR/menu-ui-handler.json
+++ b/src/locales/pt_BR/menu-ui-handler.json
@@ -14,8 +14,8 @@
"importSlotSelect": "Selecione um slot para importar.",
"exportSession": "Exportar sessão",
"exportSlotSelect": "Selecione um slot para exportar.",
- "importRunHistory":"Importar Histórico de Jogos",
- "exportRunHistory":"Exportar Histórico de Jogos",
+ "importRunHistory": "Importar Histórico de Jogos",
+ "exportRunHistory": "Exportar Histórico de Jogos",
"importData": "Importar dados",
"exportData": "Exportar dados",
"consentPreferences": "Opções de Privacidade",
@@ -25,5 +25,5 @@
"unlinkGoogle": "Desconectar Google",
"cancel": "Cancelar",
"losingProgressionWarning": "Você vai perder todo o progresso desde o início da batalha. Confirmar?",
- "noEggs": "Você não está chocando\nnenhum ovo no momento!"
-}
\ No newline at end of file
+ "noEggs": "Você não está chocando nenhum ovo\nno momento!"
+}
diff --git a/src/locales/pt_BR/modifier-type.json b/src/locales/pt_BR/modifier-type.json
index 1787360b51e..823d6b35e16 100644
--- a/src/locales/pt_BR/modifier-type.json
+++ b/src/locales/pt_BR/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "Dobra as chances de encontrar uma batalha em dupla por {{battleCount}} batalhas."
},
- "TempBattleStatBoosterModifierType": {
- "description": "Aumenta o atributo de {{tempBattleStatName}} para todos os membros da equipe por 5 batalhas."
+ "TempStatStageBoosterModifierType": {
+ "description": "Aumenta o atributo de {{stat}} para todos os membros da equipe por 5 batalhas."
},
"AttackTypeBoosterModifierType": {
"description": "Aumenta o poder dos ataques do tipo {{moveType}} de um Pokémon em 20%."
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Aumenta em {{levels}} o nível de todos os membros da equipe."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "Aumenta o atributo base de {{statName}} em 10%. Quanto maior os IVs, maior o limite de aumento."
+ "BaseStatBoosterModifierType": {
+ "description": "Aumenta o atributo base de {{stat}} em 10%. Quanto maior os IVs, maior o limite de aumento."
},
"AllPokemonFullHpRestoreModifierType": {
"description": "Restaura totalmente os PS de todos os Pokémon."
@@ -248,6 +248,12 @@
"name": "Lentes de Mira",
"description": "Estas lentes facilitam o foco em pontos fracos. Aumenta a chance de acerto crítico de quem a segurar."
},
+ "DIRE_HIT": {
+ "name": "Direto",
+ "extra": {
+ "raises": "Chance de Acerto Crítico"
+ }
+ },
"LEEK": {
"name": "Alho-poró",
"description": "Esse talo de alho-poró muito longo e rígido aumenta a taxa de acerto crítico dos movimentos do Farfetch'd."
@@ -411,25 +417,13 @@
"description": "Extremamente fino, porém duro, este pó estranho aumenta o atributo de Velocidade de Ditto."
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "Ataque X",
"x_defense": "Defesa X",
"x_sp_atk": "Ataque Esp. X",
"x_sp_def": "Defesa Esp. X",
"x_speed": "Velocidade X",
- "x_accuracy": "Precisão X",
- "dire_hit": "Direto"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "Ataque",
- "DEF": "Defesa",
- "SPATK": "Ataque Esp.",
- "SPDEF": "Defesa Esp.",
- "SPD": "Velocidade",
- "ACC": "Precisão",
- "CRIT": "Chance de Acerto Crítico",
- "EVA": "Evasão",
- "DEFAULT": "???"
+ "x_accuracy": "Precisão X"
},
"AttackTypeBoosterItem": {
"silk_scarf": "Lenço de Seda",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "Memória do Dragão",
"DARK_MEMORY": "Memória Sombria",
"FAIRY_MEMORY": "Memória de Fada",
- "BLANK_MEMORY": "Memória Vazia"
+ "NORMAL_MEMORY": "Memória Normal"
}
}
diff --git a/src/locales/pt_BR/modifier.json b/src/locales/pt_BR/modifier.json
index 602a0be3a5b..38622de579e 100644
--- a/src/locales/pt_BR/modifier.json
+++ b/src/locales/pt_BR/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsuas {{typeName}}!",
"hitHealApply": "{{pokemonNameWithAffix}} restaurou um pouco de PS usando\nsua {{typeName}}!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}} foi reanimado\npor sua {{typeName}}!",
- "pokemonResetNegativeStatStageApply": "Os atributos diminuídos de {{pokemonNameWithAffix}} foram\nrestaurados por seu(sua) {{typeName}}!",
+ "resetNegativeStatStageApply": "Os atributos diminuídos de {{pokemonNameWithAffix}} foram\nrestaurados por seu(sua) {{typeName}}!",
"moneyInterestApply": "Você recebeu um juros de ₽{{moneyAmount}}\nde sua {{typeName}}!",
"turnHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi absorvido(a)\npelo {{typeName}} de {{pokemonName}}!",
"contactHeldItemTransferApply": "{{itemName}} de {{pokemonNameWithAffix}} foi pego(a)\npela {{typeName}} de {{pokemonName}}!",
diff --git a/src/locales/pt_BR/move-trigger.json b/src/locales/pt_BR/move-trigger.json
index 416740dba0d..9aa13dedad5 100644
--- a/src/locales/pt_BR/move-trigger.json
+++ b/src/locales/pt_BR/move-trigger.json
@@ -61,5 +61,6 @@
"suppressAbilities": "A habilidade de {{pokemonName}}\nfoi suprimida!",
"revivalBlessing": "{{pokemonName}} foi reanimado!",
"swapArenaTags": "{{pokemonName}} trocou os efeitos de batalha que afetam cada lado do campo!",
- "exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!"
-}
\ No newline at end of file
+ "exposedMove": "{{pokemonName}} identificou\n{{targetPokemonName}}!",
+ "safeguard": "{{targetName}} está protegido por Safeguard!"
+}
diff --git a/src/locales/pt_BR/pokemon-summary.json b/src/locales/pt_BR/pokemon-summary.json
index 62add589847..4c427dbac4f 100644
--- a/src/locales/pt_BR/pokemon-summary.json
+++ b/src/locales/pt_BR/pokemon-summary.json
@@ -13,5 +13,32 @@
"metFragment": {
"normal": "encontrado no Nv.{{level}},\n{{biome}}.",
"apparently": "aparentemente encontrado no Nv.{{level}},\n{{biome}}."
+ },
+ "natureFragment": {
+ "Hardy": "{{nature}}",
+ "Lonely": "{{nature}}",
+ "Brave": "{{nature}}",
+ "Adamant": "{{nature}}",
+ "Naughty": "{{nature}}",
+ "Bold": "{{nature}}",
+ "Docile": "{{nature}}",
+ "Relaxed": "{{nature}}",
+ "Impish": "{{nature}}",
+ "Lax": "{{nature}}",
+ "Timid": "{{nature}}",
+ "Hasty": "{{nature}}",
+ "Serious": "{{nature}}",
+ "Jolly": "{{nature}}",
+ "Naive": "{{nature}}",
+ "Modest": "{{nature}}",
+ "Mild": "{{nature}}",
+ "Quiet": "{{nature}}",
+ "Bashful": "{{nature}}",
+ "Rash": "{{nature}}",
+ "Calm": "{{nature}}",
+ "Gentle": "{{nature}}",
+ "Sassy": "{{nature}}",
+ "Careful": "{{nature}}",
+ "Quirky": "{{nature}}"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/pt_BR/settings.json b/src/locales/pt_BR/settings.json
index 58ccb45f86d..74f3918bed8 100644
--- a/src/locales/pt_BR/settings.json
+++ b/src/locales/pt_BR/settings.json
@@ -100,7 +100,7 @@
"moveTouchControls": "Mover Controles de Toque",
"shopOverlayOpacity": "Opacidade da Loja",
"shopCursorTarget": "Alvo do Cursor da Loja",
- "items": "Itens",
+ "rewards": "Itens",
"reroll": "Atualizar",
"shop": "Loja",
"checkTeam": "Checar Time"
diff --git a/src/locales/pt_BR/tutorial.json b/src/locales/pt_BR/tutorial.json
index e347ca6fbee..92ea0dd080f 100644
--- a/src/locales/pt_BR/tutorial.json
+++ b/src/locales/pt_BR/tutorial.json
@@ -1,10 +1,10 @@
{
- "intro": "Bem-vindo ao PokéRogue! Este é um jogo Pokémon feito por fãs focado em batalhas com elementos roguelite.\n$Este jogo não é monetizado e não reivindicamos propriedade de Pokémon nem dos ativos protegidos\n$por direitos autorais usados.\n$O jogo é um trabalho em andamento, mas é totalmente jogável.\n$Para relatórios de bugs, use a comunidade no Discord.\n$Se o jogo estiver rodando lentamente, certifique-se de que a 'Aceleração de hardware' esteja ativada \n$nas configurações do seu navegador.",
+ "intro": "Bem-vindo ao PokéRogue!\n$Este é um fangame Pokémon focado em batalhas com elementos roguelite.\n$Este jogo não é monetizado e não reivindicamos propriedade do Pokémon nem dos ativos protegidos$por direitos autorais usados.\n$O jogo é um trabalho em andamento,\nmas totalmente jogável.\n$Para relatórios de bugs, use a comunidade do Discord.\n$Se o jogo rodar lentamente, certifique-se de que\na 'Aceleração de Hardware' esteja ativada$nas configurações do seu navegador.",
"accessMenu": "Para acessar o menu, pressione M ou Esc.\n$O menu contém configurações e diversas funções.",
- "menu": "A partir deste menu, você pode acessar as configurações. \n$Nas configurações, você pode alterar a velocidade do jogo,\n$o estilo da janela, entre outras opções. \n$Existem também vários outros recursos disponíveis aqui.\n$Não deixe de conferir todos eles!",
- "starterSelect": "Aqui você pode escolher seus iniciais apertando a tecla Z ou\na Barra de Espaço.\n$Esses serão os primeiro Pokémon da sua equipe.\n$Cada inicial tem seu custo. Sua equipe pode ter até 6\nmembros, desde que a soma dos custos não ultrapasse 10. \n$Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial.\n$Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou. \n$Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou.\n$Sempre capture vários Pokémon de várias espécies!",
+ "menu": "A partir deste menu, você pode\\nacessar as configurações.\n$A partir das configurações, você\npode alterar a velocidade do jogo,\n$o estilo da janela e outras opções.\n$Há também vários outros recursos aqui.\nCertifique-se de verificar todos eles!",
+ "starterSelect": "Nesta tela, você pode selecionar seus iniciais\npressionando Z ou a barra de espaço.\n$Esses serão os primeiros membros da sua equipe.\n$Cada inicial tem um custo. Sua equipe pode ter até 6 membros,\ndesde que desde que o custo total não exceda 10.\n$Você pode escolher o gênero, a habilidade\ne até a forma do seu inicial.\n$Essas opções dependem das variantes dessa\nespécie que você já capturou ou chocou.\n$Os IVs de cada inicial são os melhores de todos os Pokémon\ndaquela espécie que você já capturou ou chocou.\n$Sempre capture vários Pokémon de todas as espécies!",
"pokerus": "Todo dia, 3 Pokémon iniciais ficam com uma borda roxa.\n$Caso veja um inicial que você possui com uma dessa, tente\nadicioná-lo a sua equipe. Lembre-se de olhar seu sumário!",
"statChange": "As mudanças de atributos se mantém após a batalha desde que o Pokémon não seja trocado.\n$Seus Pokémon voltam a suas Poké Bolas antes de batalhas contra treinadores e de entrar em um novo bioma.\n$Para ver as mudanças de atributos dos Pokémon em campo, mantena C ou Shift pressionado durante a batalha.",
"selectItem": "Após cada batalha, você pode escolher entre 3 itens aleatórios.\n$Você pode escolher apenas um deles.\n$Esses itens variam entre consumíveis, itens de segurar e itens passivos permanentes.\n$A maioria dos efeitos de itens não consumíveis podem ser acumulados.\n$Alguns itens só aparecerão se puderem ser usados, como os itens de evolução.\n$Você também pode transferir itens de segurar entre os Pokémon utilizando a opção \"Alterar\".\n$A opção de transferir irá aparecer no canto inferior direito assim que você obter um item de segurar.\n$Você pode comprar itens consumíveis com dinheiro, e sua variedade aumentará conforme você for mais longe.\n$Certifique-se de comprá-los antes de escolher seu item aleatório. Ao escolhê-lo, a próxima batalha começará.",
- "eggGacha": "Aqui você pode trocar seus vouchers\npor ovos de Pokémon.\n$Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais para chocar.\n$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.\n$Pokémon chocados geralmente possuem IVs melhores\nque Pokémon selvagens.\n$Alguns Pokémon só podem ser obtidos através de seus ovos.\n$Temos 3 máquinas, cada uma com seu bônus específico,\nentão escolha a que mais lhe convém!"
+ "eggGacha": "Nesta tela, você pode trocar seus vouchers por ovos\nde Pokémon.\n$Ovos ficam mais próximos de chocar após cada batalha.\nOvos mais raros demoram mais tempo para chocar.\n$Pokémon chocados não serão adicionados a sua equipe,\nmas sim aos seus iniciais.\n$Pokémon chocados de ovos geralmente têm IVs melhores\ndo que Pokémon selvagens.\n$Alguns Pokémon só podem ser obtidos através de ovos.\n$Existem 3 máquinas para usar com diferentes bônus, então\nescolha a que mais lhe convém!"
}
diff --git a/src/locales/zh_CN/achv.json b/src/locales/zh_CN/achv.json
index 103a9bb41b5..90dfda0e3c1 100644
--- a/src/locales/zh_CN/achv.json
+++ b/src/locales/zh_CN/achv.json
@@ -86,7 +86,7 @@
"name": "大师球联盟冠军"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "团队协作",
"description": "在一项属性强化至最大时用接力棒传递给其他宝可梦"
},
@@ -268,5 +268,9 @@
"FRESH_START": {
"name": "初次尝试!",
"description": "完成初次尝试挑战"
+ },
+ "INVERSE_BATTLE": {
+ "name": "镜子子镜",
+ "description": "完成逆转之战挑战\n战挑战之转逆成完"
}
}
diff --git a/src/locales/zh_CN/arena-tag.json b/src/locales/zh_CN/arena-tag.json
index 5a36b3ae1f7..74ad38ba9bf 100644
--- a/src/locales/zh_CN/arena-tag.json
+++ b/src/locales/zh_CN/arena-tag.json
@@ -47,5 +47,11 @@
"tailwindOnRemovePlayer": "我方的顺风停止了!",
"tailwindOnRemoveEnemy": "敌方的顺风停止了!",
"happyHourOnAdd": "大家被欢乐的\n气氛包围了!",
- "happyHourOnRemove": "气氛回复到平常了。"
+ "happyHourOnRemove": "气氛回复到平常了。",
+ "safeguardOnAdd": "整个场地被\n神秘之幕包围了!",
+ "safeguardOnAddPlayer": "我方被\n神秘之幕包围了!",
+ "safeguardOnAddEnemy": "对手被\n神秘之幕包围了!",
+ "safeguardOnRemove": "包围整个场地的\n神秘之幕消失了!",
+ "safeguardOnRemovePlayer": "包围我方的\n神秘之幕消失了!",
+ "safeguardOnRemoveEnemy": "包围对手的\n神秘之幕消失了!"
}
\ No newline at end of file
diff --git a/src/locales/zh_CN/challenges.json b/src/locales/zh_CN/challenges.json
index 0b454d759fb..9351ec96285 100644
--- a/src/locales/zh_CN/challenges.json
+++ b/src/locales/zh_CN/challenges.json
@@ -25,5 +25,12 @@
"desc": "你只能使用御三家,就像是你第一次玩宝可梦肉鸽一样。",
"value.0": "关闭",
"value.1": "开启"
+ },
+ "inverseBattle": {
+ "name": "逆转之战",
+ "shortName": "逆转之战",
+ "desc": "属性相克关系被反转,且没有任何属性对其他属性免疫。\n禁用其他挑战的成就。",
+ "value.0": "关闭",
+ "value.1": "开启"
}
}
\ No newline at end of file
diff --git a/src/locales/zh_CN/config.ts b/src/locales/zh_CN/config.ts
index 021e14d9727..44a190d8c11 100644
--- a/src/locales/zh_CN/config.ts
+++ b/src/locales/zh_CN/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const zhCnConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/zh_CN/dialogue-double-battle-male.json b/src/locales/zh_CN/dialogue-double-battle-male.json
deleted file mode 100644
index 5ab6bf49890..00000000000
--- a/src/locales/zh_CN/dialogue-double-battle-male.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "青绿:嘿,赤红,\n让这家伙看看我们是什么来头!$赤红: ...$青绿: 见识下真新镇的实力!"
- },
- "victory": {
- "1": "青绿:打得真不错$赤红: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "赤红: ...!$青绿: 他人狠话不多。$青绿: 但别被他耍了,\n毕竟他可是个冠军!"
- },
- "victory": {
- "1": "赤红: ...!$青绿: 下次我们一定会赢你!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "小枫:嘿嘿嘿……你惊讶吗?$小南: 这里有两个道馆馆主?$小枫: 我们是双胞胎!$小南: 我们无需交谈,因为……$我们可以通晓彼此的想法$小枫: 我们的组合……$小南: 你能打败吗?"
- },
- "victory": {
- "1": "小枫:什么?我们的组合……$小南:被瓦解了!"
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "小南:呵呵呵……你惊讶吧?$小枫:这里有两个道馆馆主?$小南:我们可以通晓……$小枫:彼此的想法……$小南:全在我们脑中!$小枫:我们的组合……$小南:你能打败吗?"
- },
- "victory": {
- "1": "小枫:你和你的宝可梦……$小南:简直像亲兄弟姐妹!"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "大吾:米可利, 展现冠军的实力吧!$米可利:我们将展示丰缘的实力!$大吾:要上了!"
- },
- "victory": {
- "1": "大吾:打得真不错!$米可利:我们下次会赢的!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "大吾:你有什么稀有的宝可梦吗?$米可利:大吾……我们是来对战的,\n不是来炫耀宝可梦的。$大吾:哦……知道了… 那么要上了!"
- },
- "victory": {
- "1": "大吾:战斗结束了,\n来看看我的稀有宝可梦!$米可利:大吾……"
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "阿戴克:我们俩是合众最强的训练家!$艾莉丝:与最强来一场最激烈的战斗吧!"
- },
- "victory": {
- "1": "阿戴克:哇哦!你真是超级厉害!$艾莉丝:我们下次会赢的啦!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "艾莉丝:欢迎!挑战者,\n合众地区最强的冠军大驾光临!$阿戴克:艾莉丝,你是不是有点太兴奋了…"
- },
- "victory": {
- "1": "艾莉丝:这样的失败可不好受啊…$阿戴克:但是只有失败才能让我们变强!"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "玛俐:哥哥,给他们展现尖钉镇的实力!$聂梓:我们带来黑暗!"
- },
- "victory": {
- "1": "玛俐:你的强光亮瞎我们的黑暗了啦……$聂梓:实在太亮了…"
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "聂梓: 台下准备好了吗!$玛俐: 哥哥,我们是来对战的,\n不是来唱歌的……"
- },
- "victory": {
- "1": "聂梓:这首歌献给大家!$玛俐:哥哥……"
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/zh_CN/dialogue-double-battle-female.json b/src/locales/zh_CN/dialogue-double-battle.json
similarity index 100%
rename from src/locales/zh_CN/dialogue-double-battle-female.json
rename to src/locales/zh_CN/dialogue-double-battle.json
diff --git a/src/locales/zh_CN/dialogue-final-boss-male.json b/src/locales/zh_CN/dialogue-final-boss-male.json
deleted file mode 100644
index edbc302dcd4..00000000000
--- a/src/locales/zh_CN/dialogue-final-boss-male.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "看来终于又到了那个时候。\n你知道自己为何会来到这里,不是吗?\n$你被吸引到这里,因为你以前就来过这里。\n无数次。\n$尽管,或许可以数一数。\n准确地说,这实际上是你的第{{cycleCount}}次循环。\n$每一次循环,你的思想都会恢复到之前的状态。\n即便如此,不知何故,你之前自我的残留仍然存在。\n$直到现在,你仍未成功,\n但我感觉这次你身上有一种异样的气息。\n$你是这里唯一的人,尽管感觉上还有……另一个人。\n$你最终会成为对我来的一个硬茬吗?\n我渴望了数千年的挑战?\n$我们,开始。",
- "firstStageWin": "我明白了。我所感觉到的气息确实是真实的。\n看来我不再需要保留实力了。\n$别让我失望。",
- "secondStageWin": "…漂亮。"
-}
\ No newline at end of file
diff --git a/src/locales/zh_CN/dialogue-final-boss-female.json b/src/locales/zh_CN/dialogue-final-boss.json
similarity index 100%
rename from src/locales/zh_CN/dialogue-final-boss-female.json
rename to src/locales/zh_CN/dialogue-final-boss.json
diff --git a/src/locales/zh_CN/dialogue-male.json b/src/locales/zh_CN/dialogue-male.json
deleted file mode 100644
index 5a4615fac54..00000000000
--- a/src/locales/zh_CN/dialogue-male.json
+++ /dev/null
@@ -1,2691 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "嘿,想来对战吗?",
- "2": "你也是新人训练师吗?",
- "3": "嘿,我之前没见过你。我们来对战吧!",
- "4": "我刚输了,所以我正在寻找更多的宝可梦。$等等!你看起来很弱!\n来吧,我们对战吧!",
- "5": "我们见过面吗?我记不太清了。$嗯,不管怎样,很高兴见到你!",
- "6": "好的!我们上吧!",
- "7": "好的!我来啦!我会向你展示我的实力!",
- "8": "嚯嚯嚯...我会向你展示我的宝可梦有多厉害!",
- "9": "不要浪费时间打招呼。你准备好了就放马过来!",
- "10": "别掉以轻心,$否则你可能会被小朋友打到哭鼻子哦。",
- "11": "我精心培养了我的宝可梦。不许你伤害它们!",
- "12": "恭喜你成功了!从这以后可不轻松哦。",
- "13": "战斗永无止境!欢迎来到没有尽头的世界!"
- },
- "victory": {
- "1": "哇!你很强!",
- "2": "我根本没机会赢,对吧?",
- "3": "我会等长大了再来打败你!",
- "4": "呃。我没有更多宝可梦了。",
- "5": "不可能…不可能!我怎么可能又输了…",
- "6": "不!我输了!",
- "7": "哇!你真是太不可思议了!我既惊讶又钦佩!",
- "8": "这怎么…怎么可能…$明明我和我的宝可梦是最强大的…",
- "9": "下次我不会输了!我们找时间再对战吧!",
- "10": "天哪!你看不出我还只是个小孩子吗!$你那样全力以赴太赖了!",
- "11": "你的宝可梦更棒啊!和我交换吧!",
- "12": "我之前有点上头,我说了什么来着?",
- "13": "啊哈哈!就是这样!$对!你已经熟悉这个世界了!"
- }
- },
- "lass": {
- "encounter": {
- "1": "我们来对战吧,好吗?",
- "2": "你看起来像是个新人训练师。我们来战斗吧!",
- "3": "我不认识你。来对战怎么样?",
- "4": "让我们来进行一场有趣的宝可梦对战吧!",
- "5": "我会向你展示如何真正使用宝可梦!",
- "6": "一场认真的对战从始于认真的开场白!$你确定你准备好了吗?",
- "7": "花无重开日,人无再少年。$你在对战中只有一次机会。$很快,你就只能活在回忆中了。",
- "8": "你最好对我手下留情,好吗?$当然我会认真对战的!",
- "9": "学校很无聊,我无事可做。$*哈欠*…我只是来对战打发时间。"
- },
- "victory": {
- "1": "那真是令人印象深刻!我还有很多要学习。",
- "2": "我没想到你会这么轻易地打败我…",
- "3": "我希望有一天,我们能再进行一场对战。",
- "4": "那真是场非常有趣的对战!$你让我精疲力尽了…",
- "5": "你给我上了一课!你真是太棒了!",
- "6": "说真的,我输了。$这,怎么说,真的好难过,但你也真的很厉害。",
- "7": "我不需要像这样的记忆。删除记忆中…",
- "8": "嘿!我告诉过你要对我手下留情!$不过,当你认真的时候,你真的很酷。",
- "9": "实际上,我开始厌倦对战了…$一定有新的事情可以做…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "听话的宝可梦,自私的宝可梦…$宝可梦有独特的性格呢。",
- "2": "尽管我出生贫寒,但我的宝可梦培养的很好。",
- "3": "嗯,你有没有管教你的宝可梦?$过度溺爱是不好的。"
- },
- "victory": {
- "1": "对每个宝可梦因材施教是很重要的。",
- "2": "不像一无是处的我…这些宝可梦都很优秀。",
- "3": "过度的赞美会宠坏宝可梦和人。"
- },
- "defeat": {
- "1": "即使输了,也不应该对你的宝可梦发火。",
- "2": "相当好的宝可梦,对吧?我很会养东西。",
- "3": "无论你多么爱你的宝可梦,$你仍要在它没做好时管教它们。"
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "宝可梦永远不会背叛你。$它们会回报你对它们的爱。",
- "2": "要我教教你训练优秀宝可梦的技巧吗?",
- "3": "特别的宝可梦有特别的培育技巧。"
- },
- "victory": {
- "1": "呃…事情不应该是这样的。$我是不是用错了能量方块?",
- "2": "这怎么会发生在我的宝可梦身上…$你给你的宝可梦喂了什么?",
- "3": "如果我输了,我告诉你我只是在消磨时间。$你根本不会伤害到我的自尊心。"
- },
- "defeat": {
- "1": "这证明了我的宝可梦已经接受了我的爱。",
- "2": "训出好宝可梦的真正技巧是捉到好的宝可梦。",
- "3": "宝可梦的强弱取决于你的饲养方式。"
- }
- },
- "fisherman": {
- "encounter": {
- "1": "啊!你让我错过了一次咬钩!$你打算怎么办?",
- "2": "走开!你吓跑了宝可梦!",
- "3": "让我看看你能否赢得胜利!"
- },
- "victory": {
- "1": "算了吧。",
- "2": "下一次,我将卷土重来,凯旋而归!",
- "3": "我想这次我低估了海流。"
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "哇!我钓到了一条大鱼!",
- "2": "线已收好,准备提竿!",
- "3": "准备制造波浪!"
- },
- "victory": {
- "1": "我会带着更强大的鱼钩回来。",
- "2": "下次我会赢得胜利。",
- "3": "我只是在为回归磨利我的鱼钩!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "是时候潜水了!",
- "2": "让我们一起乘风破浪,赢得胜利!",
- "3": "该一鸣惊人了!"
- },
- "victory": {
- "1": "沉浸在失败中!",
- "2": "失败的波浪!",
- "3": "后浪死在沙滩上,我猜。"
- }
- },
- "backpacker": {
- "encounter": {
- "1": "收拾行李,开始游戏!",
- "2": "让我看看你是否能跟上!",
- "3": "全副武装,挑战者!",
- "4": "我花了20年时间试图找到自己……但我在哪里?"
- },
- "victory": {
- "1": "这次绊倒了!",
- "2": "哦,我觉得我迷路了。",
- "3": "死路!",
- "4": "等一下!嘿!你不知道我是谁吗?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "你看起来挺自信的。",
- "2": "你的宝可梦…… 让我看看……",
- "3": "因为我是王牌训练师,人们认为我很强。",
- "4": "你知道成为王牌训练师需要什么吗?"
- },
- "victory": {
- "1": "是的…… 你的宝可梦很棒……",
- "2": "什么?!我是战斗天才啊!",
- "3": "理所应当,你才是主角!",
- "4": "好好好!你可以成为王牌训练师!"
- },
- "defeat": {
- "1": "我将把我的身体和灵魂全都奉献给宝可梦对战!",
- "2": "一切都在我的预料之中… \n没有什么好惊讶的…",
- "3": "我觉得我长大后有点玻璃心,$你太压力我我会跨的……",
- "4": "我当然很强大,不会输。$而且重要的是我要优雅地赢。"
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "是时候用优雅和从容来为战斗添彩了!"
- },
- "victory": {
- "1": "我的优雅依然完好无损!"
- }
- },
- "twins": {
- "encounter": {
- "1": "准备好咯,因为我们联手,\n麻烦双倍!",
- "2": "两颗心,一条绳$让我们看看你能否跟上我们双胞胎的力量!",
- "3": "希望你准备好了面对双倍的麻烦,$因为我们即将燃起来啦!"
- },
- "victory": {
- "1": "虽然我们在这一轮输了,$但我们的羁绊依然坚不可摧!",
- "2": "我们的双胞胎精神,才不会就此熄灭。",
- "3": "我们会作为充满活力的二人组,$卷土重来,变得更强!"
- },
- "defeat": {
- "1": "双胞胎的力量至高无上!",
- "2": "两颗心,一起赢!",
- "3": "笑容成双,共舞成双!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "准备好在我后面吃土吧!",
- "2": "挑战者,准备好!我要把你打的落花流水!",
- "3": "全速前进,让我看看你能不能跟的上!"
- },
- "victory": {
- "1": "轮子可能不转了,但我的决心没有停下。",
- "2": "被超越了!",
- "3": "通往胜利的道路还有许多曲折等待探索。"
- }
- },
- "black_belt": {
- "encounter": {
- "1": "我赞扬你挑战我的勇气!$因为我是踢力最强的人!",
- "2": "哦,我明白了。你想被切成碎片吗?$或者你更喜欢当个沙袋?"
- },
- "victory": {
- "1": "哦。是宝可梦在战斗。$我强大的踢击一点忙都没帮上。",
- "2": "嗯…如果我无论如何都会输,我希望能被彻底打败。"
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "你不必试图勾引我。你可以输给我。"
- },
- "victory": {
- "1": "很难说再见,但我们快没时间了……"
- }
- },
- "hiker": {
- "encounter": {
- "1": "人到中年后,我的身体和我爬过的山一样强壮!",
- "2": "我从父母那里遗传了这副魁梧的身材…$就像一座活生生的山脉…"
- },
- "victory": {
- "1": "至少在BMI方面我不能输!",
- "2": "这还不够……永远不够。$我的坏胆固醇还不够高……"
- }
- },
- "ranger": {
- "encounter": {
- "1": "当我身处大自然中,其他事情都不重要了。",
- "2": "如果我生活中没有大自然,有时就会突然感到焦虑。"
- },
- "victory": {
- "1": "无论我是赢是输,\n对广阔的大自然来说并不重要……",
- "2": "与城市生活的窒息感相比,\n这种事情微不足道。"
- },
- "defeat": {
- "1": "我赢了。但与浩瀚的大自然相比,\n胜利算不了什么…",
- "2": "与我的焦虑症相比,我觉得你也不会怎样…"
- }
- },
- "scientist": {
- "encounter": {
- "1": "我的研究将引导这个世界走向和平与欢乐。"
- },
- "victory": {
- "1": "我是个天才…我不应该输给你这样的人…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "……嘿嘿。我对计算和分析很有信心。",
- "2": "我正在尽可能地积累经验,$因为我希望有一天能成为道馆馆主。"
- },
- "victory": {
- "1": "哦…计算和分析也许和个例不太匹配呀…",
- "2": "我想,即使是艰难困苦的经历,也有存在的意义。"
- }
- },
- "artist": {
- "encounter": {
- "1": "我以前很受欢迎,但现在已经彻底过气了。"
- },
- "victory": {
- "1": "随着时代的变迁,价值观也在变化。$我意识到这一点已经太晚了。"
- }
- },
- "guitarist": {
- "encounter": {
- "1": "当我弹奏着走向胜利的旋律时,$准备好感受失败的节奏吧!"
- },
- "victory": {
- "1": "暂时沉默了,但我不屈的旋律将继续演奏。"
- }
- },
- "worker": {
- "encounter": {
- "1": "人们总误解我,这让我很烦。$我比大家想象的要干净得多。"
- },
- "victory": {
- "1": "我真的不想晒伤皮肤,所以我想在阴凉处工作。"
- }
- },
- "worker_female": {
- "encounter": {
- "1": "人们总是误解我,这让我很烦。 $我比大家想象的要干净得多。"
- },
- "victory": {
- "1": "我真的不想晒伤皮肤,\n所以我想在阴凉处工作。"
- },
- "defeat": {
- "1": "我的身体和心灵并不总同步。"
- }
- },
- "worker_double": {
- "encounter": {
- "1": "你会知道我们怎么击败你的。我们在工地训练过!"
- },
- "victory": {
- "1": "真奇怪…怎么会这样…我不应该被打败的。"
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "我通常只听古典音乐,但如果我输了,$我想我应该试试新时代的音乐!",
- "2": "我的每一滴眼泪都让我变得更加坚强。"
- },
- "victory": {
- "1": "乐坛新时代的曙光就此出现了吗?",
- "2": "现在我变得更强了。我随着他人怨恨而成长。"
- },
- "defeat": {
- "1": "“新时代”指的是二十世纪的古典作曲家,对吧?",
- "2": "不要纠结于悲伤或沮丧。$你可以用悲愤来激励自己。"
- }
- },
- "psychic": {
- "encounter": {
- "1": "嘿!集中!"
- },
- "victory": {
- "1": "呃呃呃!"
- }
- },
- "officer": {
- "encounter": {
- "1": "准备好,因为正义即将得到伸张!",
- "2": "准备好维护法律,在战场上伸张正义!"
- },
- "victory": {
- "1": "正义的分量比以往还要沉重……",
- "2": "失败的阴影,在警局中徘徊。"
- }
- },
- "beauty": {
- "encounter": {
- "1": "我最后的战斗…我就是这么看待这场对战的…"
- },
- "victory": {
- "1": "很有趣…有时间再来一场最后的战斗…"
- }
- },
- "baker": {
- "encounter": {
- "1": "希望你准备好品尝失败的滋味!"
- },
- "victory": {
- "1": "我会卷土重来的。"
- }
- },
- "biker": {
- "encounter": {
- "1": "是时候加速,把你甩在后面了!"
- },
- "victory": {
- "1": "我会为下一场比赛调整状态。"
- }
- },
- "firebreather": {
- "encounter": {
- "1": "我的火焰会吞噬你!",
- "2": "我的灵魂在燃烧,我要让你看看它有多滚烫!",
- "3": "快来看看吧!"
- },
- "victory": {
- "1": "我燃成灰了…",
- "2": "哟! 好烫!",
- "3": "嗷! 我的鼻尖烧焦了!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "伙计,如果你输了,你就得挨板子!",
- "2": "来吧!这关系到我作为水手的尊严!",
- "3": "你好啊!你晕船么?"
- },
- "victory": {
- "1": "啊,被孩子打败了。",
- "2": "你的精神让我沉沦!",
- "3": "好像是我晕船了…"
- }
- },
- "archer": {
- "encounter": {
- "1": "在你继续前进之前,\n让我看看你要如何和对付火箭队。",
- "2": "我收到报告说你的实力与众不同,\n就让我来看看这是否属实吧。",
- "3": "我是阿波罗,火箭对的干部。\n我不会对组织的敌人手软。"
- },
- "victory": {
- "1": "大失误……",
- "2": "以我现在的实力,无法胜任我的任务……",
- "3": "原……谅我,坂木。\n我竟被一名训练师打败了。."
- }
- },
- "ariana": {
- "encounter": {
- "1": "站住!我们可不能放过你!\n$这会损伤火箭对的名誉,明白吗?",
- "2": "我不知道也不想知道我的所作所为正确与否…\n$我只要遵从坂木老大的指令就可以了!",
- "3": "你的旅途到此为止了,我会把你狠狠扳倒!"
- },
- "victory": {
- "1": "切,你好强,可恶。\n$如果你加入火箭队,肯定能成为干部。",
- "2": "好……好崩溃……",
- "3": "嗯啊啊!这不可能!我使出全力还是输了!"
- }
- },
- "proton": {
- "encounter": {
- "1": "你想干什么?如果你要妨碍我们的事业,我可不会手下留情。",
- "2": "你在这干什么?别人总说我是火箭队里最残忍和恐怖的人…\n$我强烈推荐你别来碍我们的事!",
- "3": "我是兰斯,火箭队的干部。就让来扫除你对我们的阻挠。"
- },
- "victory": {
- "1": "我的防线崩溃了……",
- "2": "你虽然这次赢了,但是这只是让火箭队的怒火继续燃烧!",
- "3": "我输了…但是我不会忘记的。"
- }
- },
- "petrel": {
- "encounter": {
- "1": "哇哈哈哈,我们一直在等你。我?你不知道我是谁?是我,坂木啊。\n$伟大的坂木大人本人!哇哈哈哈!…啊?我听起来不像坂木吗?\n$我连看起来都不像?怎么会呢,我可认真的变装了!",
- "2": "我是拉姆达,火箭队的干部。我不会允许你干涉我们的计划!",
- "3": "火箭队干部拉姆达来会会这个入侵者!"
- },
- "victory": {
- "1": "好好好,我会说他在哪的",
- "2": "我……我什么也做不了……坂木,请原谅我……",
- "3": "不,我不能慌了神,必须通知其他人…"
- }
- },
- "tabitha": {
- "encounter": {
- "1": "呵呵呵!原来你都一路来到这里了!但你来晚了!",
- "2": "呵呵呵……你终于来了?我们小瞧你了,没不过事! \n$我比你见过的所有队员都要厉害,我可不会拖延时间。\n$我会把你碾碎!",
- "3": "我要让你尝尝痛苦的滋味!认命吧!"
- },
- "victory": {
- "1": "呵呵呵!虽然你打败了我,但你根本没机会打败老大!\n$如果你现在输了,你就不用面对那样严厉的鞭笞了!",
- "2": "呵呵呵……所以,我也输了……",
- "3": "啊哈!怎么会这样?像我这样的干部\n竟然输给了一个随处可见的训练师……"
- }
- },
- "courtney": {
- "encounter": {
- "1": "那个东西……你所拥有的那个东西……\n那就是……那就是我们熔岩队所寻找的东西……",
- "2": "……那么……删除记忆……",
- "3": "……哈……分析中……啊哈♪"
- },
- "victory": {
- "1": "……改变……世界。",
- "2": "如预期。出乎意料。目标锁定…锁定你……完成。\n$开始……实验。材料是你…永远…啊哈……♪",
- "3": "……又来了?出乎意料……我就知道。你……很有趣!……啊哈哈!♪"
- }
- },
- "shelly": {
- "encounter": {
- "1": "啊哈哈哈哈!你要插手海洋队的事?\n$你要么是绝对无畏,要么就是无知,或者两者兼有!\n$你太可爱了,太恶心了!我要把你打倒!",
- "2": "怎么回事?这个小鬼头是谁?",
- "3": "冷静点,耐心点。我很快就会把你击溃。"
- },
- "victory": {
- "1": "啊哈哈哈哈!我们意外地被人干扰了!我们别无选择。\n$不得不撤退了,但这会不是你最后一次面对海洋队!\n$我们还有其他计划!别忘了!",
- "2": "啊?!我是不是对你太温柔了?!",
- "3": "呃…难道在对战中你也一刻不停地在变强吗?\n$你真是个前途光明的小鬼……\n我和我的宝可梦已经没有任何力量去战斗了……\n$继续吧……准备去被水梧桐摧毁吧。"
- }
- },
- "matt": {
- "encounter": {
- "1": "嚯!哈哈哈!怎么,你是不是脑子不正常了?\n看看你,像个幕下力士!",
- "2": "“哦吼!你!你真是个有趣的孩子!",
- "3": "你在这里干什么?你跟踪我们了吗?"
- },
- "victory": {
- "1": "好吧,在老大有时间对付你之前,我来成为你的对手!",
- "2": "我能感觉到!我感觉到了,没错!你身上散发出的力量!\n$更多!还想要更多!但看起来我们没时间了……",
- "3": "真有趣!我就知道你会让我尽兴的!\n我期待有一天再次面对你!"
- }
- },
- "mars": {
- "encounter": {
- "1": "我是伙星,银河队的顶级干部之一。",
- "2": "银河队对未来的愿景坚定不移。\n反对者将被无情地粉碎!",
- "3": "“紧张吗?你是该感到紧张了!"
- },
- "victory": {
- "1": "这不可能!我怎么会输?!",
- "2": "你很有本事,我承认。",
- "3": "输了……犯了一个代价高昂的大错。"
- }
- },
- "jupiter": {
- "encounter": {
- "1": "岁星,银河队干部,为您效劳。",
- "2": "抵抗是徒劳的。银河队必将获胜!",
- "3": "你在发抖啊……已经害怕了吗?"
- },
- "victory": {
- "1": "不会吧……我输了?!",
- "2": "厉害,你胆子真大!",
- "3": "输成这样……真丢人。"
- }
- },
- "saturn": {
- "encounter": {
- "1": "我是镇星,银河队的干部。",
- "2": "我们的使命是绝对的,任何阻碍都将被消灭!",
- "3": "我从你的眼中看到的是恐惧吗?"
- },
- "victory": {
- "1": "不可能……被你打败了?!",
- "2": "你证明了自己是一个值得尊敬的对手。",
- "3": "失败的苦涩……难以接受……。"
- }
- },
- "zinzolin": {
- "encounter": {
- "1": "你可能会对等离子队构成威胁,所以我们现在就消灭你!",
- "2": "哦,天哪……我没想到要在这么冷的天气里战斗!",
- "3": "能走到今天这一步,你真是个了不起的训练师。\n但一切到此结束。"
- },
- "victory": {
- "1": "魁奇思大人……我让你失望了……",
- "2": "好冷,我不仅发抖,还要遭罪。",
- "3": "哼。你比我想象的要聪明,但还不够。"
- }
- },
- "rood": {
- "encounter": {
- "1": "你对等离子队是个威胁。我们现在不能让你离开这里!",
- "2": "哦,这寒风……我从没想过我必须在这里战斗!",
- "3": "能走到今天这一步,你是一位了不起的训练师,但这就是你的结局了。"
- },
- "victory": {
- "1": "魁奇思大人……我的任务失败了",
- "2": "寒风刺骨。我瑟瑟发抖。我痛苦不堪。",
- "3": "嗯,你是很有才。但是要打败等离子队还不够……!"
- }
- },
- "xerosic": {
- "encounter": {
- "1": "啊哈哈!我很乐意。\n来吧,小训练师!让我们看看你有什么本事!",
- "2": "嗯……你比看上去更强大。\n我想知道你体内有多少能量。",
- "3": "我一直在等你!我需要对你做一点研究!\n来吧,我们开始吧!"
- },
- "victory": {
- "1": "啊,你好强大啊……嗯……确实非常强大。",
- "2": "叮叮叮!你成功了!\n战利品归胜利者!",
- "3": "太棒了!太神奇了!\n你的技巧和勇气都无与伦比!"
- }
- },
- "bryony": {
- "encounter": {
- "1": "我是芭菈,能与你一战是我的荣幸。\n让我看看你的实力。",
- "2": "令人印象深刻……你比你看上去的还要强大。\n让我们看看你真正的实力。",
- "3": "我预料到了你的到来。\n是时候进行一个小实验了,我们开始吧?"
- },
- "victory": {
- "1": "你很强大。哦,嗯嗯!确实非常强大",
- "2": "叮叮叮!你做得很好。胜利属于你。",
- "3": "太棒了!了不起!你的技巧和勇气值得称赞。"
- }
- },
- "rocket_grunt": {
- "encounter": {
- "1": "你要有麻烦了!",
- "2": "我们要干大事了!\n闪一边去,小子!",
- "3": "把你的宝可梦交过来,\n不然就尝尝火箭队的厉害!",
- "4": "你准备好感受火箭队真正的恐怖了吗!",
- "5": "喂,小子!俺可是火箭队滴!"
- },
- "victory": {
- "1": "好讨厌的感觉啊!",
- "2": "哎呀!不小心丢掉电梯钥匙啦!",
- "3": "我搞砸了。",
- "4": "我的伙计们不会放过你……!",
- "5": "你说啥?俺们火箭队要玩完了?"
- }
- },
- "magma_grunt": {
- "encounter": {
- "1": "如果你挡在熔岩队路上,那就别指望我们手下留情!",
- "2": "你最好别妨碍我们的计划!\n我们会让世界变得更美好!",
- "3": "少碍事!熔岩队没时间理你这样的小孩!",
- "4": "你有棉花糖没?我来给你好好烤烤!",
- "5": "我们会利用火山的力量!\n它马上要…爆发了!懂吗?嘿嘿嘿……"
- },
- "victory": {
- "1": "哈?我输了?!",
- "2": "我怎么会输!我为了训练饭都不吃了!",
- "3": "不会吧,不就是一个小孩!",
- "4": "呃啊…我得赶快逃回基地…",
- "5": "你打败我了…你觉得老大会扣我工资吗?"
- }
- },
- "aqua_grunt": {
- "encounter": {
- "1": "即使是小孩,如果要和海洋队作对,也别指望我们手下留情!",
- "2": "嚯…你好大的胆子,敢惹我们海洋队!",
- "3": "不仅是我的水系宝可梦,整片大海即将淹没你!",
- "4": "我们海洋队,是为了大义!",
- "5": "准备好被我的…呃…我宝可梦的海流冲走吧!"
- },
- "victory": {
- "1": "你在开玩笑吧?",
- "2": "害,没想到这种小屁孩也要管我的闲事!",
- "3": "我输了?看来我得自己游回基地了。",
- "4": "不是吧,怎么会,老大要生气了……",
- "5": "你打败了我…老大不会要让我上跳板吧……"
- }
- },
- "galactic_grunt": {
- "encounter": {
- "1": "别惹银河队!",
- "2": "见识下我们的科技,和我们所设想的未来!",
- "3": "以银河队之名,我会扫清一切挡路的人!",
- "4": "准备输的一败涂地吧!",
- "5": "希望你做好被宇宙力量碾压的准备。"
- },
- "victory": {
- "1": "停机了…",
- "2": "从长远来看,这次的挫折不用在意。",
- "3": "小失败不会影响我们的宏图伟业!",
- "4": "咋回事!?",
- "5": "个人记录:提升对战水平,优先级,高……"
- }
- },
- "plasma_grunt": {
- "encounter": {
- "1": "异端不共戴天!",
- "2": "要是我赢了你!就把你的宝可梦放生!",
- "3": "要是敢和等离子队作对,我来好好关照你!",
- "4": "等离子队会从你们这种自私的人手里解放宝可梦!",
- "5": "我们的发型帅的一批,而我们的战斗水平呢,\n马上让你见识一下。"
- },
- "victory": {
- "1": "等离子子子子子子!",
- "2": "我怎么会输……",
- "3": "…没用的家伙!我得去偷个厉害点的宝可梦!",
- "4": "伟大的事业总会被人阻挠…",
- "5": "烂完了…烂烂烂烂烂!等离子队烂了!\n说短点就是,等烂子队!"
- }
- },
- "flare_grunt": {
- "encounter": {
- "1": "你的宝可梦无法与闪焰队的优雅相提并论",
- "2": "带个墨镜吧,别被我闪瞎狗眼了!",
- "3": "闪焰队将净化这个不完美的世界!",
- "4": "准备面对闪焰队的美!",
- "5": "时尚对我们来说最重要!"
- },
- "victory": {
- "1": "我的未来看起来并不明亮…",
- "2": "这战斗比我想的更难搞,我得重头训练了。",
- "3": "啊啊?我输了?!",
- "4": "就算是在失败当中,闪焰队依旧优雅动人!",
- "5": "你虽然打败了我,但是我输的也这么潇洒!"
- }
- },
- "aether_grunt": {
- "encounter": {
- "1": "我会用尽全力消灭你!",
- "2": "我才不管你是不是小孩!\n只要和我们作对,我就把你打飞!",
- "3": "上头要我拦下所有训练师,无论是谁!",
- "4": "给你展现一下以太乐园的力量!",
- "5": "既然你已经触达到了以太基金会的黑暗,\n那我要请你就此消失了。"
- },
- "victory": {
- "1": "哼!看来你有点实力。",
- "2": "这什么情况!什么情况!",
- "3": "啊!你怎么这么强!我这下可没法阻止你!",
- "4": "嗯……看来我输了……",
- "5": "我惊掉大牙了……"
- }
- },
- "faba": {
- "encounter": {
- "1": "我,分部长扎奥博, \n给你见识下现实世界的残酷吧!",
- "2": "堂堂以太乐园的最后防线,\n我扎奥博竟然要跟个毛头小子对战。",
- "3": "我,扎奥博,以太基金会分部长。\n世上唯一,无可替代!"
- },
- "victory": {
- "1": "哎咿呀!",
- "2": "怎……怎么可能!这孩子!",
- "3": "这就是……这就是为啥我讨厌小孩子!"
- }
- },
- "skull_grunt": {
- "encounter": {
- "1": "我们并不坏,YO,我们是硬汉!",
- "2": "YO!咋样!我们就这样打招呼!\n混个脸熟呗,崽子!",
- "3": "咱们就是一帮对别人的宝可梦\n比较感兴趣的哥们和姐们!",
- "4": "别装B了,你有我们拽吗,老弟?",
- "5": "骷髅队在此!没钱住房子!\n天天找乐子!青春混到死!"
- },
- "victory": {
- "1": "哈?这就完了?",
- "2": "该逃跑了YO!闪一边去YO!",
- "3": "你这种弱鸡宝可梦反正我们也不要!",
- "4": "啥!? 这小屁孩也太牛B了!",
- "5": "MAN!我能说什么,\n我的人生比宝可梦还烂。"
- }
- },
- "plumeria": {
- "encounter": {
- "1": " …哼嗯,你看起来也没啥特别的。",
- "2": "这帮呆子对付你也花了太长时间了吧……",
- "3": "要是惹了骷髅队的人!我就不和你开玩笑了!"
- },
- "victory": {
- "1": "哼嗯!你很强,我承认。",
- "2": "哼,你是挺强的。现在我知道\n为啥那帮手下要花那么久对付一个小孩了。",
- "3": "哼嗯!看来我得承认我输了。"
- }
- },
- "macro_grunt": {
- "encounter": {
- "1": "你的对战生涯到此为止了。",
- "2": "你是一名训练师吧\n你没有干涉我们工作的权力!",
- "3": "我是马洛科蒙集团的,要买马洛科蒙人寿保险吗。"
- },
- "victory": {
- "1": "除了礼貌地撤退我似乎别无选择…",
- "2": "没法留住我的零花钱了,我又要财政赤字了…",
- "3": "没人能比马洛科蒙集团的我们工作更卷!"
- }
- },
- "oleana": {
- "encounter": {
- "1": "我不会让你方案洛兹先生的计划!",
- "2": "看来你打倒了所有我安排的训练师,本身也没对他们有啥期待…",
- "3": "为了总裁!我不会输的!"
- },
- "victory": {
- "1": "*叹气*我赢不了。\n奥利薇,你真是个没用的女人",
- "2": "呃啊!不可饶恕...我在想什么。\n走到这里的训练师果然不会轻易屈服!",
- "3": "*叹气*奥利薇累累了……"
- }
- },
- "rocket_boss_giovanni_1": {
- "encounter": {
- "1": "我不得不说,能来到这里,你的确很不简单!"
- },
- "victory": {
- "1": "什么!这不可能!"
- },
- "defeat": {
- "1": "记住我的话。无法衡量自己的力量,说明你还是个孩子。"
- }
- },
- "rocket_boss_giovanni_2": {
- "encounter": {
- "1": "我的老伙计还需要我…你要挡我的路吗?"
- },
- "victory": {
- "1": "这怎么可能…?\n火箭队的梦想…就这么成为泡影了…"
- },
- "defeat": {
- "1": "火箭队会重生,而我会统治世界!"
- }
- },
- "magma_boss_maxie_1": {
- "encounter": {
- "1": "我会亲手埋葬你,希望你能喜欢!"
- },
- "victory": {
- "1": "啊!你…很厉害…我落后了…一点…"
- },
- "defeat": {
- "1": "熔岩队必胜!"
- }
- },
- "magma_boss_maxie_2": {
- "encounter": {
- "1": "你是我实现目标最后的障碍。\n准备好迎接我最强的一击吧!哈哈哈哈!"
- },
- "victory": {
- "1": "这…这不…呃"
- },
- "defeat": {
- "1": "现在…我要把这个星球变成人类的理想国度!"
- }
- },
- "aqua_boss_archie_1": {
- "encounter": {
- "1": "我是海洋队的老大,所以,你的路大概走到头了。"
- },
- "victory": {
- "1": "下次再见吧。我会记住你的脸的。"
- },
- "defeat": {
- "1": "天才!我的队伍不会再退缩了!"
- }
- },
- "aqua_boss_archie_2": {
- "encounter": {
- "1": "我等这一天很久了。\n这就是我的真实力量!"
- },
- "victory": {
- "1": "果然很强……啊!"
- },
- "defeat": {
- "1": "我会让这世界上的一切回归到最初的纯净状态!!"
- }
- },
- "galactic_boss_cyrus_1": {
- "encounter": {
- "1": "但在这之前,让我见识见识你那敢向银河队叫板的实力吧。"
- },
- "victory": {
- "1": "有意思,简直太有意思了。"
- },
- "defeat": {
- "1": "我要创造我的新世界…"
- }
- },
- "galactic_boss_cyrus_2": {
- "encounter": {
- "1": "是啊,我和你还真是有缘呢。\n不过,这段孽缘…就让我在此斩断吧!"
- },
- "victory": {
- "1": "怎么可能!怎么可能!怎么可能!"
- },
- "defeat": {
- "1": "永别了。"
- }
- },
- "plasma_boss_ghetsis_1": {
- "encounter": {
- "1": "无论是谁做了什么!都无法阻止我!"
- },
- "victory": {
- "1": "怎么回事?我可是建立了等离子队的完美的人啊!\n是要改变世界的完美的统治者!"
- },
- "defeat": {
- "1": "我是坐拥世界的完美统治者!哇哈哈哈!"
- }
- },
- "plasma_boss_ghetsis_2": {
- "encounter": {
- "1": "来吧!让我看看你彻底绝望时的那张脸!"
- },
- "victory": {
- "1": "不!我的伟大目标!我要完全支配世界啊!"
- },
- "defeat": {
- "1": "酋雷姆!融合吧!"
- }
- },
- "flare_boss_lysandre_1": {
- "encounter": {
- "1": "你想要阻止我?在对战中展示给我看吧!"
- },
- "victory": {
- "1": "看来你的确是想要阻止我。但是,先等一下。"
- },
- "defeat": {
- "1": "宝可梦…不该存在。"
- }
- },
- "flare_boss_lysandre_2": {
- "encounter": {
- "1": "你我的未来…究竟哪个才正确,\n就让我们来问问各自的宝可梦吧!"
- },
- "victory": {
- "1": "哇啊啊啊!"
- },
- "defeat": {
- "1": "没有远见的蠢货会继续玷污这个美丽的世界。"
- }
- },
- "aether_boss_lusamine_1": {
- "encounter": {
- "1": "你吓到我可爱的异兽了!我要让你先闭嘴!"
- },
- "victory": {
- "1": "你…你怎么这么不听话!"
- },
- "defeat": {
- "1": "哼嗯…"
- }
- },
- "aether_boss_lusamine_2": {
- "encounter": {
- "1": "为什么你要一直妨碍我!\n我受够你了,完完全全受够了! \n$不用说废话了…有了虚吾伊德的力量。\n我会让你明白,你来这里是有多么错误!"
- },
- "victory": {
- "1": "呃呃啊啊啊啊呜呜呜啊啊!"
- },
- "defeat": {
- "1": "我只要和我可爱的异兽在一起就好了!你们怎么样都无所谓了!"
- }
- },
- "skull_boss_guzma_1": {
- "encounter": {
- "1": "摧毁,摧毁,\n不管摧毁几次也从不手软\n$惹人厌的古兹马大爷在此。"
- },
- "victory": {
- "1": "切,我一定要找时间干掉你!"
- },
- "defeat": {
- "1": "大老远跑来就这,昂?"
- }
- },
- "skull_boss_guzma_2": {
- "encounter": {
- "1": "不管谁与我作对,我都会干掉他们!\n$这就是大坏蛋古兹马的全部!"
- },
- "victory": {
- "1": "古兹马!!你在干什么啊!!!"
- },
- "defeat": {
- "1": "你们真够蠢的!"
- }
- },
- "macro_boss_rose_1": {
- "encounter": {
- "1": "我必须为所有人提供无限的能源,实现繁荣。$这是我的目的,我的责任,我的使命!"
- },
- "victory": {
- "1": "你还是没有明白,训练师\n$我们…不,我要推动历史的进程啊!"
- },
- "defeat": {
- "1": "你完全不理解!"
- }
- },
- "macro_boss_rose_2": {
- "encounter": {
- "1": "我致力于解决伽勒尔的能源问题\n——当然也是全世界的能源问题。\n$我的经验与成果,造就了马洛科蒙集团,证明了我的正确与成功!\n$就算输了,我也不会改变主意的……"
- },
- "victory": {
- "1": "我都忘记宝可梦对战的魅力了!我太久没有着手对战了…\n$这的确让人很满足,我接受我的失败!"
- },
- "defeat": {
- "1": "我承认我做的事情非常渗人,我也不指望你能理解。\n$但我必须为伽勒尔地区提供无限的能源,确保永久的繁荣。"
- }
- },
- "brock": {
- "encounter": {
- "1": "我对岩石属性宝可梦的专精会击败你!来吧!",
- "2": "我磐石般的意志将压倒你!",
- "3": "让我展示给你看看,我宝可梦真正的力量!"
- },
- "victory": {
- "1": "你宝可梦的力量战胜了我坚如磐石的防御!",
- "2": "世界很大!很高兴有机会和你战斗。",
- "3": "也许我应该回去追寻我成为宝可梦饲养员的梦想……"
- },
- "defeat": {
- "1": "最好的进攻就是坚固的防守!$那是我做事的方式!",
- "2": "下次来和我一起研究岩石属性,$更好地了解如何与它们对战!",
- "3": "哈哈,我在各地的旅行有所回报了!"
- }
- },
- "misty": {
- "encounter": {
- "1": "我的战策就是使用水属性宝可梦全面进攻!",
- "2": "嗨,我会让你见识我的水属性宝可梦的力量!",
- "3": "我的梦想是踏上旅程,与强大的训练师战斗……$你能满足我吗?"
- },
- "victory": {
- "1": "你真的很强……我承认,你有技术的……",
- "2": "哼……你知道你只是运气好,对吧?!",
- "3": "哇,你太过分了!不敢相信你打败我了!"
- },
- "defeat": {
- "1": "强大的小霞对你来说,太过分了吗?",
- "2": "我希望你看到了我宝可梦优雅的游泳技巧!",
- "3": "你的宝可梦无法匹敌我的心腹和骄傲!"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "我的电属性宝可梦在战争中救了我!$我来给你展示一下!",
- "2": "立正!我要电到你投降!",
- "3": "我会像对待敌军一样,狠狠电你!"
- },
- "victory": {
- "1": "哇!你的队伍有真家伙,小子!",
- "2": "啊啊,你很强!连我的电击技巧都输给了你。",
- "3": "这失败真是把我给电麻了!"
- },
- "defeat": {
- "1": "哦耶!我的电属性宝可梦是世界第一!",
- "2": "哈哈哈!真是一场电动人心的战斗,小子!",
- "3": "宝可梦对战等于战争,$我向你展示了军队中的格斗技巧!"
- }
- },
- "erika": {
- "encounter": {
- "1": "啊,这里天气真好…$哦,对战?那好吧。",
- "2": "我在宝可梦对战上的造诣,$可以与我的插花技巧相媲美。",
- "3": "哦,希望我宝可梦的宜人香气\n不会再让我睡着…",
- "4": "看看花园里的花朵,如此令人心旷神怡。"
- },
- "victory": {
- "1": "哦!我认输啦~",
- "2": "这场比赛非常愉快。",
- "3": "啊,看来我输了…",
- "4": "哦,我的天哪。"
- },
- "defeat": {
- "1": "我怕我会打瞌睡…",
- "2": "哦,我天。看来我的草属性宝可梦击败了你。",
- "3": "那场战斗是如此令人心旷神怡。",
- "4": "哦…这就完啦?"
- }
- },
- "janine": {
- "encounter": {
- "1": "我正在掌握毒属性攻击的艺术。$今天我来和你过过招!",
- "2": "父亲相信我能独当一面。$我来证明他说的对!",
- "3": "我的忍术,仅次于我的父亲!$你能跟的上吗?"
- },
- "victory": {
- "1": "就算现在,我仍然需要继续训练…我明白了。",
- "2": "你的战斗技巧,超过了我。",
- "3": "我要好好努力提高我的技术。"
- },
- "defeat": {
- "1": "呵呵…毒液耗尽了你所有的力量。",
- "2": "哈!你根本无法抵挡我卓越的忍技!",
- "3": "我没有辜负父亲对我的信任。"
- }
- },
- "sabrina": {
- "encounter": {
- "1": "我的超能力预见了你的到来!",
- "2": "我不喜欢战斗,但如果你想,$我会展示我的实力!",
- "3": "我能感觉到你的雄心壮志。$我倒要看看你是不是虚有其表。"
- },
- "victory": {
- "1": "你的力量……远远超出了我的预知……",
- "2": "我没有准确预测到你的实力。",
- "3": "即使我强大的超能力也无法感知到你这样强大的人。"
- },
- "defeat": {
- "1": "这场胜利……和我看到的未来一样啊!",
- "2": "也许我预感到有强大实力的人,是另一个……",
- "3": "在你奋不顾身投入战斗之前,\n磨练你的能力。$如果你这样做,你才未来可期……"
- }
- },
- "blaine": {
- "encounter": {
- "1": "哈!希望你带了烧伤治疗药!",
- "2": "我火热的宝可梦将所有挑战者都焚烧殆尽!",
- "3": "准备好玩火吧!"
- },
- "victory": {
- "1": "我已经焚烧殆尽了!甚至连灰烬都没有留下!",
- "2": "我没有把火焰煽得足够高吗?",
- "3": "我燃尽了……但这让我进步的动力燃烧得更旺了!"
- },
- "defeat": {
- "1": "我的熊熊烈火无法被扑灭!",
- "2": "我的宝可梦因这次胜利而变得更加强大!",
- "3": "哈!我的激情燃得比你的更热烈!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "我,火箭队的领袖,\n会让你的世界感受到痛苦!",
- "2": "我在这里的训练在我再次面对老朋友之前至关重要。",
- "3": "我认为你还没有准备好迎接你即将经历的失败!"
- },
- "victory": {
- "1": "什么!我输了?! 我没什么可和你说的!",
- "2": "哼……你永远无法理解我希望实现的目标。",
- "3": "这次失败只是暂时的。$我将找准时机,让火箭队浴火重生。"
- },
- "defeat": {
- "1": "不知自己几斤几两,\n说明你仍然只是一个孩子。",
- "2": "不要再试图干涉我。",
- "3": "我希望你明白挑战我是多么愚蠢。"
- }
- },
- "roxanne": {
- "encounter": {
- "1": "您能否展示一下您是如何战斗的么?",
- "2": "你可以和更多训练师战斗来学到很多东西。",
- "3": "哦,被你抓到我正在用功了~$你想战斗吗?"
- },
- "victory": {
- "1": "哦,看来我输了。$我明白了。",
- "2": "看来我在战斗方面还有更多东西要学。",
- "3": "我会把今天在这里学到的东西铭记于心。"
- },
- "defeat": {
- "1": "从我们的对战中,我学到了很多。$希望你也是。",
- "2": "我期待再次与你战斗。$希望你能运用在此学到的东西。",
- "3": "我凭借我所学到的一切赢得了胜利。"
- }
- },
- "brawly": {
- "encounter": {
- "1": "哦,伙计,挑战者!$让我看看你的能耐!",
- "2": "你看起来很厉害嘛。$来对战吧!",
- "3": "是时候掀起风暴了!$我们上吧!"
- },
- "victory": {
- "1": "哦哇,你把我冲走了!",
- "2": "你驾驭了我的海浪,把我打败了!",
- "3": "我觉得我就像是在武斗洞窟里迷路了!"
- },
- "defeat": {
- "1": "哈哈,我驾驭了大浪!$有时间再挑战我吧。",
- "2": "再和我一起冲浪吧!",
- "3": "就像潮水的涨落,\n我希望你也能再来挑战我。"
- }
- },
- "wattson": {
- "encounter": {
- "1": "是时候被电击了!$哈哈哈!",
- "2": "我要让火星子飞蹦!$哈哈哈!",
- "3": "我希望你带了麻痹药!$哇哈哈哈!"
- },
- "victory": {
- "1": "看来我的电量用完了!$哇哈哈哈!",
- "2": "你完全接地了是吧!$哇哈哈哈!",
- "3": "谢谢你给我电了一下!$哇哈哈哈!"
- },
- "defeat": {
- "1": "电充充满,有时间再挑战我吧!$哇哈哈哈!",
- "2": "我希望你觉得我们的战斗激情似电!$哇哈哈哈!",
- "3": "你没想到我赢了吧?$哇哈哈哈!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "很高兴见到你!等等,不对……$我要粉碎你!",
- "2": "我才当道馆主没多久,\n但我会让你灰飞烟灭!",
- "3": "是时候展示爷爷教给我的招式了!来对战吧!"
- },
- "victory": {
- "1": "你让我想起了我的爷爷……$难怪我输了。",
- "2": "我是不是太努力了?$我应该放松,不能太上头了。",
- "3": "失败才不会呛到我。$是时候重新点燃训练了!"
- },
- "defeat": {
- "1": "我希望我让祖父感到骄傲了……$有时间我们再战斗吧。",
- "2": "我……我简直不敢相信我赢了!$按照自己的方式做事奏效了!",
- "3": "早点用炽热的招式再来交手吧!"
- }
- },
- "norman": {
- "encounter": {
- "1": "我没想到你能一路来到这里。$我们来对战吧。",
- "2": "作为道馆主,我会尽一切努力赢得胜利。$我们开始吧!",
- "3": "你最好全力以赴。$对战的时候到了!"
- },
- "victory": {
- "1": "我输给了你……?$但规则就是规则。",
- "2": "难道我不该从城都搬家吗……?",
- "3": "我不敢相信。$这是一场好对战。"
- },
- "defeat": {
- "1": "我们都尽力了。$希望我们不久之后能再对战。",
- "2": "你应该尝试挑战我的孩子。$可能会有一些收获!",
- "3": "谢谢你精彩的战斗。$下次好运。"
- }
- },
- "winona": {
- "encounter": {
- "1": "我一直在天空中翱翔寻找猎物…$而你就是我的目标!",
- "2": "不管战况如何,我都会和我的飞行宝可梦$以优雅的姿态获胜。来战斗吧!",
- "3": "我希望你不怕高。$我们一起升上高空吧!"
- },
- "victory": {
- "1": "你是我见过的第一位比我更有风度的训练师。$打的非常出色。",
- "2": "哦,我的飞行系宝可梦都已经坠落了!$好吧。",
- "3": "尽管我倒下了,我的宝可梦将继续翱翔!"
- },
- "defeat": {
- "1": "我与我的飞行系宝可梦,\n将永远优雅地起舞!",
- "2": "我希望你喜欢我们的演出。$我们优雅的舞蹈已经落幕。",
- "3": "你愿意再来观看我们优雅的编舞吗?"
- }
- },
- "tate": {
- "encounter": {
- "1": "嘿嘿嘿…$看到我没和妹妹在一起,很惊讶么?",
- "2": "我可以读懂你在想什么…$你想要战斗!",
- "3": "你如何击败一个…$读懂你一举一动的人?"
- },
- "victory": {
- "1": "赢不了啊…$我想小南了…",
- "2": "你和宝可梦之间的联系比我们更强。",
- "3": "如果我和小南联手,我们会赢的。$我们可以了解彼此的想法!"
- },
- "defeat": {
- "1": "我和我的宝可梦无与伦比!",
- "2": "如果你连我都打不过,\n你肯定也打不过小南。",
- "3": "这多亏了我和小南的严格训练。$我可以与宝可梦一心同体。"
- }
- },
- "liza": {
- "encounter": {
- "1": "呵呵呵…$看到我没和哥哥一起,很惊讶吗?",
- "2": "我可以读懂你渴望什么…$你想战斗,不是吗?",
- "3": "你如何击败一个…$与宝可梦们一心同体的人?"
- },
- "victory": {
- "1": "赢不了啊…$我想小枫了…",
- "2": "你和宝可梦之间的联系…$比我强。",
- "3": "如果我和小枫在一起,我们会赢的。$我们甚至可以接上彼此的话!"
- },
- "defeat": {
- "1": "我和我的宝可梦势不可挡。",
- "2": "如果你连我都打不过,\n你肯定也打不过小枫。",
- "3": "这多亏了我和小枫的严格训练。$我可以与我的宝可梦一心同体。"
- }
- },
- "juan": {
- "encounter": {
- "1": "别害羞啊。$我们来战斗吧!",
- "2": "啊哈哈哈,敬请期待\n我和水属性宝可梦的盛大演出!",
- "3": "我就是正在逼近的风暴!$你能经受住考验吗?",
- "4": "请你见证我们的表演。$由我和宝可梦共同创造的宏伟水之幻境!"
- },
- "victory": {
- "1": "你可能是一个能挑战米可利的天才!",
- "2": "我专注于优雅,而你刻苦锻炼。$你能击败我是很正常的。",
- "3": "啊哈哈哈!$好吧,这次你赢了。",
- "4": "从你身上,我感受到了技巧的光辉,\n它将战胜一切。"
- },
- "defeat": {
- "1": "宝可梦和我创造的水之幻境,让我取得了胜利。",
- "2": "啊哈哈哈,我赢了,你输了。",
- "3": "要我把我的服装借给你吗?\n可能能帮到你对战啊!$啊哈哈哈,我开玩笑的!",
- "4": "我是赢家!也就是说,你输了。"
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "极限! 极限! 看好了!$极限假面…就此…登场!",
- "2": "极限! 极限! 极限假面!",
- "3": "我是滔滔巨浪,将你冲走!"
- },
- "victory": {
- "1": "我真是笑得合不拢嘴啊!$哈哈哈!那真是太有趣了!",
- "2": "呼哇!结束收尾了!$我该怎么说呢……$我还想再对战!我还想再继续战斗!",
- "3": "啊啊啊啊啊!?"
- },
- "defeat": {
- "1": "耶!就是这样!",
- "2": "我赢了,但我还想要更多!\n我还想再更多地战斗!",
- "3": "再见!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "我将向你展示华丽的飞行宝可梦真正的力量!",
- "2": "风啊,伴我同行!",
- "3": "爸爸!我希望你能在空中注视着我的战斗!"
- },
- "victory": {
- "1": "明白了……我会礼貌地退场。",
- "2": "输了就是输了。你确实很强大。",
- "3": "…行吧! 嗯, 我输了。"
- },
- "defeat": {
- "1": "爸爸!我用你珍爱的飞行宝可梦赢了……",
- "2": "飞行系宝可梦才是最强的!",
- "3": "感觉我正在追赶上我的父亲!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "无论你的小脑瓜子在搞什么阴谋诡计,$我和我的搭档都会确保它石沉大海。",
- "2": "我来这里可不是为了闲聊,\n而是为了赢!",
- "3": "这是我的宝可梦给你的一点小礼物……\n我希望你能接受!"
- },
- "victory": {
- "1": "你和你的宝可梦太过分了……",
- "2": "怎么……?这怎么可能?!",
- "3": "我完全被冲走了!"
- },
- "defeat": {
- "1": "汹涌的海浪再次袭来!",
- "2": "是时候乘风破浪,取得胜利了!",
- "3": "诶嘿嘿!"
- }
- },
- "melony": {
- "encounter": {
- "1": "我不会手下留情!",
- "2": "好吧,我想我们应该开始了。",
- "3": "我会把你冻得结结实实的!"
- },
- "victory": {
- "1": "你……你可厉害了,是不是?",
- "2": "如果你找到玛瓜,一定要好好教训他,好吗?",
- "3": "你的破冰方式有点过于直接了呢……"
- },
- "defeat": {
- "1": "现在你知道战斗有多残酷了吧?",
- "2": "嘿!看来我又赢了!",
- "3": "你是在保留实力吗?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "你看起来很强!来吧!让我们开始吧!",
- "2": "我的强大像大海一样无边无际。$你会被我冲走,绝对的。",
- "3": "哦豁,由我来面对你!这可不得了咯!"
- },
- "victory": {
- "1": "你太厉害了!\n你培养了一些非常强大的宝可梦啊,$你已经掌握了训练师的精髓!",
- "2": "你不仅仅是看起来,\n你是真的强,真的!$呃,我也被冲走了!",
- "3": "你像凶猛的波浪一样强壮!"
- },
- "defeat": {
- "1": "你很强,但这还不足以动摇大海,懂?",
- "2": "嘻!看来我又赢了!",
- "3": "甜蜜的胜利!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "打扰了。你是挑战者,对吗?$我是四天王的幽灵系宝可梦使用者,$婉龙,我将是你的对手。",
- "2": "我非常喜欢描写来到这里的训练师,\n以及他们训练的宝可梦。$我可以用你和你的宝可梦作为主题吗?",
- "3": "每个与宝可梦相处的人都有故事要讲。$接下来要讲的故事是怎样的呢?"
- },
- "victory": {
- "1": "哇。我惊呆了!",
- "2": "对…对不起!我必须先向我的宝可梦道歉……$都是因为我让你们有了不好的经历,真的很抱歉!",
- "3": "你要知道,我仍然是四天王之一!"
- },
- "defeat": {
- "1": "额呵呵。",
- "2": "给了我下一部小说的绝佳素材!",
- "3": "就这样,又一篇故事来到尾声……"
- }
- },
- "marshal": {
- "encounter": {
- "1": "我的师傅,阿戴克,\n看到了你作为训练师的潜力,$对你很有兴趣。$我要来考验你——挖掘你力量的极限。\n丹田发力!",
- "2": "胜利,决定性的胜利,\n正是我所求!挑战者,我来了!",
- "3": "在我的心中,我寻求着成为战士的力量,\n克服自身的所有弱点!$以我的信念,取胜!"
- },
- "victory": {
- "1": "呼!干得好!",
- "2": "不要停止战斗,追求更高的目标!",
- "3": "你和你宝可梦展现的力量\n给我留下了深刻的印象……"
- },
- "defeat": {
- "1": "嗯…",
- "2": "这真是场好战斗。",
- "3": "哈啊!哈啊!嗨呀啊!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "你让我想起了一位老朋友。$这让我对这场宝可梦战斗感到兴奋!",
- "2": "不考虑清楚这一点,\n宝可梦对战就没有了意义。$这就是失去了和宝可梦一同战斗的意义。",
- "3": "我的名字是黑连!我是道馆馆主,\n也是老师!$很高兴认识你。"
- },
- "victory": {
- "1": "谢谢……我又能发现自己的不足了。",
- "2": "谢谢…接近理想的道路…我好像隐约看到了。",
- "3": "嗯……这值得思考。"
- },
- "defeat": {
- "1": "作为道馆馆主,我要成为你要跨越的壁垒!",
- "2": "好吧!",
- "3": "正因为有宝可梦,我们才能走到这里。$为什么宝可梦会帮助我们,\n这个恐怕不仅是宝可梦与训练家…$而是生命与生命之间的问题。"
- }
- },
- "chili": {
- "encounter": {
- "1": "咿呀!是时候玩火了!!我是三兄弟中最强的!",
- "2": "嗒哒!如火似焰的伯特——就是我\n——你接下来的对手!",
- "3": "我将向你展示,\n我和我炽热的火系宝可梦的能耐!"
- },
- "victory": {
- "1": "被你干掉了。我……燃尽了……",
- "2": "哇吼!你燃起来了!",
- "3": "啊!被你干碎了!"
- },
- "defeat": {
- "1": "我燃起来啦!和我玩儿,你就会被烫伤!",
- "2": "你要是玩儿火,就会被烫伤!",
- "3": "我说,拜托,\n你的对手是我,没机会赢的!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "无关个人情感…也不会有艰难的感受…$我和我的草属性宝可梦会…$呃…不管什么样的对手我们都会应战的。",
- "2": "所以,呃,如果你愿意的话,我会,\n呃,尽我所能做好,呃,你知道的,你的对手。",
- "3": "好吧……所以,我是天桐,\n我喜欢草属性宝可梦。"
- },
- "victory": {
- "1": "呃……已经结束了吗?",
- "2": "…真是太意外了。你真…强。$看起来就算是伯特或寇恩都赢不了你…",
- "3": "…嗯。看起来我来的…不是时候?"
- },
- "defeat": {
- "1": "哈?我赢了?",
- "2": "我想…$我想我赢了,因为我一直在和我的兄弟伯特和寇恩竞争,\n我们都变得更强了。",
- "3": "…这…这是一次非常吓人的经历呢…"
- }
- },
- "roark": {
- "encounter": {
- "1": "我需要看看你作为训练师的潜力。$还有,我要看看与你并肩作战的宝可梦的坚韧!",
- "2": "来吧!这些是我的岩石系宝可梦,我的骄傲!",
- "3": "岩石属性宝可梦就是最强的!",
- "4": "我要看看你作为训练师的潜力。$还要看看与你并肩作战的宝可梦的坚韧!"
- },
- "victory": {
- "1": "什么?不可能!我强化的宝可梦们!",
- "2": "……我大脑过载了。$下次邀请你参加地下的化石挖掘比赛。",
- "3": "有你这种技术,赢得胜利是很正常的。",
- "4": "什么?!连这也不够?",
- "5": "我搞砸了。"
- },
- "defeat": {
- "1": "看?我为我的摇滚战斗风格感到骄傲!",
- "2": "谢谢!这场战斗给了我自信,$我感觉能够打败我父亲了!",
- "3": "我感觉就像我砸穿了一块顽石!"
- }
- },
- "morty": {
- "encounter": {
- "1": "只要我再多努力一点,我就能看到我遇到传说中的宝可梦的未来!$你会帮助我达到那个水平!",
- "2": "据说,彩虹色的宝可梦会\n出现在真正强大的训练师面前。 $我一直相信着这个美丽的传说,\n所以,从出生开始,\n就在这里进行着秘密的修行。$因为这样,其他人看不到的东西\n我也能够看得到…$我看到的,是那个将传说中的宝可梦\n召唤到这片大地上的人的影子。$我一直相信,那就是我自己!\n希望你也能助我一臂之力!",
- "3": "无论你相信还是不相信,神秘的力量确实存在。",
- "4": "你可以见证我训练的成果。",
- "5": "你必须让你与宝可梦的灵魂合二为一。你能做到吗?",
- "6": "嘿,你想成为我训练的一部分吗?"
- },
- "victory": {
- "1": "我还不够好……",
- "2": "我明白了…你的旅程…去了遥远的地方,你见过的比我多得多。$我羡慕你…",
- "3": "这怎么可能……",
- "4": "我认为我们的潜力没什么不同。$但是,我觉得你并不简单,似乎还有什么……",
- "5": "我想我需要更多的训练。",
- "6": "那太遗憾了"
- },
- "defeat": {
- "1": "我又向前迈进了一步。",
- "2": "呵呵呵……",
- "3": "什…么?!那还不够?",
- "4": "我感觉就像我砸穿了一块顽石!",
- "5": "哈哈哈啊!",
- "6": "我知道我会赢!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "我想赢,所以接下来我正要赢!",
- "2": "我想对战就对战!懂吗!就应该这样!"
- },
- "victory": {
- "1": "我想赢……但我还是输了!",
- "2": "我输了……因为我赢不了!"
- },
- "defeat": {
- "1": "嘿,等一下。我是不是赢了?$我觉得我赢了!太满足了!",
- "2": "哇哦!那太棒了!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "我想帮助某个人。因此,我不能输。$…我们的战斗现在开始。"
- },
- "victory": {
- "1": "我还不够,我明白了。"
- },
- "defeat": {
- "1": "胜利属于我。打得好。"
- }
- },
- "lacey": {
- "encounter": {
- "1": "我将用我平时的队伍\n作为四天王的一员面对你。"
- },
- "victory": {
- "1": "打得真好呀~"
- },
- "defeat": {
- "1": "让我们为你宝可梦的努力给予热烈的掌声!"
- }
- },
- "drayton": {
- "encounter": {
- "1": "哥们,我喜欢椅子。\n你喜欢椅子吗?简直是救星。$我不明白为什么大家不一直坐着。\n站着多累人!"
- },
- "victory": {
- "1": "我早该想到的!"
- },
- "defeat": {
- "1": "嘿嘿嘿!别介意我,\n我只是在这里小赢一下。$如果你不开心,我懂,\n但别因为我对乌栗发火,OK?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "我用那些强壮的植物\n盖出来的游乐场精彩吗?$它们的力量象征着我这个园丁兼道馆馆主的实力,\n你真的确定能够与之抗衡吗?"
- },
- "victory": {
- "1": "你信任你的宝可梦,\n它们也信任你…不错的战斗,小豆芽。"
- },
- "defeat": {
- "1": "呵呵呵…确实,\n脆弱的小草甚至能穿透混凝土。"
- }
- },
- "viola": {
- "encounter": {
- "1": "败阵时的后悔,胜利的瞬间…$都是最棒的影象!很好呀,很好呀!$那么来吧!",
- "2": "我的镜头总会聚焦在胜利上,\n我不会让任何事情破坏这个画面!"
- },
- "victory": {
- "1": "你和你的宝可梦向我展示了一个全新的镜头机位!\n很好呀,很好呀!",
- "2": "你通过镜头看到的世界,\n和你与宝可梦并肩作战时看到的世界…$视角不同,即使是同一个世界看起来也完全不同。"
- },
- "defeat": {
- "1": "我胜利那一刻的照片,\n将是一个真正的赢家,对吧!",
- "2": "是的!我拍了些很棒的照片!"
- }
- },
- "candice": {
- "encounter": {
- "1": "向小菘我挑战吗?好啊!\n我就是在等待强者$但是我也气势高昂,很强哦?",
- "2": "宝可梦也好,时尚也好,恋爱也好,\n无论做什么都气势高昂!$就说到这儿吧,让你见识一下我的气势,\n要做好觉悟哦!"
- },
- "victory": {
- "1": "好厉害!我有点尊敬你了。",
- "2": "好厉害!我有点尊敬你了!$嗯,感觉是被你的气势给压倒了。"
- },
- "defeat": {
- "1": "你的气势我看到了,但我还是不会输的!",
- "2": "怎么样?小菘我的气势!\n宝可梦们的气势满满哦!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "你身上有一种胜利的气息。\n那么不管怎样,$这应该会是场有趣的战斗。\n让我们对战吧!"
- },
- "victory": {
- "1": "太棒了!你可擅长对战了,不是吗?"
- },
- "defeat": {
- "1": "太好了!我的宝可梦和我都很棒!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "好的!让我来接受你的挑战!"
- },
- "victory": {
- "1": "战斗是一件深刻而复杂的事情……"
- },
- "defeat": {
- "1": "战胜一位四天王并不容易。"
- }
- },
- "cress": {
- "encounter": {
- "1": "没!错!你必须面对\n与我和我高贵的水属性的战斗!"
- },
- "victory": {
- "1": "输了?我?我不敢相信。"
- },
- "defeat": {
- "1": "当你的对手是我时,这是必然的结果。"
- }
- },
- "allister": {
- "encounter": {
- "1": "我是欧尼奥。$我…我来了……"
- },
- "victory": {
- "1": "我差点被吓得丢了面具…那真是…$哇。我可以看清你真正的实力。"
- },
- "defeat": {
- "1": "这真是太棒了!"
- }
- },
- "clay": {
- "encounter": {
- "1": "咳咳! 让我好等,不是吗,孩子?$好吧,是时候看看你能做到什么了!"
- },
- "victory": {
- "1": "真是的……我先说好,\n我可没有手下留情。"
- },
- "defeat": {
- "1": "最重要的是输掉的时候该怎么办。$只要你能在失败中找到教训,\n就能够不断地成长!"
- }
- },
- "kofu": {
- "encounter": {
- "1": "我会给你上一整道水系宝可梦大餐!\n但别真吃了它们!"
- },
- "victory": {
- "1": "吃了吗!你真是活力又新鲜啊,\n不是吗!$就是有点太鲜活了!"
- },
- "defeat": {
- "1": "你要再来找我,听见了吗?"
- }
- },
- "tulip": {
- "encounter": {
- "1": "请让我运用我的化妆技巧,$让你可爱的小宝可梦变得更美丽!"
- },
- "victory": {
- "1": "你妆点的力量宛如魔法加固,\n完全冲洗不掉啊。"
- },
- "defeat": {
- "1": "你知道吗,在我这行,\n那些没天赋的人往往会很快消失,$再也不会被提起。"
- }
- },
- "sidney": {
- "encounter": {
- "1": "你给我的印象不错,\n我猜这会是一场精彩的对战。$很棒!看起来真的很棒!$你和我,让我们享受一场\n只能在这里上演的战斗吧!"
- },
- "victory": {
- "1": "嗯,你觉得怎样?我输了!\n嗯,不过这很有趣,所以无所谓啊。"
- },
- "defeat": {
- "1": "别介意,OK?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "过去我在修行时得到了\n能与幽灵宝可梦亲密交流的能力。$没错,我和宝可梦之间\n有著强烈的羁绊。$那么,来试试看你有没有能力\n伤到我的宝可梦吧!"
- },
- "victory": {
- "1": "哦,天呀。我输了。"
- },
- "defeat": {
- "1": "我期待着下次再和你战斗!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "我在这儿见到的尽是些\n弱不禁风的训练家和宝可梦。$你又如何呢?如果你能让我不得不用\n上全力的话就再好不过了!"
- },
- "victory": {
- "1": "你和你的宝可梦…\n你们的灵魂燃烧得多么热烈啊!$这股激烈的热能仿佛能征服一切。\n$难怪我的冰属性技巧也奈何不了你了。"
- },
- "defeat": {
- "1": "一场充满激情的战斗,确实。"
- }
- },
- "drake": {
- "encounter": {
- "1": "对于我们这些将宝可梦视为\n同伴一同战斗的训练家来说,$你知道怎样才能赢得胜利吗?\n你知道获得胜利的条件吗?$如果你不知道,\n那么你永远也无法战胜我!"
- },
- "victory": {
- "1": "干得漂亮,就是这样。"
- },
- "defeat": {
- "1": "我在这场战斗中全力以赴了!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "你的气质变了,\n我能感觉到这一点。$现在,把你和你的宝可梦\n的力量展现给我看吧。$作为回礼,就由我和我的宝可梦\n演出一场水之幻影吧!"
- },
- "victory": {
- "1": "精彩。此刻,我能从你身上感觉到\n身为宝可梦训练家的可靠与高贵。$我真荣幸能遇到你和你的宝可梦。"
- },
- "defeat": {
- "1": "伟大的幻影!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "只要能让我用冰属性宝可梦,\n就绝对没人能赢得过我!\n能冻住对方可是很厉害的哦!$因为如果被冻住,你的宝可梦就无法动弹了!\n啊哈哈!你做好觉悟了吧!"
- },
- "victory": {
- "1": "你怎么敢!"
- },
- "defeat": {
- "1": "一旦你被冻结,你就什么都做不了。"
- }
- },
- "will": {
- "encounter": {
- "1": "我曾经环游世界,\n日以继夜地做着超能力宝可梦的修行之旅。$我会不断变强!没理由会在这里输掉!"
- },
- "victory": {
- "1": "……不会吧……"
- },
- "defeat": {
- "1": "就差一点。\n我想知道你缺少了什么。"
- }
- },
- "malva": {
- "encounter": {
- "1": "我的内心可是一直燃烧着呢。$燃烧着对你的怒火!"
- },
- "victory": {
- "1": "挑战者出色地击败了四天王之一,帕琦拉。"
- },
- "defeat": {
- "1": "真开心啊,能将你彻底粉碎!"
- }
- },
- "hala": {
- "encounter": {
- "1": "老哈拉让你放开嗓子!"
- },
- "victory": {
- "1": "我能感受到你在旅途中获得的力量。"
- },
- "defeat": {
- "1": "啊哈哈。多么有趣的战斗。"
- }
- },
- "rika": {
- "encounter": {
- "1": "我要对你手下留情,但……骗你的啦!$好好动脑!"
- },
- "victory": {
- "1": "不错,小子。"
- },
- "defeat": {
- "1": "啊哈哈哈哈!你真的很特别,小子!"
- }
- },
- "molayne": {
- "encounter": {
- "1": "我将队长的位置让给了我的表弟马玛内,\n但我对自己的能力很有信心。 $我的力量就像超新星一样!"
- },
- "victory": {
- "1": "我发现了一个有趣的训练师对手!"
- },
- "defeat": {
- "1": "啊哈哈。多么有趣的战斗。"
- }
- },
- "bruno": {
- "encounter": {
- "1": "我们将用势不可挡的力量磨灭你!呼哈!"
- },
- "victory": {
- "1": "为什么?我怎么会输?"
- },
- "defeat": {
- "1": "你可以随意挑战我,\n但结果永远不会改变!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "我是阿笔!\n对虫系宝可梦的熟悉不会输给任何人的!"
- },
- "victory": {
- "1": "哇,太棒了!\n你是个宝可梦专家!$我的研究还没有完成。\n好吧,你赢了。"
- },
- "defeat": {
- "1": "谢谢!多亏了我们的战斗,\n我的研究也取得了进展!"
- }
- },
- "koga": {
- "encounter": {
- "1": "哇哈哈哈哈!$宝可梦不仅仅是关于蛮力,拭目以待吧!"
- },
- "victory": {
- "1": "啊!你证明了自己!"
- },
- "defeat": {
- "1": "懂不懂要对忍者的技巧心神畏惧?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "啊,让老婆婆看看你学到了什么?"
- },
- "victory": {
- "1": "好吧,亲爱的孩子,\n不得不说,那令人印象深刻。$你的宝可梦相信你并尽最大努力为你赢得胜利。$尽管我输了,\n我也止不住笑呢!"
- },
- "defeat": {
- "1": "哈哈哈!看来老婆婆我赢了!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "那么,挑战者,让我来研究$你与你精心养育的宝可梦要如何战斗!"
- },
- "victory": {
- "1": "我关于你的理论是正确的。$你不仅仅是有天赋……你很努力!\n我向你致敬!"
- },
- "defeat": {
- "1": "啊哈哈!如果你输了,\n一定要分析原因,$并在下一场战斗中运用那些知识!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "只要我活着,我将不断努力寻求终极美食…$以及和最强的对手战斗!"
- },
- "victory": {
- "1": "您的事迹,我志米铭记在心。"
- },
- "defeat": {
- "1": "我们的宝可梦战斗就像我灵魂的养料。\n它将让我继续前进。$这就是我将向你表示敬意的方式,\n感谢你在战斗中全力以赴!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "准备好了吗!我要给你上一课!"
- },
- "victory": {
- "1": "够野的!你的想法比我的还要毒!"
- },
- "defeat": {
- "1": "嘿,拜托!认真点!\n你要加把劲啊!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "没什么开场白。\n是时候和我丽姿,战斗了!"
- },
- "victory": {
- "1": "真的很可爱……你和你的宝可梦……"
- },
- "defeat": {
- "1": "嗯哼。"
- }
- },
- "poppy": {
- "encounter": {
- "1": "哦!你想和我进行宝可梦对战么?"
- },
- "victory": {
- "1": "呜哇?!嘛……"
- },
- "defeat": {
- "1": "耶!我做到了!我击~败~了~你!\n你可以来…打…复仇之战?$只要你想,随时来打复仇之战吧!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "宝可梦是为战斗而生的! \n让我来告诉你什么是真正的战斗吧!"
- },
- "victory": {
- "1": "呵呵!你可真是了不起!"
- },
- "defeat": {
- "1": "额哈哈哈,真正的战斗就是该这样。"
- }
- },
- "flint": {
- "encounter": {
- "1": "希望你已经热身完毕,\n因为这里即将大爆炸!"
- },
- "victory": {
- "1": "不可思议!$你的动作如此火热,让我看起来温吞吞的!"
- },
- "defeat": {
- "1": "嗯?就这吗?\n我觉得你得再激情点。"
- }
- },
- "grimsley": {
- "encounter": {
- "1": "一无所有,\n或者,赢下所有!"
- },
- "victory": {
- "1": "一旦失败,\n就意味着失去一切……$下一次我要追寻胜利!"
- },
- "defeat": {
- "1": "如果有人赢了,\n和他对战的人就会输。"
- }
- },
- "caitlin": {
- "encounter": {
- "1": "当花儿绽开时、我便出现。\n成为你在等待的人…$你似乎同时具备实力和善意$我所寻找的是拥有卓越力量的对手…$请用出你的全力吧!"
- },
- "victory": {
- "1": "我和我的宝可梦学到了很多!非常感谢。"
- },
- "defeat": {
- "1": "我渴望以优雅的姿态取得胜利。"
- }
- },
- "diantha": {
- "encounter": {
- "1": "与你的宝可梦对战\n让你充满了未来的希望…$说真的,这让我更有活力地面对新的一天,确实如此!"
- },
- "victory": {
- "1": "拥有高尚灵魂的训练家和宝可梦的身姿,\n让我的心激烈地震颤…"
- },
- "defeat": {
- "1": "哦,太棒了!你觉得怎么样?\n我的队伍很酷吧~对吧?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "年轻的挑战者,幸会!\n我乃是著名的钢铁之刃,公爵雁铠! $让我们开始战斗吧!预备!"
- },
- "victory": {
- "1": "辉煌!你与你尊贵的\n宝可梦之间的信任居然胜过了我!"
- },
- "defeat": {
- "1": "哦哦哦!这是怎么回事,\n我的心止不住地在震颤! $与如此有价值的对手的胜利\n让我的灵魂飞翔——我心翱翔!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "对战只是找个乐子!来吧,我来会会你!"
- },
- "victory": {
- "1": "我……我说不出话!你是怎么做到的?!"
- },
- "defeat": {
- "1": "哈哈!真是吓人倒怪的胜利呀!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "……你好,我是青木。$麻烦的是我还要兼任四天王。"
- },
- "victory": {
- "1": "好吧,我们翅膀下的疾风止于你这了啊…"
- },
- "defeat": {
- "1": "是时候和老板开会了。"
- }
- },
- "lance": {
- "encounter": {
- "1": "我一直在等你。让我来试试你有几斤几两。",
- "2": "我知道你能走这么远。让我们开始吧。"
- },
- "victory": {
- "1": "被你拿下了啊。你太出色了!",
- "2": "我从没想到会有另一个训练师打败我……$我很惊讶。"
- },
- "defeat": {
- "1": "就差一点。想再试一次吗?",
- "2": "我没觉得你弱,别因此困扰。"
- }
- },
- "karen": {
- "encounter": {
- "1": "我是梨花,你想和我的恶属性宝可梦$来一场对决吗?",
- "2": "我和你见过的那些人不一样。",
- "3": "你组建了一支迷人的队伍。$我们的战斗应该会是场精彩的比赛。"
- },
- "victory": {
- "1": "不!我赢不了。你是怎么做到变得这么强的?",
- "2": "我不会偏离我所选择的道路。",
- "3": "冠军正期待与你见面。"
- },
- "defeat": {
- "1": "意料之中。",
- "2": "嗯,还算有点意思。",
- "3": "随时欢迎你来找我。"
- }
- },
- "milo": {
- "encounter": {
- "1": "看起来你显然很了解宝可梦。$这会是一场激烈的战斗!$如果我想赢,我得让我的宝可梦极巨化!"
- },
- "victory": {
- "1": "草的力量凋谢了…多么不可思议的挑战者!"
- },
- "defeat": {
- "1": "这必将让你大吃一惊。"
- }
- },
- "lucian": {
- "encounter": {
- "1": "请稍等,我正在读的书\n正要进入最精彩的部分…$英雄获得了一把神秘之剑,\n即将面临最后的考验…啊,算了。$既然你能走到这一步,\n我就不说这些了,和你战斗吧。$让我看看你是否\n能像我书中的主角一样荣耀!"
- },
- "victory": {
- "1": "我明白了…看来你把我逼入了绝境。"
- },
- "defeat": {
- "1": "我得维护我的名誉。"
- }
- },
- "drasna": {
- "encounter": {
- "1": "你很厉害吧,\n而且相当相当地厉害呢。$我很高兴,能和这样的对手交手,\n就能更好地培养宝可梦们了。"
- },
- "victory": {
- "1": "哎呀,就这么结束了,\n不好意思,可以的话欢迎再来。"
- },
- "defeat": {
- "1": "怎么会这样?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "那么,既然来了……\n要不来看看今天的风更青睐谁?$是你……还是我?"
- },
- "victory": {
- "1": "让我这个四天王都感到沮丧,$看来你的力量货真价实。"
- },
- "defeat": {
- "1": "那真是一记好球!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "让你亲身感受一下什么叫做猛烈的对战气息吧!"
- },
- "victory": {
- "1": "这次幸运之神对你微笑了,但是……$谁知道你下次还会不会这么幸运。"
- },
- "defeat": {
- "1": "那挺厉害的吧!"
- }
- },
- "blue": {
- "encounter": {
- "1": "能走到这里,你一定非常优秀。"
- },
- "victory": {
- "1": "我只输给过他,现在又是你……?$你问他是谁?哈哈哈……"
- },
- "defeat": {
- "1": "看吧?我的实力就是我来到这里的原因。"
- }
- },
- "piers": {
- "encounter": {
- "1": "准备好和我的队伍来个大狂欢吧!$尖钉镇,是时候嗨起来了!"
- },
- "victory": {
- "1": "我和我的队伍已经尽力了。$找个时间再来对战吧……"
- },
- "defeat": {
- "1": "我的喉咙因为呼喊而变得沙哑……$但这是一场激动人心的战斗!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "哦……你的宝可梦给人印象深刻。$我想我会享受这场战斗的。"
- },
- "victory": {
- "1": "你真的很强。我也得加把劲了。"
- },
- "defeat": {
- "1": "我从没想到会赢。"
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "我依旧是冠军,所以我不会留情的。"
- },
- "victory": {
- "1": "这就是新冠军的崛起。"
- },
- "defeat": {
- "1": "我成功捍卫了冠军的头衔。"
- }
- },
- "steven": {
- "encounter": {
- "1": "告诉我…你在和宝可梦的旅途过程中看到了什么?$邂逅了那么多的训练师,\n你都会有什么样的感受呢?$在这丰饶的大地上旅行…\n有没有唤醒你内在的某种东西?$你不如就用一场对战来告诉我你心中的答案吧。$我也会和我的宝可梦用这种方式\n将我们所知道的告诉你的!"
- },
- "victory": {
- "1": "没想到连我这个联盟冠军\n都败在你的手上了呢…"
- },
- "defeat": {
- "1": "正如我所期待的。谢谢!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "我,竹兰,接受你的挑战!\n我是不会手软的!"
- },
- "victory": {
- "1": "无论对战多么有趣,\n它总会有结束的时候……"
- },
- "defeat": {
- "1": "即使你输了,\n也永远不要失去你对宝可梦的热爱。"
- }
- },
- "iris": {
- "encounter": {
- "1": "你知道吗?\n我真的很期待和强大的训练师进行认真的战斗!$我的意思是,来吧!\n到达这里的是那些渴望胜利的训练师,$他们与经历过无数艰难\n战斗的宝可梦一起战斗!$如果我和那样的人战斗,\n不仅我会变得更强,我的宝可梦也会!$我们也会更好地了解彼此!\n好!做好准备吧!$我是艾莉丝,宝可梦联盟冠军,\n我,将打败你!"
- },
- "victory": {
- "1": "啊……我尽力了,但我们输了……"
- },
- "defeat": {
- "1": "耶!我们赢了!"
- }
- },
- "hau": {
- "encounter": {
- "1": "我想知道,训练师是否会根据他们是\n来自温暖地区还是寒冷地区而以不同的方式战斗。$让我们来测试一下!"
- },
- "victory": {
- "1": "那太棒了!我觉得我现在有点了解你的感觉了!"
- },
- "defeat": {
- "1": "老铁,这才叫战斗!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "我决定再试一次。$来吧…让我看看你的训练成果。"
- },
- "victory": {
- "1": "我期待着你的成就!"
- },
- "defeat": {
- "1": "怎么,这就结束了?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "耶!我太兴奋了!让我们稍微放轻松!"
- },
- "victory": {
- "1": "好吧,太糟了,但我还是玩得很开心!$下次我一定会赢你!"
- },
- "defeat": {
- "1": "好吧,那是一场很棒的战斗!$肯定是会有收获的啦。"
- }
- },
- "leon": {
- "encounter": {
- "1": "来享受一段冠军时刻吧!"
- },
- "victory": {
- "1": "我的冠军生涯结束了……$但这是多么美好的冠军时刻啊!$谢谢你给了我最精彩的一战!"
- },
- "defeat": {
- "1": "名副其实的冠军时刻!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "嘿!你不认为宝可梦超级可爱吗?"
- },
- "victory": {
- "1": "哇啊!哇啊!你太坏了!"
- },
- "defeat": {
- "1": "就是这样!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "哈!你想挑战我?你是勇敢还是无知?"
- },
- "victory": {
- "1": "你很强!能不能收我为徒?"
- },
- "defeat": {
- "1": "搞定。你明白我比你强得多了吗?"
- }
- },
- "katy": {
- "encounter": {
- "1": "不要放松警惕,除非你想被虫丝绊倒哦!"
- },
- "victory": {
- "1": "我可爱的宝可梦们都像苍蝇一样坠落了!"
- },
- "defeat": {
- "1": "开饭啦,我可爱的彩粉蝶!"
- }
- },
- "pryce": {
- "encounter": {
- "1": "年轻不代表能获得胜利!经验才是关键。"
- },
- "victory": {
- "1": "无与伦比!赢得完美,试着不要忘记你现在的感受。"
- },
- "defeat": {
- "1": "正如我所料。"
- }
- },
- "clair": {
- "encounter": {
- "1": "你知道我是谁吗?知道还敢挑战我?"
- },
- "victory": {
- "1": "我想知道以你现在的水平能走多远,有趣。"
- },
- "defeat": {
- "1": "就是这样。"
- }
- },
- "maylene": {
- "encounter": {
- "1": "我现在要挑战你,我不会保留任何实力。$请准备好战斗!"
- },
- "victory": {
- "1": "是我输了…"
- },
- "defeat": {
- "1": "太棒了。"
- }
- },
- "fantina": {
- "encounter": {
- "1": "你来挑战吧。我会胜利。$这就是家缘市的道馆馆主。"
- },
- "victory": {
- "1": "你是最强的,我认输了。"
- },
- "defeat": {
- "1": "我非常,非常高兴!"
- }
- },
- "byron": {
- "encounter": {
- "1": "和我儿子瓢太一样的年轻人啊!$我相信培养年轻人\n关系到宝可梦光明的未来!$为此就让我来成为\n年轻人必须跨越的堡垒吧!"
- },
- "victory": {
- "1": "唔!我千锤百炼的宝可梦!"
- },
- "defeat": {
- "1": "哈哈哈哈!怎么样!我千锤百炼的宝可梦!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "战斗是决定命运的古老传统。让我们开始吧!"
- },
- "victory": {
- "1": "创造你自己的道路。$不要让任何东西阻挡你的路、你的命运、你的未来。"
- },
- "defeat": {
- "1": "我们的道路现在已经清晰了。"
- }
- },
- "volkner": {
- "encounter": {
- "1": "能留到最后的训练家想必肯定是很强的…$希望你会是能让我回忆起\n宝可梦对战乐趣的训练家!"
- },
- "victory": {
- "1": "我输了…$你的心意,宝可梦的不顾一切。$战斗的时候就让我热血沸腾。"
- },
- "defeat": {
- "1": "完全没感觉…$和我希望的完全不一样!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "唔…我有预感,\n只要赢了这场战斗就能画出更好的画来…$嗯!战斗充满了幻象!那么,马上开始吧。",
- "2": "当然,我对我所有的宝可梦都相当骄傲! $现在…让我们马上开始吧!"
- },
- "victory": {
- "1": "结束了吗?我的女神抛弃我了吗?",
- "2": "啊唔,输了……你还真是很强啊。"
- },
- "defeat": {
- "1": "唔啊……好……好美啊!",
- "2": "偶尔也有一些不是很好看的胜利,$但只要努力了,\n不管怎么样的战斗,都是很美丽的。"
- }
- },
- "elesa": {
- "encounter": {
- "1": "最后一击!\n在确信这一点的时候全身会流淌过电流!$为追求这个快感,\n我要用可爱的宝可梦们让你头晕眼花。"
- },
- "victory": {
- "1": "本想让你头晕的,\n结果我倒反被你电到了。"
- },
- "defeat": {
- "1": "感觉还不够啊……下次能使出全力来吗?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "终于到决战了!\n这是决定顶点的宝可梦对战吧?$我最喜欢顶点了!\n在高的地方能看到很远很远!$好了!就让我和你好好地玩一场吧!"
- },
- "victory": {
- "1": "和你的战斗让我更强了……谢谢。"
- },
- "defeat": {
- "1": "不管是赢了还是输了,战斗都能得到一些东西。"
- }
- },
- "brycen": {
- "encounter": {
- "1": "有其他的人和宝可梦在一起,$这份支持会让自己更强…\n让我来给你展示一下这样的强大吧!"
- },
- "victory": {
- "1": "你和你的宝可梦!配合得天衣无缝!\n华丽的友情!"
- },
- "defeat": {
- "1": "尝试极限!锻炼!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "现在我寻求的是\n能让我看到光明未来的年轻训练家。$你有多少实力,就让我用我的经验,\n我对宝可梦倾注的爱来验证吧!"
- },
- "victory": {
- "1": "失败后涌现的这灼热的意志…\n该怎么说呢…"
- },
- "defeat": {
- "1": "啊啊啊!你的实力就这种程度吗!"
- }
- },
- "grant": {
- "encounter": {
- "1": "我只期待一件事。. $通过超越彼此,\n我们找到通往更高境界的道路。"
- },
- "victory": {
- "1": "你是一堵我无法逾越的墙!"
- },
- "defeat": {
- "1": "不要放弃。\n这就是人生的真谛。$大道至简。"
- }
- },
- "korrina": {
- "encounter": {
- "1": "小女子科尔尼来大显身手啦!"
- },
- "victory": {
- "1": "正因为有你,\n才能让你的宝可梦进化!"
- },
- "defeat": {
- "1": "好劲爆的战斗呀!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "哦!我很高兴我们能见面!"
- },
- "victory": {
- "1": "你对战斗的热情激励了我!"
- },
- "defeat": {
- "1": "看来我的训练师成长强化机-马克2号,\n真的起作用了!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "哦,这不是一个年轻的训练师吗……\n能这样遇见你真是太好了。 $我想你已经获得了这场战斗的资格,\n作为对你努力的奖励。 $难以捉摸的妖精可能看起来像微风一样脆弱,\n像花朵一样精致,但很坚强。"
- },
- "victory": {
- "1": "我希望明天你也能找到一些值得会心微笑的事物……"
- },
- "defeat": {
- "1": "哦,天哪,这太遗憾了……"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "你知道吗?\n我们都说战斗能学到东西,羁绊之类的,$但实际上,我这么做只是因为有趣。 $谁在乎那些华而不实的东西?\n我们来战斗吧!"
- },
- "victory": {
- "1": "杰出!我像冰山一样坚硬,但你彻底击溃了我!"
- },
- "defeat": {
- "1": "和我干的结果就是这样!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "每个训练师和宝可梦都在努力追求胜利。$但这意味着你的对手也在努力赢得胜利。$最终,比赛是由哪一方\n能够发挥出他们真正的潜力来决定的。"
- },
- "victory": {
- "1": "我很高兴今天能和你战斗!"
- },
- "defeat": {
- "1": "这是我感觉自己的成长的好方式!"
- }
- },
- "bea": {
- "encounter": {
- "1": "你有没有一种不可动摇的精神,\n受到什么攻击都安如磐石? $就让我来试试吧?"
- },
- "victory": {
- "1": "我感受到了你的宝可梦\n在战斗中被你指挥时的战斗之魂。"
- },
- "defeat": {
- "1": "每个人都希望能有一场这样的好比赛。"
- }
- },
- "opal": {
- "encounter": {
- "1": "让我看看你和你的宝可梦的表现如何!"
- },
- "victory": {
- "1": "你不够粉嫩呀,\n但你是一个优秀的训练师,$还拥有着优秀的宝可梦。"
- },
- "defeat": {
- "1": "对你来说太惨了,我觉得。"
- }
- },
- "bede": {
- "encounter": {
- "1": "就让我来证明你有多可怜,我有多强大。"
- },
- "victory": {
- "1": "我懂了……好吧。其实我还没拿出全力呢。"
- },
- "defeat": {
- "1": "我觉得我打的不错。"
- }
- },
- "gordie": {
- "encounter": {
- "1": "好了,我们来做个了结吧!"
- },
- "victory": {
- "1": "我只想要挖一个洞爬进去……$好吧,现在更像是掉了进去。"
- },
- "defeat": {
- "1": "像往常一样战斗,胜利就会随之而来!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "事实上,言而总之… \n人家自己也想当冠军呀! $所以别认为我在针对你!"
- },
- "victory": {
- "1": "好吧,我还是输了……\n但是我看到了很多你和你宝可梦的优点哦"
- },
- "defeat": {
- "1": "希望你喜欢我们的战斗策略。"
- }
- },
- "raihan": {
- "encounter": {
- "1": "我打算击败冠军,赢得锦标赛,\n并向世界证明奇巴纳大人有多强!"
- },
- "victory": {
- "1": "就算输了我也好帅。$真是罪孽深重啊。$看来得再来张自拍了!"
- },
- "defeat": {
- "1": "为了纪念此刻,来张自拍吧!"
- }
- },
- "brassius": {
- "encounter": {
- "1": "你应该准备好了吧,\n一起完成这美丽的艺术作品吧!"
- },
- "victory": {
- "1": "啊……前卫!"
- },
- "defeat": {
- "1": "我将立即开始新的创作!"
- }
- },
- "iono": {
- "encounter": {
- "1": "谁在奇述!是我奇树!\n做好准备了吗!$...$直播开始!\n今天的小挑战者有多强?$奇树不知道哦~\n让我们一起来看看吧!"
- },
- "victory": {
- "1": "你的闪耀如1000万伏特!朋友!"
- },
- "defeat": {
- "1": "奇树奇树捕获你的眼球!"
- }
- },
- "larry": {
- "encounter": {
- "1": "归根结底,普普通通就是最强。"
- },
- "victory": {
- "1": "哼,给我上了一道“战败”。"
- },
- "defeat": {
- "1": "下班打卡,走了"
- }
- },
- "ryme": {
- "encounter": {
- "1": "宝贝, 一起! \n摇滚摇到骨子里!"
- },
- "victory": {
- "1": "你好酷!我佩服!\n我的灵魂为你哭!"
- },
- "defeat": {
- "1": "再会, 宝贝!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "我保证我宝可梦的力量\n会让你感到寒冷彻骨!"
- },
- "victory": {
- "1": "你燃烧的热情……老实说,我有点喜欢。"
- },
- "defeat": {
- "1": "你没有升温。"
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "你已经走到这一步了?$哼~ 看看你能不能对付我的宝可梦!",
- "2": "我将全力以赴, 别觉得我会手下留情哦~"
- },
- "victory": {
- "1": "不敢相信…我输掉了… $但是你确实赢得好,干得漂亮捏~",
- "2": "看来我还要多多学习呀,\n不过你打的很不错哦~"
- },
- "defeat": {
- "1": "你打得不错,但是我更胜一筹!$祝你下次好运啦~",
- "2": "看来我的练习有所回报了。\n感谢一战!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "海流正在朝着对我有利的方向转变。$准备好被卷走了吗?",
- "2": "让我们在这场战斗中掀起波澜!$我希望你做好准备!"
- },
- "victory": {
- "1": "你完美地渡过了这片水域......干得好!",
- "2": "看来我现在无法与你匹敌。干得好!"
- },
- "defeat": {
- "1": "水总能找到出路。\n真是爽快的一战!",
- "2": "你打得很好,\n但海洋的力量是不可阻挡的!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "做好准备!我的斗志熊熊燃烧!",
- "2": "让我们看看你是否能跟上我永不停歇的节奏!"
- },
- "victory": {
- "1": "你的实力......令人印象深刻。\n你真的值得这场胜利。",
- "2": "我以前从未感受过这种强度。\n太棒了!"
- },
- "defeat": {
- "1": "我的高强度训练又带来胜利了!\n干得好!",
- "2": "你有实力,但我的训练更努力。\n精彩的战斗!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "黑暗降临...你准备好面对你的恐惧了吗?",
- "2": "让我们看看你能否应对我所操控的黑暗。"
- },
- "victory": {
- "1": "你已经驱散了阴影......\n暂时。干得很好。",
- "2": "你的光芒刺穿了我的黑暗。干得好。"
- },
- "defeat": {
- "1": "黑影在轻语...\n你的力量还不够。",
- "2": "黑暗获胜了......\n也许下次你会看到光明。"
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "虽然没法打败丹帝夺冠,\n让我觉得很遗憾……$但是有你这家伙当对手,\b倒是也还不赖啊!",
- "2": "准备好面对龙之风暴!"
- },
- "victory": {
- "1": "你的气势就像暴风一样,\n连我都甘拜下风了!",
- "2": "你完美地驾驭了我的风暴……打得好!"
- },
- "defeat": {
- "1": "又一场龙之风暴袭来,又一场胜利!打得好!",
- "2": "你被我的龙之风暴卷入了!祝你下次好运!"
- }
- },
- "alder": {
- "encounter": {
- "1": "准备好和合众最强的训练家交手吧!"
- },
- "victory": {
- "1": "精彩!简直就是天下无双!"
- },
- "defeat": {
- "1": "战斗结束后,我的心像是吹过了温和的风……\n$真是厉害!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "我的努力让我越来越强!\n$所以我不会输。"
- },
- "victory": {
- "1": "不可能……\n$真是一场有趣又激动人心的战斗啊!"
- },
- "defeat": {
- "1": "哇塞,好一场战斗!\n$你得多练练了。"
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}嘿,我在找你呢!我知道你急着上路,\n但至少说个再见吧…$@c{smile_eclosed}所以你终于要开始追逐梦想了?\n我几乎不敢相信。$@c{serious_smile_fists}来都来了,来一场对战怎么样?\n毕竟,我想看看你是不是准备周全了。$@c{serious_mopen_fists}不要手下留情,我想让你全力以赴!"
- },
- "victory": {
- "1": "@c{shock}哇…你彻底击败了我。\n你是真初学者吗?$@c{smile}也许是靠点运气,但是…\n谁知道,你可能真的能一路走下去。$顺便说一下,博士让我给你这些东西。它们看起来可牛了。$@c{serious_smile_fists}祝你好运!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}你在这儿啊!我到处找你呢!$@c{angry_mopen}你忘了和你最好的朋友说再见了吗?$@c{smile_ehalf}你要去追逐梦想了,对吧?\n从今天开始,是不是…$@c{smile}不管怎样,忘了我的事就原谅你吧,\n但有个条件。@c{smile_wave_wink}你必须和我对战!$@c{angry_mopen}全力以赴!\n你也不想让你的冒险在开始之前就结束了,对吧?"
- },
- "victory": {
- "1": "@c{shock}你刚开始就已经这么强了?!@d{96}$@c{angry}你是不是开了?$@c{smile_wave_wink}只是开个玩笑啦!@d{64} @c{smile_eclosed}我输地心服口服了…\n我感觉你出去挺有天赋的。$@c{smile}顺便说一下,博士想让我给你一些东西。\n希望它们能帮上忙!$@c{smile_wave}像往常一样尽力而为!\n我相信你!"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}嘿,你也在这里吗?$@c{smile_eclosed}一路过关斩将,是吧?$@c{serious_mopen_fists}我知道看起来好像我尾随着你来到这里,\n怎么可能啦。$@c{serious_smile_fists}说真的,自从你在老家打败我后,\n我就一直很渴望再比一场。$我自己也进行了很多训练,\n所以这次我肯定会好好打一场。$@c{serious_mopen_fists}不要手下留情,就像以前一样!$让我们开始吧!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}哦。我过于自信了。$@c{smile}不过没关系。我猜到可能会这样。$@c{serious_mopen_fists}这只意味着我下次需要更努力!$$@c{smile}呃,不是特意帮你,我正好有多余的这个,\n我觉得你可能想要。$$@c{serious_smile_fists}不过这次之后别指望再有了!$我不能一直给我的对手优势。$@c{smile}反正,保重!"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}哦,真巧,在这里遇见你。\n看来你还没输过嘛。@c{angry_mopen}哈……好家伙!$@c{angry_mopen}我知道你在想什么,\n不,我才不会跟踪你什么呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我为你感到高兴,但我只想让你知道\n有时输了是可以接受的。$@c{smile}我们从错误中学到的东西\n往往比我们一直成功时学到的还要多。$@c{angry_mopen}无论如何,我为了我们的复赛已经努力训练了\n所以你最好全力以赴!"
- },
- "victory": {
- "1": "@c{neutral}我……没打算会输来着……$@c{smile}嗷……好吧。看来我要再更加努力训练了!$@c{smile_wave}我还给你带了个这个$@c{smile_wave_wink}不用谢我哦~.$@c{angry_mopen}不过,这是最后一个啦!\n你可别想再从我这赚小便宜了~$@c{smile_wave}要保重哦!"
- },
- "defeat": {
- "1": "输了有时候也不要紧的…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}嘿,看看这是谁!好久不见啊。$@c{neutral}你……还是没输过?哈…$@c{neutral_eclosed}这有点……不太对劲。$没有你一起,回家的感觉有很不一样。$@c{serious}虽然我知道这挺别扭的,但我就直说了。$@c{neutral_eclosed}我觉得你有点儿难以理喻。$@c{serious}没有人能够战无不胜。$失败乃成功之母。$@c{neutral_eclosed}你已经赢得了够好的成绩,\n但前面道阻且长,只会愈发艰难。 @c{neutral}你做好准备了没?$@c{serious_mopen_fists}如果做好了,证明给我看吧。"
- },
- "victory": {
- "1": "@c{angry_mhalf}这太离谱了……我几乎从没停下训练……$我们之间的差距怎么还是这么大?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}好久不见!还没输过,对吧。$@c{angry}我觉得你点烦了。@c{smile_wave_wink}开玩笑啦!$@c{smile_ehalf}但说真的,你现在不想家吗?\n不想…我吗?$我……我的意思是,我们真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的梦想。\n但现实就是你早晚会经历失败。$@c{smile}当你失败的时候,我想像往常一样陪在你身边。$@c{angry_mopen}现在,给你看看我变得多强了吧!"
- },
- "victory": {
- "1": "@c{shock}都这样了……还是不够吗?$这样下去,你就永远不会回来了……"
- },
- "defeat": {
- "1": "你尽力了,现在让我们回家吧。"
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}嘿。$我不会对你说什么拐弯抹角的客套话。$@c{neutral_eclosed}我来,就是为了赢,简单明了。$@c{serious_mhalf_fists}我将所有时间都投入到训练中,\n掌握了如何发挥我的潜力。$@c{smile}当你削减掉不必要的睡眠和社交后,\n你会得到很多额外的时间。$@c{serious_mopen_fists}但在我获胜之前,这些都不重要了。$@c{neutral_eclosed}我甚至已经到达了战无不败的境地。$@c{smile_eclosed}我觉得你的思路倒是也没毛病。$@c{angry_mhalf}失败是属于弱者的,\n我已经不再软弱了。$@c{serious_mopen_fists}准备好吧。"
- },
- "victory": {
- "1": "@c{neutral}你…@d{64} 你是人吗?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}是我哦!没又把我忘了吧……是吗?$@c{smile}你应该为自己走了这么远感到骄傲。恭喜你!$但看来你的旅程到此为止了。$@c{smile_eclosed}你唤醒了我体内一些我从未有过的东西。\n就像我现在满脑子除了训练还是训练。$@c{smile_ehalf}我几乎已经没空吃饭睡觉了,\n我没日没夜训练我的宝可梦,每次都能变得更强。$@c{neutral}事实上,我……几乎不认识自己了。$现在,我终于达到了巅峰。\n我感觉我已经战无不胜了。$而且你知道吗?这一切都是因为你。$@c{smile_ehalf}我不知道到底是该感谢你还是恨你。$@c{angry_mopen}做好准备…"
- },
- "victory": {
- "1": "@c{neutral}你…@d{64} 你是人吗?"
- },
- "defeat": {
- "1": "@c{smile}你应该为自己走了这么远感到骄傲。"
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}又见面了。$@c{neutral}我花了点时间思考反思\n有理由说明为什么这一切都显得如此奇妙。$@c{neutral_eclosed}你所追逐的梦想,我想击败你的决心…$这都是某种庞大使命的一部分。$@c{serious}这不仅仅是关于我和你… 而是关于这个世界, @c{serious_mhalf_fists}我的使命就是将你推向极限。$@c{neutral_eclosed}我是否达成了那个使命,我说不上来,但我已尽我所能。$@c{neutral}我们最终到达的这个地方看起来很可怕\n 然而不知何故,我心中毫无畏惧,好像我早就来过这里。$@c{serious_mhalf_fists}你也有同样的感觉,对吧?$@c{serious}……这里好像有什么东西在呼唤我。\n这是世界早已记录的一切。$那些我们经历过的时光,那些记忆犹新的过去,\n其实只是遥远的回忆。$@c{neutral_eclosed}谁能保证它们是否真的发生过。$@c{serious_mopen_fists}你必须继续前进,不然的话,这一切将永无止境。\n这件事而只有你能办成。$@c{serious_smile_fists}我不清楚这一切意味着什么,但我知道……$@c{serious_mopen_fists}如果现在你不能就此击败我,\n你将毫无机会可言。"
- },
- "victory": {
- "1": "@c{smile_eclosed}看来我的使命在这里已经完成了。\n我想让你答应我一件事。$@c{smile}在你拯救世界之后,要回家。"
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}又只有我们两个人了。$@c{smile_eclosed}你知道吗,我在心里想啊想,\n想了好久……$@c{smile_ehalf}这一切背后是有什么原因吗,\n为什么一切现在看起来都这么奇怪……$@c{smile}你有你的梦想,而我内心有这个抱负……$我不禁感觉这一切背后有一个更庞大的力量,$掌控者我们所做的一切,你和我之间。$@c{smile_eclosed}我想我注定要推动你……到你的极限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到现在为止,我已经尽力了。$这个奇怪而可怕的地方……\n一切看起来都那么清晰……$这是世界早已记录的一切。$@c{smile_eclosed}我好像记不清我们一起度过的日子了。$@c{smile_ehalf}那些回忆到底是真的吗?\n怎么感觉这么久远……$@c{angry_mopen}你得继续前进,不然的话,这一切将永无止境。\n你是唯一能做到这件事的。$@c{smile_ehalf}我……不知道这一切意味着什么……\n但我明白$@c{neutral}如果你现在不能就此击败我,\n你将毫无机会可言。"
- },
- "victory": {
- "1": "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答应我……在你拯救世界之后\n……要……平安到家。$@c{smile_ehalf}……谢谢你。"
- }
- }
-}
diff --git a/src/locales/zh_CN/dialogue-misc-female.json b/src/locales/zh_CN/dialogue-misc-female.json
deleted file mode 100644
index e9ac66b7955..00000000000
--- a/src/locales/zh_CN/dialogue-misc-female.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话",
- "ending_female": "@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。\n$@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。\n$@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒!\n$@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。\n$@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~"
-}
\ No newline at end of file
diff --git a/src/locales/zh_CN/dialogue-misc-male.json b/src/locales/zh_CN/dialogue-misc-male.json
deleted file mode 100644
index e9ac66b7955..00000000000
--- a/src/locales/zh_CN/dialogue-misc-male.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话",
- "ending_female": "@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。\n$@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。\n$@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒!\n$@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。\n$@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~"
-}
\ No newline at end of file
diff --git a/src/locales/zh_CN/dialogue-misc.json b/src/locales/zh_CN/dialogue-misc.json
new file mode 100644
index 00000000000..07aa336d4f6
--- /dev/null
+++ b/src/locales/zh_CN/dialogue-misc.json
@@ -0,0 +1,4 @@
+{
+ "ending": "@c{shock}你回来了?@d{32} 也就是说…@d{96} 你赢了呀!?\n@c{smile_ehalf}我应该早料到了。\n$@c{smile_eclosed}当然…我一直有这种感觉\n@c{smile}一切都结束了,对么? 你打破了循环。\n$@c{smile_ehalf}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$我是唯一能够记得你所作所为的人\n@c{angry_mopen}我会努力不忘掉哒!\n$@c{smile_wave_wink}开玩笑啦,@d{64} @c{smile}我才不会忘呢。@d{32}\n你的传奇将永远留存于我们心中。\n$@c{smile_wave}不管了,@d{64} 时候不早了@d{96} ,应该吧?\n在这地方还真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我们再来打一场,为了重温回忆嘛~",
+ "ending_female": "@c{smile}哦?你赢了?@d{96} @c{smile_eclosed}我应该早猜到了\n你回来了。\n$@c{smile}结束了。@d{64} 你终结了这个循环。\n$@c{serious_smile_fists}你也完成了自己的梦想,不是吗?\n你甚至一次都没失败。\n$@c{neutral}我是唯一能够记得你所作所为的人@d{96}\n我觉得这应该也还行吧?\n$@c{serious_smile_fists}你的传奇将永远留存于我们心中。\n$@c{smile_eclosed}不管了,我真是受够这个地方了,你也一样吗?我们回家吧。\n$@c{serious_smile_fists}可能等我们回家以后,再打一场?\n要是你想的话"
+}
diff --git a/src/locales/zh_CN/dialogue-female.json b/src/locales/zh_CN/dialogue.json
similarity index 100%
rename from src/locales/zh_CN/dialogue-female.json
rename to src/locales/zh_CN/dialogue.json
diff --git a/src/locales/zh_CN/modifier-type.json b/src/locales/zh_CN/modifier-type.json
index e9172985092..5d6184640b1 100644
--- a/src/locales/zh_CN/modifier-type.json
+++ b/src/locales/zh_CN/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "接下来的{{battleCount}}场战斗是双打的概率翻倍。"
},
- "TempBattleStatBoosterModifierType": {
- "description": "为所有成员宝可梦提升一级{{tempBattleStatName}},持续5场战斗。"
+ "TempStatStageBoosterModifierType": {
+ "description": "为所有成员宝可梦提升一级{{stat}},持续5场战斗。"
},
"AttackTypeBoosterModifierType": {
"description": "一只宝可梦的{{moveType}}系招式威力提升20%。"
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "使一只寶可夢的等級提升{{levels}}級。"
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "增加10%持有者的{{statName}},\n个体值越高堆叠上限越高。"
+ "BaseStatBoosterModifierType": {
+ "description": "增加10%持有者的{{stat}},\n个体值越高堆叠上限越高。"
},
"AllPokemonFullHpRestoreModifierType": {
"description": "所有宝可梦完全回复HP。"
@@ -248,6 +248,12 @@
"name": "焦点镜",
"description": "能看见弱点的镜片。携带它的宝可梦的招式\n会变得容易击中要害。"
},
+ "DIRE_HIT": {
+ "name": "要害攻击",
+ "extra": {
+ "raises": "会心"
+ }
+ },
"LEEK": {
"name": "大葱",
"description": "非常长且坚硬的茎。让大葱鸭携带后,\n招式会变得容易击中要害。"
@@ -411,25 +417,13 @@
"description": "让百变怪携带后,速度就会提高的神奇粉末。\n非常细腻坚硬。"
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "力量强化",
"x_defense": "防御强化",
"x_sp_atk": "特攻强化",
"x_sp_def": "特防强化",
"x_speed": "速度强化",
- "x_accuracy": "命中强化",
- "dire_hit": "要害攻击"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "攻击",
- "DEF": "防御",
- "SPATK": "特攻",
- "SPDEF": "特防",
- "SPD": "速度",
- "ACC": "命中",
- "CRIT": "会心",
- "EVA": "闪避",
- "DEFAULT": "???"
+ "x_accuracy": "命中强化"
},
"AttackTypeBoosterItem": {
"silk_scarf": "丝绸围巾",
@@ -604,6 +598,6 @@
"DRAGON_MEMORY": "龙存储碟",
"DARK_MEMORY": "黑暗存储碟",
"FAIRY_MEMORY": "妖精存储碟",
- "BLANK_MEMORY": "空白存储碟"
+ "NORMAL_MEMORY": "一般存储碟"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/modifier.json b/src/locales/zh_CN/modifier.json
index 707fab20ecc..a50cdd35bc1 100644
--- a/src/locales/zh_CN/modifier.json
+++ b/src/locales/zh_CN/modifier.json
@@ -3,7 +3,7 @@
"turnHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!",
"hitHealApply": "{{pokemonNameWithAffix}}用{{typeName}}\n回复了体力!",
"pokemonInstantReviveApply": "{{pokemonNameWithAffix}}用{{typeName}}\n恢复了活力!",
- "pokemonResetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n复原了!",
+ "resetNegativeStatStageApply": "{{pokemonNameWithAffix}}降低的能力被{{typeName}}\n复原了!",
"moneyInterestApply": "用{{typeName}}\n获得了 ₽{{moneyAmount}} 利息!",
"turnHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}吸收了!",
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}夺取了!",
diff --git a/src/locales/zh_CN/move-trigger.json b/src/locales/zh_CN/move-trigger.json
index 5a76f402783..1eb4c397f45 100644
--- a/src/locales/zh_CN/move-trigger.json
+++ b/src/locales/zh_CN/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}}\n削减了体力并提升了招式威力!",
"absorbedElectricity": "{{pokemonName}}\n吸收了电力!",
"switchedStatChanges": "{{pokemonName}}和对手互换了\n自己的能力变化!",
+ "switchedTwoStatChanges": "{{pokemonName}} 和对手互换了自己的{{firstStat}}和{{secondStat}}的能力变化!",
+ "switchedStat": "{{pokemonName}} 互换了各自的{{stat}}!",
+ "sharedGuard": "{{pokemonName}} 平分了各自的防守!",
+ "sharedPower": "{{pokemonName}} 平分了各自的力量!",
"goingAllOutForAttack": "{{pokemonName}}拿出全力了!",
"regainedHealth": "{{pokemonName}}的\n体力回复了!",
"keptGoingAndCrashed": "{{pokemonName}}因势头过猛\n而撞到了地面!",
@@ -61,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}的特性\n变得无效了!",
"revivalBlessing": "{{pokemonName}}复活了!",
"swapArenaTags": "{{pokemonName}}\n交换了双方的场地效果!",
- "exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!"
+ "exposedMove": "{{pokemonName}}识破了\n{{targetPokemonName}}的原型!",
+ "safeguard": "{{targetName}}\n正受到神秘之幕的保护!"
}
\ No newline at end of file
diff --git a/src/locales/zh_CN/pokemon-info.json b/src/locales/zh_CN/pokemon-info.json
index 5194189c806..a21a8156e4c 100644
--- a/src/locales/zh_CN/pokemon-info.json
+++ b/src/locales/zh_CN/pokemon-info.json
@@ -1,7 +1,7 @@
{
"Stat": {
"HP": "最大HP",
- "HPshortened": "最大HP",
+ "HPshortened": "HP",
"ATK": "攻击",
"ATKshortened": "攻击",
"DEF": "防御",
@@ -37,4 +37,4 @@
"FAIRY": "妖精",
"STELLAR": "星晶"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_CN/settings.json b/src/locales/zh_CN/settings.json
index 3ae0fa8204c..dd001213b9e 100644
--- a/src/locales/zh_CN/settings.json
+++ b/src/locales/zh_CN/settings.json
@@ -99,7 +99,7 @@
"moveTouchControls": "移动触摸控制",
"shopOverlayOpacity": "商店显示不透明度",
"shopCursorTarget": "商店指针位置",
- "items": "道具",
+ "rewards": "道具",
"reroll": "刷新",
"shop": "购买",
"checkTeam": "检查队伍"
diff --git a/src/locales/zh_TW/achv.json b/src/locales/zh_TW/achv.json
index dcd6f26ae82..9edce2e368d 100644
--- a/src/locales/zh_TW/achv.json
+++ b/src/locales/zh_TW/achv.json
@@ -80,7 +80,7 @@
"100_RIBBONS": {
"name": "大師球聯盟冠軍"
},
- "TRANSFER_MAX_BATTLE_STAT": {
+ "TRANSFER_MAX_STAT_STAGE": {
"name": "團隊協作",
"description": "在一項屬性強化至最大時用接力棒傳遞給其他寶可夢"
},
@@ -252,5 +252,9 @@
},
"MONO_FAIRY": {
"name": "林克,醒醒!"
+ },
+ "INVERSE_BATTLE": {
+ "name": "鏡子子鏡",
+ "description": "完成逆轉之戰挑戰\n戰挑戰之轉逆成完"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/arena-tag.json b/src/locales/zh_TW/arena-tag.json
index b60946a3b77..78246d9c44f 100644
--- a/src/locales/zh_TW/arena-tag.json
+++ b/src/locales/zh_TW/arena-tag.json
@@ -1,5 +1,11 @@
{
"noCritOnAddPlayer": "{{moveName}}保護了你的\n隊伍不被擊中要害!",
"noCritOnAddEnemy": "{{moveName}}保護了對方的\n隊伍不被擊中要害!",
- "noCritOnRemove": "{{pokemonNameWithAffix}}的{{moveName}}\n效果消失了!"
+ "noCritOnRemove": "{{pokemonNameWithAffix}}的{{moveName}}\n效果消失了!",
+ "safeguardOnAdd": "整個場地被\n神秘之幕包圍了!",
+ "safeguardOnAddPlayer": "我方被\n神秘之幕包圍了!",
+ "safeguardOnAddEnemy": "對手被\n神秘之幕包圍了!",
+ "safeguardOnRemove": "包圍整個場地的\n神秘之幕消失了!",
+ "safeguardOnRemovePlayer": "包圍我方的\n神秘之幕消失了!",
+ "safeguardOnRemoveEnemy": "包圍對手的\n神秘之幕消失了!"
}
\ No newline at end of file
diff --git a/src/locales/zh_TW/challenges.json b/src/locales/zh_TW/challenges.json
index c6c4f90e65e..a1fc6b8f50f 100644
--- a/src/locales/zh_TW/challenges.json
+++ b/src/locales/zh_TW/challenges.json
@@ -19,5 +19,12 @@
"name": "單屬性",
"desc": "你只能使用{{type}}\n屬性的寶可夢",
"desc_default": "你只能使用所選\n屬性的寶可夢"
+ },
+ "inverseBattle": {
+ "name": "逆轉之戰",
+ "shortName": "逆轉之戰",
+ "desc": "屬性相克關系被反轉,且沒有任何屬性對其他屬性免疫。\n禁用其他挑戰的成就。",
+ "value.0": "關閉",
+ "value.1": "開啓"
}
}
\ No newline at end of file
diff --git a/src/locales/zh_TW/config.ts b/src/locales/zh_TW/config.ts
index 1e7ab421092..cf505d683a5 100644
--- a/src/locales/zh_TW/config.ts
+++ b/src/locales/zh_TW/config.ts
@@ -15,14 +15,10 @@ import bgmName from "./bgm-name.json";
import biome from "./biome.json";
import challenges from "./challenges.json";
import commandUiHandler from "./command-ui-handler.json";
-import dialogueMale from "./dialogue-male.json";
-import dialogueFemale from "./dialogue-female.json";
-import dialogueEndbossMale from "./dialogue-final-boss-male.json";
-import dialogueEndbossFemale from "./dialogue-final-boss-female.json";
-import dialogueMiscMale from "./dialogue-misc-male.json";
-import dialogueMiscFemale from "./dialogue-misc-female.json";
-import dialogueDoubleBattleMale from "./dialogue-double-battle-male.json";
-import dialogueDoubleBattleFemale from "./dialogue-double-battle-female.json";
+import dialogue from "./dialogue.json";
+import battleSpecDialogue from "./dialogue-final-boss.json";
+import miscDialogue from "./dialogue-misc.json";
+import doubleBattleDialogue from "./dialogue-double-battle.json";
import egg from "./egg.json";
import fightUiHandler from "./fight-ui-handler.json";
import filterBar from "./filter-bar.json";
@@ -76,14 +72,10 @@ export const zhTwConfig = {
commandUiHandler,
common,
achv,
- PGMdialogue: dialogueMale,
- PGFdialogue: dialogueFemale,
- PGMbattleSpecDialogue: dialogueEndbossMale,
- PGFbattleSpecDialogue: dialogueEndbossFemale,
- PGMmiscDialogue: dialogueMiscMale,
- PGFmiscDialogue: dialogueMiscFemale,
- PGMdoubleBattleDialogue: dialogueDoubleBattleMale,
- PGFdoubleBattleDialogue: dialogueDoubleBattleFemale,
+ dialogue,
+ battleSpecDialogue,
+ miscDialogue,
+ doubleBattleDialogue,
egg,
fightUiHandler,
filterBar,
diff --git a/src/locales/zh_TW/dialogue-double-battle-male.json b/src/locales/zh_TW/dialogue-double-battle-male.json
deleted file mode 100644
index 684beac5eaf..00000000000
--- a/src/locales/zh_TW/dialogue-double-battle-male.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
- "blue_red_double": {
- "encounter": {
- "1": "青綠:嘿,赤紅,\n讓這傢伙看看我們是什麼來頭!$赤紅:...$青綠: 見識下真新鎮的實力!"
- },
- "victory": {
- "1": "青綠:打得真不錯$赤紅: ..."
- }
- },
- "red_blue_double": {
- "encounter": {
- "1": "赤紅: ...!$青綠:他人狠話不多。$青綠: 他人狠話不多。$青綠: 但別被他耍了,\n畢竟他可是個冠軍!"
- },
- "victory": {
- "1": "赤紅: ...!$青綠: 下次我們一定會贏你!"
- }
- },
- "tate_liza_double": {
- "encounter": {
- "1": "小楓:嘿嘿嘿……你驚訝嗎?$小南:這裡有兩個道館館主?$小楓: 我們是雙胞胎!$小南:我們無需交談,因為……我們可以通曉彼此的想法$小楓: 我們的組合……$小南: 你能打敗嗎?"
- },
- "victory": {
- "1": "小楓:什麼?我們的組合……$小南:被瓦解了!"
- }
- },
- "liza_tate_double": {
- "encounter": {
- "1": "小南:呵呵呵……你驚訝吧?$小楓:這裡有兩個道館館主?$小南:我們可以通曉……$小楓:彼此的想法……$小南:全在我們腦中!$小楓:我們的組合……$小南:你能打敗嗎?"
- },
- "victory": {
- "1": "小楓:你和你的寶可夢……$小南:簡直像親兄弟姐妹!"
- }
- },
- "wallace_steven_double": {
- "encounter": {
- "1": "大吾:米可利, 展現冠軍的實力吧!$米可利:我們將展示豐緣的實力!$米可利:我們將展示豐緣的實力!$大吾:要上了!"
- },
- "victory": {
- "1": "大吾:打得真不錯!$米可利:我們下次會贏的!"
- }
- },
- "steven_wallace_double": {
- "encounter": {
- "1": "大吾:你有什麼稀有的寶可夢嗎?$米可利:大吾……我們是來對戰的,\n不是來炫耀寶可夢的。$大吾:哦……知道了… 那麼要上了!"
- },
- "victory": {
- "1": "大吾:戰鬥結束了,\n來看看我的稀有寶可夢!$米可利:大吾……"
- }
- },
- "alder_iris_double": {
- "encounter": {
- "1": "阿戴克:我們倆是合眾最強的訓練家!$艾莉絲:與最強來一場最激烈的戰鬥吧!"
- },
- "victory": {
- "1": "阿戴克:哇哦!你真是超級厲害!$艾莉絲:我們下次會贏的啦!"
- }
- },
- "iris_alder_double": {
- "encounter": {
- "1": "艾莉絲:歡迎!挑戰者,\n合眾地區最強的冠軍大駕光臨!$阿戴克:艾莉絲,你是不是有點太興奮了…"
- },
- "victory": {
- "1": "艾莉絲:這樣的失敗可不好受啊…$阿戴克:但是只有失敗才能讓我們變強!"
- }
- },
- "piers_marnie_double": {
- "encounter": {
- "1": "瑪俐:哥哥,給他們展現尖釘鎮的實力!$聶梓:我們帶來黑暗!"
- },
- "victory": {
- "1": "瑪俐:你的強光亮瞎我們的黑暗了啦……$聶梓:實在太亮了…"
- }
- },
- "marnie_piers_double": {
- "encounter": {
- "1": "聶梓: 台下準備好了嗎!$瑪俐: 哥哥,我們是來對戰的,\n不是來唱歌的……"
- },
- "victory": {
- "1": "聶梓:這首歌獻給大家!$瑪俐:哥哥……"
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/zh_TW/dialogue-double-battle-female.json b/src/locales/zh_TW/dialogue-double-battle.json
similarity index 100%
rename from src/locales/zh_TW/dialogue-double-battle-female.json
rename to src/locales/zh_TW/dialogue-double-battle.json
diff --git a/src/locales/zh_TW/dialogue-final-boss-male.json b/src/locales/zh_TW/dialogue-final-boss-male.json
deleted file mode 100644
index 13bfee9eb96..00000000000
--- a/src/locales/zh_TW/dialogue-final-boss-male.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "encounter": "看來終於又到了那個時候。\n你知道自己為何會來到這裡,不是嗎?\n$你被吸引到這裡,因為你以前就來過這裡。\n無數次。\n$儘管,或許可以數一數。\n準確地說,這實際上是你的第{{cycleCount}}次循環。\n$每一次循環,你的思想都會恢復到之前的狀態。\n即便如此,不知何故,你之前自我的殘留仍然存在。\n$直到現在,你仍未成功,但我感覺這次你身上有一種異樣的氣息。\n$你是這裡唯一的人,儘管感覺上還有……另一個人。\n$你最終會成為對我來的一個硬茬嗎?\n我渴望了數千年的挑戰?\n$我們,開始。",
- "firstStageWin": "我明白了。我所感覺到的氣息確實是真實的。\n看來我不再需要保留實力了。\n$別讓我失望。",
- "secondStageWin": "…漂亮。"
-}
\ No newline at end of file
diff --git a/src/locales/zh_TW/dialogue-final-boss-female.json b/src/locales/zh_TW/dialogue-final-boss.json
similarity index 100%
rename from src/locales/zh_TW/dialogue-final-boss-female.json
rename to src/locales/zh_TW/dialogue-final-boss.json
diff --git a/src/locales/zh_TW/dialogue-male.json b/src/locales/zh_TW/dialogue-male.json
deleted file mode 100644
index 4236e239622..00000000000
--- a/src/locales/zh_TW/dialogue-male.json
+++ /dev/null
@@ -1,2137 +0,0 @@
-{
- "youngster": {
- "encounter": {
- "1": "嘿,想來對戰嗎?",
- "2": "你也是新人訓練師嗎?",
- "3": "嘿,我之前沒見過你。我們來對戰吧!",
- "4": "我剛輸了,所以我正在尋找更多的寶可夢。$等等!你看起來很弱!\n來吧,我們對戰吧!",
- "5": "我們見過面嗎?我記不太清了。$嗯,不管怎樣,很高興見到你!",
- "6": "好的!我們上吧!",
- "7": "好的!我來啦!我會向你展示我的實力!",
- "8": "嚯嚯嚯...我會向你展示我的寶可夢有多厲害!",
- "9": "不要浪費時間打招呼。你準備好了就放馬過來!",
- "10": "別掉以輕心,$否則你可能會被小朋友打到哭鼻子哦。",
- "11": "我精心培養了我的寶可夢。不許你傷害它們!",
- "12": "恭喜你成功了!從這以後可不輕鬆哦。",
- "13": "戰鬥永無止境!歡迎來到沒有盡頭的世界!"
- },
- "victory": {
- "1": "哇!你很強!",
- "2": "我根本沒機會贏,對吧?",
- "3": "我會等長大了再來打敗你!",
- "4": "呃。我沒有更多寶可夢了。",
- "5": "不可能…不可能!我怎麼可能又輸了…",
- "6": "不!我輸了!",
- "7": "哇!你真是太不可思議了!我既驚訝又欽佩!",
- "8": "這怎麼…怎麼可能…$明明我和我的寶可夢是最強大的…",
- "9": "下次我不會輸了!我們找時間再對戰吧!",
- "10": "天哪!你看不出我還只是個小孩子嗎!$你那樣全力以赴太賴了!",
- "11": "你的寶可夢更棒啊!和我交換吧!",
- "12": "我之前有點上頭,我說了什麼來著?",
- "13": "啊哈哈!就是這樣!$對!你已經熟悉這個世界了!"
- }
- },
- "lass": {
- "encounter": {
- "1": "我們來對戰吧,好嗎?",
- "2": "你看起來像是個新人訓練師。我們來戰鬥吧!",
- "3": "我不認識你。來對戰怎麼樣?",
- "4": "讓我們來進行一場有趣的寶可夢對戰吧!",
- "5": "我會向你展示如何真正使用寶可夢!",
- "6": "一場認真的對戰從始於認真的開場白!$你確定你準備好了嗎?",
- "7": "花無重開日,人無再少年。$你在對戰中只有一次機會。$很快,你就只能活在回憶中了。",
- "8": "你最好對我手下留情,好嗎?$當然我會認真對戰的!",
- "9": "學校很無聊,我無事可做。$*哈欠*…我只是來對戰打發時間。"
- },
- "victory": {
- "1": "那真是令人印象深刻!我還有很多要學習。",
- "2": "我沒想到你會這麼輕易地打敗我…",
- "3": "我希望有一天,我們能再進行一場對戰。",
- "4": "那真是場非常有趣的對戰!$你讓我精疲力盡了…",
- "5": "你給我上了一課!你真是太棒了!",
- "6": "說真的,我輸了。$這,怎麼說,真的好難過,但你也真的很厲害。",
- "7": "我不需要像這樣的記憶。刪除記憶中…",
- "8": "嘿!我告訴過你要對我手下留情!$不過,當你認真的時候,你真的很酷。",
- "9": "實際上,我開始厭倦對戰了…$一定有新的事情可以做…"
- }
- },
- "breeder": {
- "encounter": {
- "1": "聽話的寶可夢,自私的寶可夢…$寶可夢有獨特的性格呢。",
- "2": "儘管我出生貧寒,但我的寶可夢培養的很好。",
- "3": "嗯,你有沒有管教你的寶可夢?$過度溺愛是不好的。"
- },
- "victory": {
- "1": "對每個寶可夢因材施教是很重要的。",
- "2": "不像一無是處的我…這些寶可夢都很優秀。",
- "3": "過度的讚美會寵壞寶可夢和人。"
- },
- "defeat": {
- "1": "即使輸了,也不應該對你的寶可夢發火。",
- "2": "相當好的寶可夢,對吧?我很會養東西。",
- "3": "無論你多麼愛你的寶可夢,$你仍要在它沒做好時管教它們。"
- }
- },
- "breeder_female": {
- "encounter": {
- "1": "寶可夢永遠不會背叛你。$它們會回報你對它們的愛。",
- "2": "要我教教你訓練優秀寶可夢的技巧嗎?",
- "3": "特別的寶可夢有特別的培育技巧。"
- },
- "victory": {
- "1": "呃…事情不應該是這樣的。$我是不是用錯了能量方塊?",
- "2": "這怎麼會發生在我的寶可夢身上…$你給你的寶可夢餵了什麼?",
- "3": "如果我輸了,我告訴你我只是在消磨時間。$你根本不會傷害到我的自尊心。"
- },
- "defeat": {
- "1": "這證明了我的寶可夢已經接受了我的愛。",
- "2": "訓出好寶可夢的真正技巧是捉到好的寶可夢。",
- "3": "寶可夢的強弱取決於你的飼養方式。"
- }
- },
- "fisherman": {
- "encounter": {
- "1": "啊!你讓我錯過了一次咬鉤!$你打算怎麼辦?",
- "2": "走開!你嚇跑了寶可夢!",
- "3": "讓我看看你能否贏得勝利!"
- },
- "victory": {
- "1": "算了吧。",
- "2": "下一次,我將捲土重來,凱旋而歸!",
- "3": "我想這次我低估了海流。"
- }
- },
- "fisherman_female": {
- "encounter": {
- "1": "哇!我釣到了一條大魚!",
- "2": "線已收好,準備提竿!",
- "3": "準備製造波浪!"
- },
- "victory": {
- "1": "我會帶著更強大的魚鉤回來。",
- "2": "下次我會贏得勝利。",
- "3": "我只是在為回歸磨利我的魚鉤!"
- }
- },
- "swimmer": {
- "encounter": {
- "1": "是時候潛水了!",
- "2": "讓我們一起乘風破浪,贏得勝利!",
- "3": "該一鳴驚人了!"
- },
- "victory": {
- "1": "沉浸在失敗中!",
- "2": "失敗的波浪!",
- "3": "後浪死在沙灘上,我猜。"
- }
- },
- "backpacker": {
- "encounter": {
- "1": "收拾行李,開始遊戲!",
- "2": "讓我看看你是否能跟上!",
- "3": "全副武裝,挑戰者!",
- "4": "我花了20年時間試圖找到自己……但我在哪裡?"
- },
- "victory": {
- "1": "這次絆倒了!",
- "2": "哦,我覺得我迷路了。",
- "3": "死路!",
- "4": "等一下!嘿!你不知道我是誰嗎?"
- }
- },
- "ace_trainer": {
- "encounter": {
- "1": "你看起來挺自信的。",
- "2": "你的寶可夢…… 讓我看看……",
- "3": "因為我是王牌訓練師,人們認為我很強。",
- "4": "你知道成為王牌訓練師需要什麼嗎?"
- },
- "victory": {
- "1": "是的…… 你的寶可夢很棒……",
- "2": "什麼?!我是戰鬥天才啊!",
- "3": "理所應當,你才是主角!",
- "4": "好好好!你可以成為王牌訓練師!"
- },
- "defeat": {
- "1": "我將把我的身體和靈魂全都奉獻給寶可夢對戰!",
- "2": "一切都在我的預料之中… \n沒有什麼好驚訝的…",
- "3": "我覺得我長大後有點玻璃心,$你太壓力我我會垮的……",
- "4": "我當然很強大,不會輸。$而且重要的是我要優雅地贏。"
- }
- },
- "parasol_lady": {
- "encounter": {
- "1": "是時候用優雅和從容來為戰鬥添彩了!"
- },
- "victory": {
- "1": "我的優雅依然完好無損!"
- }
- },
- "twins": {
- "encounter": {
- "1": "準備好囉,因為我們聯手,\n麻煩雙倍!",
- "2": "兩顆心,一條繩$讓我們看看你能否跟上我們雙胞胎的力量!",
- "3": "希望你準備好了面對雙倍的麻煩,$因為我們即將燃起來啦!"
- },
- "victory": {
- "1": "雖然我們在這一輪輸了,$但我們的羈絆依然堅不可摧!",
- "2": "我們的雙胞胎精神,才不會就此熄滅。",
- "3": "我們會作為充滿活力的二人組,$捲土重來,變得更強!"
- },
- "defeat": {
- "1": "雙胞胎的力量至高無上!",
- "2": "兩顆心,一起贏!",
- "3": "笑容成雙,共舞成雙!"
- }
- },
- "cyclist": {
- "encounter": {
- "1": "準備好在我後面吃土吧!",
- "2": "挑戰者,準備好!我要把你打得落花流水!",
- "3": "全速前進,讓我看看你能不能跟得上!"
- },
- "victory": {
- "1": "輪子可能不轉了,但我的決心沒有停下。",
- "2": "被超越了!",
- "3": "通往勝利的道路還有許多曲折等待探索。"
- }
- },
- "black_belt": {
- "encounter": {
- "1": "我讚揚你挑戰我的勇氣!$因為我是踢力最強的人!",
- "2": "哦,我明白了。你想被切成碎片嗎?$或者你更喜歡當個沙袋?"
- },
- "victory": {
- "1": "哦。是寶可夢在戰鬥。$我強大的踢擊一點忙都沒幫上。",
- "2": "嗯…如果我無論如何都會輸,我希望能被徹底打敗。"
- }
- },
- "battle_girl": {
- "encounter": {
- "1": "你不必試圖勾引我。你可以輸給我。"
- },
- "victory": {
- "1": "很難說再見,但我們快沒時間了……"
- }
- },
- "hiker": {
- "encounter": {
- "1": "人到中年後,我的身體和我爬過的山一樣強壯!",
- "2": "我從父母那裡遺傳了這副魁梧的身材…$就像一座活生生的山脈…"
- },
- "victory": {
- "1": "至少在BMI方面我不能輸!",
- "2": "這還不夠……永遠不夠。$我的壞膽固醇還不夠高……"
- }
- },
- "ranger": {
- "encounter": {
- "1": "當我身處大自然中,其他事情都不重要了。",
- "2": "如果我生活中沒有大自然,有時就會突然感到焦慮。"
- },
- "victory": {
- "1": "無論我是贏是輸,\n對廣闊的大自然來說並不重要……",
- "2": "與城市生活的窒息感相比,\n這種事情微不足道。"
- },
- "defeat": {
- "1": "我贏了。但與浩瀚的大自然相比,\n勝利算不了什麼…",
- "2": "與我的焦慮症相比,我覺得你也不會怎樣…"
- }
- },
- "scientist": {
- "encounter": {
- "1": "我的研究將引導這個世界走向和平與歡樂。"
- },
- "victory": {
- "1": "我是個天才…我不應該輸給你這樣的人…"
- }
- },
- "school_kid": {
- "encounter": {
- "1": "……嘿嘿。我對計算和分析很有信心。",
- "2": "我正在盡可能地積累經驗,$因為我希望有一天能成為道館館主。"
- },
- "victory": {
- "1": "哦…計算和分析也許和個例不太匹配呀…",
- "2": "我想,即使是艱難困苦的經歷,也有存在的意義。"
- }
- },
- "artist": {
- "encounter": {
- "1": "我以前很受歡迎,但現在已經徹底過氣了。"
- },
- "victory": {
- "1": "隨著時代的變遷,價值觀也在變化。$我意識到這一點已經太晚了。"
- }
- },
- "guitarist": {
- "encounter": {
- "1": "當我彈奏著走向勝利的旋律時,$準備好感受失敗的節奏吧!"
- },
- "victory": {
- "1": "暫時沉默了,但我不屈的旋律將繼續演奏。"
- }
- },
- "worker": {
- "encounter": {
- "1": "人們總誤解我,這讓我很煩。$我比大家想象的要乾淨得多。"
- },
- "victory": {
- "1": "我真的不想曬傷皮膚,所以我想在陰涼處工作。"
- }
- },
- "worker_female": {
- "encounter": {
- "1": "人們總是誤解我,這讓我很煩。 $我比大家想象的要乾淨得多。"
- },
- "victory": {
- "1": "我真的不想曬傷皮膚,\n所以我想在陰涼處工作。"
- },
- "defeat": {
- "1": "我的身體和心靈並不總同步。"
- }
- },
- "worker_double": {
- "encounter": {
- "1": "你會知道我們怎麼擊敗你的。我們在工地訓練過!"
- },
- "victory": {
- "1": "真奇怪…怎麼會這樣…我不應該被打敗的。"
- }
- },
- "hex_maniac": {
- "encounter": {
- "1": "我通常只聽古典音樂,但如果我輸了,$我想我應該試試新時代的音樂!",
- "2": "我的每一滴眼淚都讓我變得更加堅強。"
- },
- "victory": {
- "1": "樂壇新時代的曙光就此出現了嗎?",
- "2": "現在我變得更強了。我隨著他人怨恨而成長。"
- },
- "defeat": {
- "1": "“新時代”指的是二十世紀的古典作曲家,對吧?",
- "2": "不要糾結於悲傷或沮喪。$你可以用悲憤來激勵自己。"
- }
- },
- "psychic": {
- "encounter": {
- "1": "嘿!集中!"
- },
- "victory": {
- "1": "呃呃呃!"
- }
- },
- "officer": {
- "encounter": {
- "1": "準備好,因為正義即將得到伸張!",
- "2": "準備好維護法律,在戰場上伸張正義!"
- },
- "victory": {
- "1": "正義的分量比以往還要沉重……",
- "2": "失敗的陰影,在警局中徘徊。"
- }
- },
- "beauty": {
- "encounter": {
- "1": "我最後的戰鬥…我就是這麼看待這場對戰的…"
- },
- "victory": {
- "1": "很有趣…有時間再來一場最後的戰鬥…"
- }
- },
- "baker": {
- "encounter": {
- "1": "希望你準備好品嚐失敗的滋味!"
- },
- "victory": {
- "1": "我會捲土重來的。"
- }
- },
- "biker": {
- "encounter": {
- "1": "是時候加速,把你甩在後面了!"
- },
- "victory": {
- "1": "我會為下一場比賽調整狀態。"
- }
- },
- "firebreather": {
- "encounter": {
- "1": "我的火焰會吞噬你!",
- "2": "我的靈魂在燃燒,我要讓你看看它有多滾燙!",
- "3": "快來看看吧!"
- },
- "victory": {
- "1": "我燃成灰了…",
- "2": "哟! 好燙!",
- "3": "嗷! 我的鼻尖燒焦了!"
- }
- },
- "sailor": {
- "encounter": {
- "1": "夥計,如果你輸了,你就得挨板子!",
- "2": "來吧!這關係到我作為水手的尊嚴!",
- "3": "你好啊!你暈船麼?"
- },
- "victory": {
- "1": "啊,被孩子打敗了。",
- "2": "你的精神讓我沉淪!",
- "3": "好像是我暈船了…"
- }
- },
- "brock": {
- "encounter": {
- "1": "我對岩石屬性寶可夢的專精會擊敗你!來吧!",
- "2": "我磐石般的意志將壓倒你!",
- "3": "讓我展示給你看看,我寶可夢真正的力量!"
- },
- "victory": {
- "1": "你寶可夢的力量戰勝了我堅如磐石的防禦!",
- "2": "世界很大!很高興有機會和你戰鬥。",
- "3": "也許我應該回去追尋我成為寶可夢飼養員的夢想……"
- },
- "defeat": {
- "1": "最好的進攻就是堅固的防守!$那是我做事的方式!",
- "2": "下次來和我一起研究岩石屬性,$更好地了解如何與它們對戰!",
- "3": "哈哈,我在各地的旅行有所回報了!"
- }
- },
- "misty": {
- "encounter": {
- "1": "我的戰策就是使用水屬性寶可夢全面進攻!",
- "2": "嗨,我會讓你見識我的水屬性寶可夢的力量!",
- "3": "我的夢想是踏上旅程,與強大的訓練師戰鬥……$你能滿足我嗎?"
- },
- "victory": {
- "1": "你真的很強……我承認,你有技術的……",
- "2": "哼……你知道你只是運氣好,對吧?!",
- "3": "哇,你太過分了!不敢相信你打敗我了!"
- },
- "defeat": {
- "1": "強大的小霞對你來說,太過分了嗎?",
- "2": "我希望你看到了我寶可夢優雅的游泳技巧!",
- "3": "你的寶可夢無法匹敵我的心腹和驕傲!"
- }
- },
- "lt_surge": {
- "encounter": {
- "1": "我的電屬性寶可夢在戰爭中救了我!$我來給你展示一下!",
- "2": "立正!我要電到你投降!",
- "3": "我會像對待敵軍一樣,狠狠電你!"
- },
- "victory": {
- "1": "哇!你的隊伍有真傢伙,小子!",
- "2": "啊啊,你很強!連我的電擊技巧都輸給了你。",
- "3": "這失敗真是把我給電麻了!"
- },
- "defeat": {
- "1": "哦耶!我的電屬性寶可夢是世界第一!",
- "2": "哈哈哈!真是一場電動人心的戰鬥,小子!",
- "3": "寶可夢對戰等於戰爭,$我向你展示了軍隊中的格鬥技巧!"
- }
- },
- "erika": {
- "encounter": {
- "1": "啊,這裡天氣真好…$哦,對戰?那好吧。",
- "2": "我在寶可夢對戰上的造詣,$可以與我的插花技巧相媲美。",
- "3": "哦,希望我寶可夢的宜人香氣\n不會再讓我睡著…",
- "4": "看看花園裡的花朵,如此令人心曠神怡。"
- },
- "victory": {
- "1": "哦!我認輸啦~",
- "2": "這場比賽非常愉快。",
- "3": "啊,看來我輸了…",
- "4": "哦,我的天哪。"
- },
- "defeat": {
- "1": "我怕我會打瞌睡…",
- "2": "哦,我天。看來我的草屬性寶可夢擊敗了你。",
- "3": "那場戰鬥是如此令人心曠神怡。",
- "4": "哦…這就完啦?"
- }
- },
- "janine": {
- "encounter": {
- "1": "我正在掌握毒屬性攻擊的藝術。$今天我來和你過過招!",
- "2": "父親相信我能獨當一面。$我來證明他說的對!",
- "3": "我的忍術,僅次於我的父親!$你能跟的上嗎?"
- },
- "victory": {
- "1": "就算現在,我仍然需要繼續訓練…我明白了。",
- "2": "你的戰鬥技巧,超過了我。",
- "3": "我要好好努力提高我的技術。"
- },
- "defeat": {
- "1": "呵呵…毒液耗盡了你所有的力量。",
- "2": "哈!你根本無法抵擋我卓越的忍技!",
- "3": "我沒有辜負父親對我的信任。"
- }
- },
- "sabrina": {
- "encounter": {
- "1": "我的超能力預見了你的到來!",
- "2": "我不喜歡戰鬥,但如果你想,$我會展示我的實力!",
- "3": "我能感覺到你的雄心壯志。$我倒要看看你是不是虛有其表。"
- },
- "victory": {
- "1": "你的力量……遠遠超出了我的預知……",
- "2": "我沒有準確預測到你的實力。",
- "3": "即使我強大的超能力也無法感知到你這樣強大的人。"
- },
- "defeat": {
- "1": "這場勝利……和我看到的未來一樣啊!",
- "2": "也許我預感到有強大實力的人,是另一個……",
- "3": "在你奮不顧身投入戰鬥之前,\n磨練你的能力。$如果你這樣做,你才未來可期……"
- }
- },
- "blaine": {
- "encounter": {
- "1": "哈!希望你帶了燒傷治療藥!",
- "2": "我火熱的寶可夢將所有挑戰者都焚燒殆盡!",
- "3": "準備好玩火吧!"
- },
- "victory": {
- "1": "我已經焚燒殆盡了!甚至連灰燼都沒有留下!",
- "2": "我沒有把火焰煽得足夠高嗎?",
- "3": "我燃盡了……但這讓我進步的動力燃燒得更旺了!"
- },
- "defeat": {
- "1": "我的熊熊烈火無法被撲滅!",
- "2": "我的寶可夢因這次勝利而變得更加強大!",
- "3": "哈!我的激情燃得比你的更熱烈!"
- }
- },
- "giovanni": {
- "encounter": {
- "1": "我,火箭隊的領袖,\n會讓你的世界感受到痛苦!",
- "2": "我在這裡的訓練在我再次面對老朋友之前至關重要。",
- "3": "我認為你還沒有準備好迎接你即將經歷的失敗!"
- },
- "victory": {
- "1": "什麼!我輸了?! 我沒什麼可和你說的!",
- "2": "哼……你永遠無法理解我希望實現的目標。",
- "3": "這次失敗只是暫時的。$我將找準時機,讓火箭隊浴火重生。"
- },
- "defeat": {
- "1": "不知自己幾斤幾兩,\n說明你仍然只是一個孩子。",
- "2": "不要再試圖干涉我。",
- "3": "我希望你明白挑戰我是多麼愚蠢。"
- }
- },
- "roxanne": {
- "encounter": {
- "1": "您能否展示一下您是如何戰鬥的麼?",
- "2": "你可以和更多訓練師戰鬥來學到很多東西。",
- "3": "哦,被你抓到我正在用功了~$你想戰鬥嗎?"
- },
- "victory": {
- "1": "哦,看來我輸了。$我明白了。",
- "2": "看來我在戰鬥方面還有更多東西要學。",
- "3": "我會把今天在這裡學到的東西銘記於心。"
- },
- "defeat": {
- "1": "從我們的對戰中,我學到了很多。$希望你也是。",
- "2": "我期待再次與你戰鬥。$希望你能運用在此學到的東西。",
- "3": "我憑借我所學到的一切贏得了勝利。"
- }
- },
- "brawly": {
- "encounter": {
- "1": "哦,夥計,挑戰者!$讓我看看你的能耐!",
- "2": "你看起來很厲害嘛。$來對戰吧!",
- "3": "是時候掀起風暴了!$我們上吧!"
- },
- "victory": {
- "1": "哦哇,你把我沖走了!",
- "2": "你駕馭了我的海浪,把我打敗了!",
- "3": "我覺得我就像是在武鬥洞窟裡迷路了!"
- },
- "defeat": {
- "1": "哈哈,我駕馭了大浪!$有時間再挑戰我吧。",
- "2": "再和我一起衝浪吧!",
- "3": "就像潮水的漲落,\n我希望你也能再來挑戰我。"
- }
- },
- "wattson": {
- "encounter": {
- "1": "是時候被電擊了!$哈哈哈!",
- "2": "我要讓火星子飛蹦!$哈哈哈!",
- "3": "我希望你帶了麻痺藥!$哇哈哈哈!"
- },
- "victory": {
- "1": "看來我的電量用完了!$哇哈哈哈!",
- "2": "你完全接地了是吧!$哇哈哈哈!",
- "3": "謝謝你給我電了一下!$哇哈哈哈!"
- },
- "defeat": {
- "1": "電充充滿,有時間再挑戰我吧!$哇哈哈哈!",
- "2": "我希望你覺得我們的戰鬥激情似電!$哇哈哈哈!",
- "3": "你沒想到我贏了吧?$哇哈哈哈!"
- }
- },
- "flannery": {
- "encounter": {
- "1": "很高興見到你!等等,不對……$我要粉碎你!",
- "2": "我才當道館主沒多久,\n但我會讓你灰飛煙滅!",
- "3": "是時候展示爺爺教給我的招式了!來對戰吧!"
- },
- "victory": {
- "1": "你讓我想起了我的爺爺……$難怪我輸了。",
- "2": "我是不是太努力了?$我應該放鬆,不能太上頭了。",
- "3": "失敗才不會嗆到我。$是時候重新點燃訓練了!"
- },
- "defeat": {
- "1": "我希望我讓祖父感到驕傲了……$有時間我們再戰鬥吧。",
- "2": "我……我簡直不敢相信我贏了!$按照自己的方式做事奏效了!",
- "3": "早點用炙熱的招式再來交手吧!"
- }
- },
- "norman": {
- "encounter": {
- "1": "我沒想到你能一路來到這裡。$我們來對戰吧。",
- "2": "作為道館主,我會盡一切努力贏得勝利。$我們開始吧!",
- "3": "你最好全力以赴。$對戰的時候到了!"
- },
- "victory": {
- "1": "我輸給了你……?$但規則就是規則。",
- "2": "難道我不該從城都搬家嗎……?",
- "3": "我不敢相信。$這是一場好對戰。"
- },
- "defeat": {
- "1": "我們都盡力了。$希望我們不久之後能再對戰。",
- "2": "你應該嘗試挑戰我的孩子。$可能會有一些收穫!",
- "3": "謝謝你精彩的戰鬥。$下次好運。"
- }
- },
- "winona": {
- "encounter": {
- "1": "我一直在天空中翱翔尋找獵物…$而你就是我的目標!",
- "2": "不管戰況如何,我都會和我的飛行寶可夢$以優雅的姿態獲勝。來戰鬥吧!",
- "3": "我希望你不怕高。$我們一起升上高空吧!"
- },
- "victory": {
- "1": "你是我見過的第一位比我更有風度的訓練師。$打的非常出色。",
- "2": "哦,我的飛行系寶可夢都已經墜落了!$好吧。",
- "3": "儘管我倒下了,我的寶可夢將繼續翱翔!"
- },
- "defeat": {
- "1": "我與我的飛行系寶可夢,\n將永遠優雅地起舞!",
- "2": "我希望你喜歡我們的演出。$我們優雅的舞蹈已經落幕。",
- "3": "你願意再來觀看我們優雅的編舞嗎?"
- }
- },
- "tate": {
- "encounter": {
- "1": "嘿嘿嘿…$看到我沒和妹妹在一起,很驚訝麼?",
- "2": "我可以讀懂你在想什麼…$你想要戰鬥!",
- "3": "你如何擊敗一個…$讀懂你一舉一動的人?"
- },
- "victory": {
- "1": "贏不了啊…$我想小南了…",
- "2": "你和寶可夢之間的聯繫比我們更強。",
- "3": "如果我和小南聯手,我們會贏的。$我們可以了解彼此的想法!"
- },
- "defeat": {
- "1": "我和我的寶可夢無與倫比!",
- "2": "如果你連我都打不過,\n你肯定也打不過小南。",
- "3": "這多虧了我和小南的嚴格訓練。$我可以與寶可夢一心同體。"
- }
- },
- "liza": {
- "encounter": {
- "1": "呵呵呵…$看到我沒和哥哥一起,很驚訝嗎?",
- "2": "我可以讀懂你渴望什麼…$你想戰鬥,不是嗎?",
- "3": "你如何擊敗一個…$與寶可夢們一心同體的人?"
- },
- "victory": {
- "1": "贏不了啊…$我想小楓了…",
- "2": "你和寶可夢之間的聯繫…$比我強。",
- "3": "如果我和小楓在一起,我們會贏的。$我們甚至可以接上彼此的話!"
- },
- "defeat": {
- "1": "我和我的寶可夢勢不可擋。",
- "2": "如果你連我都打不過,\n你肯定也打不過小楓。",
- "3": "這多虧了我和小楓的嚴格訓練。$我可以與我的寶可夢一心同體。"
- }
- },
- "juan": {
- "encounter": {
- "1": "別害羞啊。$我們來戰鬥吧!",
- "2": "啊哈哈哈,敬請期待\n我和水屬性寶可夢的盛大演出!",
- "3": "我就是正在逼近的風暴!$你能經受住考驗嗎?",
- "4": "請你見證我們的表演。$由我和寶可夢共同創造的宏偉水之幻境!"
- },
- "victory": {
- "1": "你可能是一個能挑戰米可利的天才!",
- "2": "我專注於優雅,而你刻苦鍛鍊。$你能擊敗我是很正常的。",
- "3": "啊哈哈哈!$好吧,這次你贏了。",
- "4": "從你身上,我感受到了技巧的光輝,\n它將戰勝一切。"
- },
- "defeat": {
- "1": "寶可夢和我創造的水之幻境,讓我取得了勝利。",
- "2": "啊哈哈哈,我贏了,你輸了。",
- "3": "要我把我的服裝借給你嗎?\n可能能幫到你對戰啊!$啊哈哈哈,我開玩笑的!",
- "4": "我是贏家!也就是說,你輸了。"
- }
- },
- "crasher_wake": {
- "encounter": {
- "1": "極限! 極限! 看好了!$極限假面…就此…登場!",
- "2": "極限! 極限! 極限假面!",
- "3": "我是滔滔巨浪,將你沖走!"
- },
- "victory": {
- "1": "我真是笑得合不攏嘴啊!$哈哈哈!那真是太有趣了!",
- "2": "呼哇!結束收尾了!$我該怎麼說呢……$我還想再對戰!我還想再繼續戰鬥!",
- "3": "啊啊啊啊啊!?"
- },
- "defeat": {
- "1": "耶!就是這樣!",
- "2": "我贏了,但我還想要更多!\n我還想再更多地戰鬥!",
- "3": "再見!"
- }
- },
- "falkner": {
- "encounter": {
- "1": "我將向你展示華麗的飛行寶可夢真正的力量!",
- "2": "風啊,伴我同行!",
- "3": "爸爸!我希望你能在空中注視著我的戰鬥!"
- },
- "victory": {
- "1": "明白了……我會禮貌地退場。",
- "2": "輸了就是輸了。你確實很強大。",
- "3": "…行吧! 嗯, 我輸了。"
- },
- "defeat": {
- "1": "爸爸!我用你珍愛的飛行寶可夢贏了……",
- "2": "飛行系寶可夢才是最強的!",
- "3": "感覺我正在追趕上我的父親!"
- }
- },
- "nessa": {
- "encounter": {
- "1": "無論你的小腦瓜子在搞什麼陰謀詭計,$我和我的搭檔都會確保它石沉大海。",
- "2": "我來這裡可不是為了閒聊,\n而是為了贏!",
- "3": "這是我的寶可夢給你的一點小禮物……\n我希望你能接受!"
- },
- "victory": {
- "1": "你和你的寶可夢太過分了……",
- "2": "怎麼……?這怎麼可能?!",
- "3": "我完全被沖走了!"
- },
- "defeat": {
- "1": "洶湧的海浪再次襲來!",
- "2": "是時候乘風破浪,取得勝利了!",
- "3": "誒嘿嘿!"
- }
- },
- "melony": {
- "encounter": {
- "1": "我不會手下留情!",
- "2": "好吧,我想我們應該開始了。",
- "3": "我會把你凍得結結實實的!"
- },
- "victory": {
- "1": "你……你可厲害了,是不是?",
- "2": "如果你找到瑪瓜,一定要好好教訓他,好嗎?",
- "3": "你的破冰方式有點過於直接了呢……"
- },
- "defeat": {
- "1": "現在你知道戰鬥有多殘酷了吧?",
- "2": "嘿!看來我又贏了!",
- "3": "你是在保留實力嗎?"
- }
- },
- "marlon": {
- "encounter": {
- "1": "你看起來很強!來吧!讓我們開始吧!",
- "2": "我的強大像大海一樣無邊無際。$你會被我沖走,絕對的。",
- "3": "哦豁,由我來面對你!這可不得了咯!"
- },
- "victory": {
- "1": "你太厲害了!\n你培養了一些非常強大的寶可夢啊,$你已經掌握了訓練師的精髓!",
- "2": "你不僅僅是看起來,\n你是真的強,真的!$呃,我也被沖走了!",
- "3": "你像兇猛的波浪一樣強壯!"
- },
- "defeat": {
- "1": "你很強,但這還不足以動搖大海,懂?",
- "2": "嘻!看來我又贏了!",
- "3": "甜蜜的勝利!"
- }
- },
- "shauntal": {
- "encounter": {
- "1": "打擾了。你是挑戰者,對嗎?$我是四天王的幽靈系寶可夢使用者,$婉龍,我將是你的對手。",
- "2": "我非常喜歡描寫來到這裡的訓練師,\n以及他們訓練的寶可夢。$我可以用你和你的寶可夢作為主題嗎?",
- "3": "每個與寶可夢相處的人都有故事要講。$接下來要講的故事是怎樣的呢?"
- },
- "victory": {
- "1": "哇。我驚呆了!",
- "2": "對…對不起!我必須先向我的寶可夢道歉……$都是因為我讓你們有了不好的經歷,真的很抱歉!",
- "3": "你要知道,我仍然是四天王之一!"
- },
- "defeat": {
- "1": "額呵呵。",
- "2": "給了我下一部小說的絕佳素材!",
- "3": "就這樣,又一篇故事來到尾聲……"
- }
- },
- "marshal": {
- "encounter": {
- "1": "我的師傅,阿戴克,\n看到了你作為訓練師的潛力,$對你很有興趣。$我要來考驗你——挖掘你力量的極限。\n丹田發力!",
- "2": "勝利,決定性的勝利,\n正是我所求!挑戰者,我來了!",
- "3": "在我的心中,我尋求著成為戰士的力量,\n克服自身的所有弱點!$以我的信念,取勝!"
- },
- "victory": {
- "1": "呼!幹得好!",
- "2": "不要停止戰鬥,追求更高的目標!",
- "3": "你和你寶可夢展現的力量\n給我留下了深刻的印象……"
- },
- "defeat": {
- "1": "嗯…",
- "2": "這真是場好戰鬥。",
- "3": "哈啊!哈啊!嗨呀啊!"
- }
- },
- "cheren": {
- "encounter": {
- "1": "你讓我想起了一位老朋友。$這讓我對這場寶可夢戰鬥感到興奮!",
- "2": "不考慮清楚這一點,\n寶可夢對戰就沒有了意義。$這就是失去了和寶可夢一同戰鬥的意義。",
- "3": "我的名字是黑連!我是道館館主,\n也是老師!$很高興認識你。"
- },
- "victory": {
- "1": "謝謝……我又能發現自己的不足了。",
- "2": "謝謝…接近理想的道路…我好像隱約看到了。",
- "3": "嗯……這值得思考。"
- },
- "defeat": {
- "1": "作為道館館主,我要成為你要跨越的壁壘!",
- "2": "好吧!",
- "3": "正因為有寶可夢,我們才能走到這裡。$為什麼寶可夢會幫助我們,\n這個恐怕不僅是寶可夢與訓練家…$而是生命與生命之間的問題。"
- }
- },
- "chili": {
- "encounter": {
- "1": "咿呀!是時候玩火了!!我是三兄弟中最強的!",
- "2": "嗒噠!如火似焰的伯特——就是我\n——你接下來的對手!",
- "3": "我將向你展示,\n我和我熾熱的火系寶可夢的能耐!"
- },
- "victory": {
- "1": "被你幹掉了。我……燃盡了……",
- "2": "哇吼!你燃起來了!",
- "3": "啊!被你幹碎了!"
- },
- "defeat": {
- "1": "我燃起來啦!和我玩兒,你就會被燙傷!",
- "2": "你要是玩兒火,就會被燙傷!",
- "3": "我說,拜託,\n你的對手是我,沒機會贏的!"
- }
- },
- "cilan": {
- "encounter": {
- "1": "無關個人情感…也不會有艱難的感受…$我和我的草屬性寶可夢會…$呃…不管什麼樣的對手我們都會應戰的。",
- "2": "所以,呃,如果你願意的話,我會,\n呃,盡我所能做好,呃,你知道的,你的對手。",
- "3": "好吧……所以,我是天桐,\n我喜歡草屬性寶可夢。"
- },
- "victory": {
- "1": "呃……已經結束了嗎?",
- "2": "…真是太意外了。你真…強。$看起來就算是伯特或寇恩都贏不了你…",
- "3": "…嗯。看起來我來的…不是時候?"
- },
- "defeat": {
- "1": "哈?我贏了?",
- "2": "我想…$我想我贏了,因為我一直在和我的兄弟伯特和寇恩競爭,\n我們都變得更強了。",
- "3": "…這…這是一次非常嚇人的經歷呢…"
- }
- },
- "roark": {
- "encounter": {
- "1": "我需要看看你作為訓練師的潛力。$還有,我要看看與你並肩作戰的寶可夢的堅韌!",
- "2": "來吧!這些是我的岩石系寶可夢,我的驕傲!",
- "3": "岩石屬性寶可夢就是最強的!",
- "4": "我要看看你作為訓練師的潛力。$還要看看與你並肩作戰的寶可夢的堅韌!"
- },
- "victory": {
- "1": "什麼?不可能!我強化的寶可夢們!",
- "2": "……我大腦過載了。$下次邀請你參加地下的化石挖掘比賽。",
- "3": "有你這種技術,贏得勝利是很正常的。",
- "4": "什麼?!連這也不夠?",
- "5": "我搞砸了。"
- },
- "defeat": {
- "1": "看?我為我的搖滾戰鬥風格感到驕傲!",
- "2": "謝謝!這場戰鬥給了我自信,$我感覺能夠打敗我父親了!",
- "3": "我感覺就像我砸穿了一塊頑石!"
- }
- },
- "morty": {
- "encounter": {
- "1": "只要我再多努力一點,我就能看到我遇到傳說中的寶可夢的未來!$你會幫助我達到那個水平!",
- "2": "據說,彩虹色的寶可夢會\n出現在真正強大的訓練師面前。 $我一直相信著這個美麗的傳說,\n所以,從出生開始,\n就在這裡進行著秘密的修行。$因為這樣,其他人看不到的東西\n我也能夠看得到…$我看到的,是那個將傳說中的寶可夢\n召喚到這片大地上的人的影子。$我一直相信,那就是我自己!\n希望你也能助我一臂之力!",
- "3": "無論你相信還是不相信,神秘的力量確實存在。",
- "4": "你可以見證我訓練的成果。",
- "5": "你必須讓你與寶可夢的靈魂合二為一。你能做到嗎?",
- "6": "嘿,你想成為我訓練的一部分嗎?"
- },
- "victory": {
- "1": "我還不夠好……",
- "2": "我明白了…你的旅程…去了遙遠的地方,你見過的比我多得多。$我羨慕你…",
- "3": "這怎麼可能……",
- "4": "我認為我們的潛力沒什麼不同。$但是,我覺得你並不簡單,似乎還有什麼……",
- "5": "我想我需要更多的訓練。",
- "6": "那太遺憾了"
- },
- "defeat": {
- "1": "我又向前邁進了一步。",
- "2": "呵呵呵……",
- "3": "什…麼?!那還不夠?",
- "4": "我感覺就像我砸穿了一塊頑石!",
- "5": "哈哈哈啊!",
- "6": "我知道我會贏!"
- }
- },
- "crispin": {
- "encounter": {
- "1": "我想贏,所以接下來我正要贏!",
- "2": "我想對戰就對戰!懂嗎!就應該這樣!"
- },
- "victory": {
- "1": "我想贏……但我還是輸了!",
- "2": "我輸了……因為我贏不了!"
- },
- "defeat": {
- "1": "嘿,等一下。我是不是贏了?$我覺得我贏了!太滿足了!",
- "2": "哇哦!那太棒了!"
- }
- },
- "amarys": {
- "encounter": {
- "1": "我想幫助某個人。因此,我不能輸。$…我們的戰鬥現在開始。"
- },
- "victory": {
- "1": "我還不夠,我明白了。"
- },
- "defeat": {
- "1": "勝利屬於我。打得好。"
- }
- },
- "lacey": {
- "encounter": {
- "1": "我將用我平時的隊伍\n作為四天王的一員面對你。"
- },
- "victory": {
- "1": "打得真好呀~"
- },
- "defeat": {
- "1": "讓我們為你寶可夢的努力給予熱烈的掌聲!"
- }
- },
- "drayton": {
- "encounter": {
- "1": "哥們,我喜歡椅子。\n你喜歡椅子嗎?簡直是救星。$我不明白為什麼大家不一直坐著。\n站著多累人!"
- },
- "victory": {
- "1": "我早該想到的!"
- },
- "defeat": {
- "1": "嘿嘿嘿!別介意我,\n我只是在這裡小贏一下。$如果你不開心,我懂,\n但別因為我對烏栗發火,OK?"
- }
- },
- "ramos": {
- "encounter": {
- "1": "我用那些強壯的植物\n蓋出來的遊樂場精彩嗎?$它們的力量象徵著我這個園丁兼道館館主的實力,\n你真的確定能夠與之抗衡嗎?"
- },
- "victory": {
- "1": "你信任你的寶可夢,\n它們也信任你…不錯的戰鬥,小豆芽。"
- },
- "defeat": {
- "1": "呵呵呵…確實,\n脆弱的小草甚至能穿透混凝土。"
- }
- },
- "viola": {
- "encounter": {
- "1": "敗陣時的後悔,勝利的瞬間…$都是最棒的影象!很好呀,很好呀!$那麼來吧!",
- "2": "我的鏡頭總會聚焦在勝利上,\n我不會讓任何事情破壞這個畫面!"
- },
- "victory": {
- "1": "你和你的寶可夢向我展示了一個全新的鏡頭機位!\n很好呀,很好呀!",
- "2": "你通過鏡頭看到的世界,\n和你與寶可夢並肩作戰時看到的世界…$視角不同,即使是同一個世界看起來也完全不同。"
- },
- "defeat": {
- "1": "我勝利那一刻的照片,\n將是一個真正的贏家,對吧!",
- "2": "是的!我拍了些很棒的照片!"
- }
- },
- "candice": {
- "encounter": {
- "1": "向小菘我挑戰嗎?好啊!\n我就是在等待強者$但是我也氣勢高昂,很強哦?",
- "2": "寶可夢也好,時尚也好,戀愛也好,\n無論做什麼都氣勢高昂!$就說到這兒吧,讓你見識一下我的氣勢,\n要做好覺悟哦!"
- },
- "victory": {
- "1": "好厲害!我有點尊敬你了。",
- "2": "好厲害!我有點尊敬你了!$嗯,感覺是被你的氣勢給壓倒了。"
- },
- "defeat": {
- "1": "你的氣勢我看到了,但我還是不會輸的!",
- "2": "怎麼樣?小菘我的氣勢!\n寶可夢們的氣勢滿滿哦!"
- }
- },
- "gardenia": {
- "encounter": {
- "1": "你身上有一種勝利的氣息。\n那麼不管怎樣,$這應該會是場有趣的戰鬥。\n讓我們對戰吧!"
- },
- "victory": {
- "1": "太棒了!你可擅長對戰了,不是嗎?"
- },
- "defeat": {
- "1": "太好了!我的寶可夢和我都很棒!"
- }
- },
- "aaron": {
- "encounter": {
- "1": "好的!讓我來接受你的挑戰!"
- },
- "victory": {
- "1": "戰鬥是一件深刻而複雜的事情……"
- },
- "defeat": {
- "1": "戰勝一位四天王並不容易。"
- }
- },
- "cress": {
- "encounter": {
- "1": "沒!錯!你必須面對\n與我和我高貴的水屬性的戰鬥!"
- },
- "victory": {
- "1": "輸了?我?我不敢相信。"
- },
- "defeat": {
- "1": "當你的對手是我時,這是必然的結果。"
- }
- },
- "allister": {
- "encounter": {
- "1": "我是歐尼奧。$我…我來了……"
- },
- "victory": {
- "1": "我差點被嚇得丟了面具…那真是…$哇。我可以看清你真正的實力。"
- },
- "defeat": {
- "1": "這真是太棒了!"
- }
- },
- "clay": {
- "encounter": {
- "1": "咳咳! 讓我好等,不是嗎,孩子?$好吧,是時候看看你能做到什麼了!"
- },
- "victory": {
- "1": "真是的……我先說好,\n我可沒有手下留情。"
- },
- "defeat": {
- "1": "最重要的是輸掉的時候該怎麼辦。$只要你能在失敗中找到教訓,\n就能夠不斷地成長!"
- }
- },
- "kofu": {
- "encounter": {
- "1": "我會給你上一整道水系寶可夢大餐!\n但別真吃了它們!"
- },
- "victory": {
- "1": "吃了嗎!你真是活力又新鮮啊,\n不是嗎!$就是有點太鮮活了!"
- },
- "defeat": {
- "1": "你要再來找我,聽見了嗎?"
- }
- },
- "tulip": {
- "encounter": {
- "1": "請讓我運用我的化妝技巧,$讓你可愛的小寶可夢變得更美麗!"
- },
- "victory": {
- "1": "你妝點的力量宛如魔法加固,\n完全沖洗不掉啊。"
- },
- "defeat": {
- "1": "你知道嗎,在我這行,\n那些沒天賦的人往往會很快消失,$再也不會被提起。"
- }
- },
- "sidney": {
- "encounter": {
- "1": "你給我的印象不錯,\n我猜這會是一場精彩的對戰。$很棒!看起來真的很棒!$你和我,讓我們享受一場\n只能在這裡上演的戰鬥吧!"
- },
- "victory": {
- "1": "嗯,你覺得怎樣?我輸了!\n嗯,不過這很有趣,所以無所謂啊。"
- },
- "defeat": {
- "1": "別介意,OK?"
- }
- },
- "phoebe": {
- "encounter": {
- "1": "過去我在修行時得到了\n能與幽靈寶可夢親密交流的能力。$沒錯,我和寶可夢之間\n有著強烈的羈絆。$那麼,來試試看你有沒有能力\n傷到我的寶可夢吧!"
- },
- "victory": {
- "1": "哦,天呀。我輸了。"
- },
- "defeat": {
- "1": "我期待著下次再和你戰鬥!"
- }
- },
- "glacia": {
- "encounter": {
- "1": "我在這兒見到的盡是些\n弱不禁風的訓練家和寶可夢。$你又如何呢?如果你能讓我不得不用\n上全力的話就再好不過了!"
- },
- "victory": {
- "1": "你和你的寶可夢…\n你們的靈魂燃燒得多麼熱烈啊!$這股激烈的熱能仿佛能征服一切。\n$難怪我的冰屬性技巧也奈何不了你了。"
- },
- "defeat": {
- "1": "一場充滿激情的戰鬥,確實。"
- }
- },
- "drake": {
- "encounter": {
- "1": "對於我們這些將寶可夢視為\n同伴一同戰鬥的訓練家來說,$你知道怎樣才能贏得勝利嗎?\n你知道獲得勝利的條件嗎?$如果你不知道,\n那麼你永遠也無法戰勝我!"
- },
- "victory": {
- "1": "幹得漂亮,就是這樣。"
- },
- "defeat": {
- "1": "我在這場戰鬥中全力以赴了!"
- }
- },
- "wallace": {
- "encounter": {
- "1": "你的氣質變了,\n我能感覺到這一點。$現在,把你和你的寶可夢\n的力量展現給我看吧。$作為回禮,就由我和我的寶可夢\n演出一場水之幻影吧!"
- },
- "victory": {
- "1": "精彩。此刻,我能從你身上感覺到\n身為寶可夢訓練家的可靠與高貴。$我真榮幸能遇到你和你的寶可夢。"
- },
- "defeat": {
- "1": "偉大的幻影!"
- }
- },
- "lorelei": {
- "encounter": {
- "1": "只要能讓我用冰屬性寶可夢,\n就絕對沒人能贏得過我!\n能凍住對方可是很厲害的哦!$因為如果被凍住,你的寶可夢就無法動彈了!\n啊哈哈!你做好覺悟了吧!"
- },
- "victory": {
- "1": "你怎麼敢!"
- },
- "defeat": {
- "1": "一旦你被凍結,你就什麼都做不了。"
- }
- },
- "will": {
- "encounter": {
- "1": "我曾經環遊世界,\n日以繼夜地做著超能力寶可夢的修行之旅。$我會不斷變強!沒理由會在這裡輸掉!"
- },
- "victory": {
- "1": "……不會吧……"
- },
- "defeat": {
- "1": "就差一點。\n我想知道你缺少了什麼。"
- }
- },
- "malva": {
- "encounter": {
- "1": "我的內心可是一直燃燒著呢。$燃燒著對你的怒火!"
- },
- "victory": {
- "1": "挑戰者出色地擊敗了四天王之一,帕琦拉。"
- },
- "defeat": {
- "1": "真開心啊,能將你徹底粉碎!"
- }
- },
- "hala": {
- "encounter": {
- "1": "老哈拉讓你放開嗓子!"
- },
- "victory": {
- "1": "我能感受到你在旅途中所獲得的力量。"
- },
- "defeat": {
- "1": "啊哈哈。多麼有趣的戰鬥。"
- }
- },
- "molayne": {
- "encounter": {
- "1": "我將隊長的位置讓給了我的表弟馬瑪內,\n但我對自己的能力很有信心。 $我的力量就像超新星一樣!"
- },
- "victory": {
- "1": "我發現了一個有趣的訓練師對手!"
- },
- "defeat": {
- "1": "啊哈哈。多麼有趣的戰鬥。"
- }
- },
- "rika": {
- "encounter": {
- "1": "我要對你手下留情,但……騙你的啦! $好好動腦!"
- },
- "victory": {
- "1": "不錯,小子。"
- },
- "defeat": {
- "1": "啊哈哈哈哈!你真的很特别,小子!"
- }
- },
- "bruno": {
- "encounter": {
- "1": "我們將用勢不可擋的力量磨滅你!呼哈!"
- },
- "victory": {
- "1": "為什麼?我怎麼會輸?"
- },
- "defeat": {
- "1": "你可以隨意挑戰我,\n但結果永遠不會改變!"
- }
- },
- "bugsy": {
- "encounter": {
- "1": "我是阿筆!\n對蟲系寶可夢的熟悉不會輸給任何人的!"
- },
- "victory": {
- "1": "哇,太棒了!\n你是個寶可夢專家!$我的研究還沒有完成。\n好吧,你贏了。"
- },
- "defeat": {
- "1": "謝謝!多虧了我們的戰鬥,\n我的研究也取得了進展!"
- }
- },
- "koga": {
- "encounter": {
- "1": "哇哈哈哈哈!$寶可夢不僅僅是關於蠻力,拭目以待吧!"
- },
- "victory": {
- "1": "啊!你證明了自己!"
- },
- "defeat": {
- "1": "懂不懂要對忍者的技巧心神畏懼?"
- }
- },
- "bertha": {
- "encounter": {
- "1": "啊,讓老婆婆看看你學到了什麼?"
- },
- "victory": {
- "1": "好吧,親愛的孩子,\n不得不說,那令人印象深刻。$你的寶可夢相信你並盡最大努力為你贏得勝利。$儘管我輸了,\n我也止不住笑呢!"
- },
- "defeat": {
- "1": "哈哈哈!看來老婆婆我贏了!"
- }
- },
- "lenora": {
- "encounter": {
- "1": "那麼,挑戰者,讓我來研究$你與你精心養育的寶可夢要如何戰鬥!"
- },
- "victory": {
- "1": "我關於你的理論是正確的。$你不僅僅是有天賦……你很努力!\n我向你致敬!"
- },
- "defeat": {
- "1": "啊哈哈!如果你輸了,\n一定要分析原因,$並在下一場戰鬥中運用那些知識!"
- }
- },
- "siebold": {
- "encounter": {
- "1": "只要我活著,我將不斷努力尋求終極美食…$以及和最強的對手戰鬥!"
- },
- "victory": {
- "1": "您的事蹟,我志米銘記在心。"
- },
- "defeat": {
- "1": "我們的寶可夢戰鬥就像我靈魂的養料。\n它將讓我繼續前進。$這就是我將向你表示敬意的方式,\n感謝你在戰鬥中全力以赴!"
- }
- },
- "roxie": {
- "encounter": {
- "1": "準備好了嗎!我要給你上一課!"
- },
- "victory": {
- "1": "夠野的!你的想法比我的還要毒!"
- },
- "defeat": {
- "1": "嘿,拜託!認真點!\n你要加把勁啊!"
- }
- },
- "olivia": {
- "encounter": {
- "1": "沒什麼開場白。\n是時候和我麗姿,戰鬥了!"
- },
- "victory": {
- "1": "真的很可愛……你和你的寶可夢……"
- },
- "defeat": {
- "1": "嗯哼。"
- }
- },
- "poppy": {
- "encounter": {
- "1": "哦!你想和我進行寶可夢對戰麼?"
- },
- "victory": {
- "1": "嗚哇?!嘛……"
- },
- "defeat": {
- "1": "耶!我做到了!我擊~敗~了~你!\n你可以來…打…復仇之戰?$只要你想,隨時來打復仇之戰吧!"
- }
- },
- "agatha": {
- "encounter": {
- "1": "寶可夢是用來戰鬥的!我會讓你看看真正訓練家的戰鬥!"
- },
- "victory": {
- "1": "哦,我的天!你真是個特別的孩子!"
- },
- "defeat": {
- "1": "哈哈哈,這才是正確的戰鬥方式!"
- }
- },
- "flint": {
- "encounter": {
- "1": "希望你已經熱身完畢,\n因為這裡即將大爆炸!"
- },
- "victory": {
- "1": "不可思議!$你的動作如此火熱,讓我看起來溫吞吞的!"
- },
- "defeat": {
- "1": "嗯?就這嗎?\n我覺得你得再激情點。"
- }
- },
- "grimsley": {
- "encounter": {
- "1": "一無所有,\n或者,贏下所有!"
- },
- "victory": {
- "1": "一旦失敗,\n就意味著失去一切……$下一次我要追尋勝利!"
- },
- "defeat": {
- "1": "如果有人贏了,\n和他對戰的人就會輸。"
- }
- },
- "caitlin": {
- "encounter": {
- "1": "當花兒綻開時、我便出現。\n成為你在等待的人…$你似乎同時具備實力和善意$我所尋找的是擁有卓越力量的對手…$請用出你的全力吧!"
- },
- "victory": {
- "1": "我和我的寶可夢學到了很多!非常感謝。"
- },
- "defeat": {
- "1": "我渴望以優雅的姿態取得勝利。"
- }
- },
- "diantha": {
- "encounter": {
- "1": "與你的寶可夢對戰\n讓你充滿了未來的希望…$說真的,這讓我更有活力地面對新的一天,確實如此!"
- },
- "victory": {
- "1": "擁有高尚靈魂的訓練家和寶可夢的身姿,\n讓我的心激烈地震顫…"
- },
- "defeat": {
- "1": "哦,太棒了!你覺得怎麼樣?\n我的隊伍很酷吧~對吧?"
- }
- },
- "wikstrom": {
- "encounter": {
- "1": "年輕的挑戰者,幸會!\n我乃是著名的鋼鐵之刃,公爵雁鎧! $讓我們開始戰鬥吧!預備!"
- },
- "victory": {
- "1": "輝煌!你與你尊貴的\n寶可夢之間的信任居然勝過了我!"
- },
- "defeat": {
- "1": "哦哦哦!這是怎麼回事,\n我的心止不住地在震顫! $與如此有價值的對手的勝利\n讓我的靈魂飛翔——我心翱翔!"
- }
- },
- "acerola": {
- "encounter": {
- "1": "對戰只是找個樂子!來吧,我來會會你!"
- },
- "victory": {
- "1": "我……我說不出話!你是怎麼做到的?!"
- },
- "defeat": {
- "1": "哈哈!真是嚇人倒怪的勝利呀!"
- }
- },
- "larry_elite": {
- "encounter": {
- "1": "……你好,我是青木。$麻煩的是我還要兼任四天王。"
- },
- "victory": {
- "1": "好吧,我們翅膀下的疾風止於你這了啊…"
- },
- "defeat": {
- "1": "是時候和老闆開會了。"
- }
- },
- "lance": {
- "encounter": {
- "1": "我一直在等你。讓我來試試你有幾斤幾兩。",
- "2": "我知道你能走這麼遠。讓我們開始吧。"
- },
- "victory": {
- "1": "被你拿下了啊。你太出色了!",
- "2": "我從沒想到會有另一個訓練師打敗我……$我很驚訝。"
- },
- "defeat": {
- "1": "就差一點。想再試一次嗎?",
- "2": "我沒覺得你弱,別因此困擾。"
- }
- },
- "karen": {
- "encounter": {
- "1": "我是梨花,你想和我的惡屬性寶可夢$來一場對決嗎?",
- "2": "我和你見過的那些人不一樣。",
- "3": "你組建了一支迷人的隊伍。$我們的戰鬥應該會是場精彩的比賽。"
- },
- "victory": {
- "1": "不!我贏不了。你是怎麼做到變得這麼強的?",
- "2": "我不會偏離我所選擇的道路。",
- "3": "冠軍正期待與你見面。"
- },
- "defeat": {
- "1": "意料之中。",
- "2": "嗯,還算有點意思。",
- "3": "隨時歡迎你來找我。"
- }
- },
- "milo": {
- "encounter": {
- "1": "看起來你顯然很了解寶可夢。$這會是一場激烈的戰鬥!$如果我想贏,我得讓我的寶可夢極巨化!"
- },
- "victory": {
- "1": "草的力量凋謝了…多麼不可思議的挑戰者!"
- },
- "defeat": {
- "1": "這必將讓你大吃一驚。"
- }
- },
- "lucian": {
- "encounter": {
- "1": "請稍等,我正在讀的書\n正要進入最精彩的部分…$英雄獲得了一把神秘之劍,\n即將面臨最後的考驗…啊,算了。$既然你能走到這一步,\n我就不說這些了,和你戰鬥吧。$讓我看看你是否\n能像我書中的主角一樣榮耀!"
- },
- "victory": {
- "1": "我明白了…看來你把我逼入了絕境。"
- },
- "defeat": {
- "1": "我得維護我的名譽。"
- }
- },
- "drasna": {
- "encounter": {
- "1": "你很厲害吧,\n而且相當相當地厲害呢。$我很高興,能和這樣的對手交手,\n就能更好地培養寶可夢們了。"
- },
- "victory": {
- "1": "哎呀,就這麼結束了,\n不好意思,可以的話歡迎再來。"
- },
- "defeat": {
- "1": "怎麼會這樣?"
- }
- },
- "kahili": {
- "encounter": {
- "1": "那麼,既然來了……\n要不來看看今天的風更青睞誰?$是你……還是我?"
- },
- "victory": {
- "1": "讓我這個四天王都感到沮喪,$看來你的力量貨真價實。"
- },
- "defeat": {
- "1": "那真是一記好球!"
- }
- },
- "hassel": {
- "encounter": {
- "1": "讓你親身感受一下什麼叫做猛烈的對戰氣息吧!"
- },
- "victory": {
- "1": "這次幸運之神對我微笑了,但是……$誰知道我下次會不會這麼幸運。"
- },
- "defeat": {
- "1": "那可真厲害!"
- }
- },
- "blue": {
- "encounter": {
- "1": "能走到這裡,你一定非常優秀。"
- },
- "victory": {
- "1": "我只輸給過他,現在又是你……?$你問他是誰?哈哈哈……"
- },
- "defeat": {
- "1": "看吧?我的實力就是我來到這裡的原因。"
- }
- },
- "piers": {
- "encounter": {
- "1": "準備好和我的隊伍來個大狂歡吧!$尖釘鎮,是時候嗨起來了!"
- },
- "victory": {
- "1": "我和我的隊伍已經盡力了。$找個時間再來對戰吧……"
- },
- "defeat": {
- "1": "我的喉嚨因為呼喊而變得沙啞……$但這是一場激動人心的戰鬥!"
- }
- },
- "red": {
- "encounter": {
- "1": "…!"
- },
- "victory": {
- "1": "…?"
- },
- "defeat": {
- "1": "…!"
- }
- },
- "jasmine": {
- "encounter": {
- "1": "哦……你的寶可夢給人印象深刻。$我想我會享受這場戰鬥的。"
- },
- "victory": {
- "1": "你真的很強。我也得加把勁了。"
- },
- "defeat": {
- "1": "我從沒想到會贏。"
- }
- },
- "lance_champion": {
- "encounter": {
- "1": "我依舊是冠軍,所以我不會留情的。"
- },
- "victory": {
- "1": "這就是新冠軍的崛起。"
- },
- "defeat": {
- "1": "我成功捍衛了冠軍的頭銜。"
- }
- },
- "steven": {
- "encounter": {
- "1": "告訴我…你在和寶可夢的旅途過程中看到了什麼?$邂逅了那麼多的訓練師,\n你都會有什麼樣的感受呢?$在這豐饒的大地上旅行…\n有沒有喚醒你內在的某種東西?$你不如就用一場對戰來告訴我你心中的答案吧。$我也會和我的寶可夢用這種方式\n將我們所知道的告訴你的!"
- },
- "victory": {
- "1": "沒想到連我這個聯盟冠軍\n都敗在你的手上了呢…"
- },
- "defeat": {
- "1": "正如我所期待的。謝謝!"
- }
- },
- "cynthia": {
- "encounter": {
- "1": "我,竹蘭,接受你的挑戰!\n我是絕不會手軟的!"
- },
- "victory": {
- "1": "無論對戰多麼有趣,\n它總會有結束的時候……"
- },
- "defeat": {
- "1": "即使你輸了,\n也永遠不要失去你對寶可夢的熱愛。"
- }
- },
- "iris": {
- "encounter": {
- "1": "你知道嗎?\n我真的很期待和強大的訓練師進行認真的戰鬥!$我的意思是,來吧!\n到達這裡的是那些渴望勝利的訓練師,$他們與經歷過無數艱難\n戰鬥的寶可夢一起戰鬥!$如果我和那樣的人戰鬥,\n不僅我會變得更強,我的寶可夢也會!$我們也會更好地了解彼此!\n好!做好準備吧!$我是艾莉絲,寶可夢聯盟冠軍,\n我,將打敗你!"
- },
- "victory": {
- "1": "啊……我盡力了,但我們輸了……"
- },
- "defeat": {
- "1": "耶!我們贏了!"
- }
- },
- "hau": {
- "encounter": {
- "1": "我想知道,訓練師是否會根據他們是\n來自溫暖地區還是寒冷地區而以不同的方式戰鬥。$讓我們來測試一下!"
- },
- "victory": {
- "1": "那太棒了!我覺得我現在有點了解你的感覺了!"
- },
- "defeat": {
- "1": "老鐵,這才叫戰鬥!"
- }
- },
- "geeta": {
- "encounter": {
- "1": "我決定再試一次。$來吧…讓我看看你的訓練成果。"
- },
- "victory": {
- "1": "我期待著你的成就!"
- },
- "defeat": {
- "1": "怎麼,這就結束了?"
- }
- },
- "nemona": {
- "encounter": {
- "1": "耶!我太興奮了!讓我們稍微放輕鬆!"
- },
- "victory": {
- "1": "好吧,太糟了,但我還是玩得很開心!$下次我一定會贏你!"
- },
- "defeat": {
- "1": "好吧,那是一場很棒的戰鬥!$肯定是會有收穫的啦。"
- }
- },
- "leon": {
- "encounter": {
- "1": "來享受一段冠軍時刻吧!"
- },
- "victory": {
- "1": "我的冠軍生涯結束了……但這是多麼美好的冠軍時刻啊!但這是多麼美好的冠軍時刻啊!謝謝你給了我最精彩的一戰!"
- },
- "defeat": {
- "1": "名副其實的冠軍時刻!"
- }
- },
- "whitney": {
- "encounter": {
- "1": "嘿!你不認為寶可夢超級可愛嗎?"
- },
- "victory": {
- "1": "哇啊!哇啊!你太壞了!"
- },
- "defeat": {
- "1": "就是這樣!"
- }
- },
- "chuck": {
- "encounter": {
- "1": "哈!你想挑戰我?你是勇敢還是無知?"
- },
- "victory": {
- "1": "你很強!能不能收我為徒?"
- },
- "defeat": {
- "1": "搞定。你明白我比你強得多了嗎?"
- }
- },
- "katy": {
- "encounter": {
- "1": "不要放鬆警惕,除非你想被蟲絲絆倒哦!"
- },
- "victory": {
- "1": "我可愛的寶可夢們都像蒼蠅一樣墜落了!"
- },
- "defeat": {
- "1": "開飯啦,我可愛的彩粉蝶!"
- }
- },
- "pryce": {
- "encounter": {
- "1": "年輕不代表能獲得勝利!經驗才是關鍵。"
- },
- "victory": {
- "1": "無與倫比!贏得完美,試著不要忘記你現在的感受。"
- },
- "defeat": {
- "1": "正如我所料。"
- }
- },
- "clair": {
- "encounter": {
- "1": "你知道我是誰嗎?知道還敢挑戰我?"
- },
- "victory": {
- "1": "我想知道以你現在的水平能走多遠,有趣。"
- },
- "defeat": {
- "1": "就是這樣。"
- }
- },
- "maylene": {
- "encounter": {
- "1": "我現在要挑戰你,我不會保留任何實力。$請準備好戰鬥!"
- },
- "victory": {
- "1": "是我輸了…"
- },
- "defeat": {
- "1": "太棒了。"
- }
- },
- "fantina": {
- "encounter": {
- "1": "你來挑戰吧。我會勝利。$這就是家緣市的道館館主。"
- },
- "victory": {
- "1": "你是最強的,我認輸了。"
- },
- "defeat": {
- "1": "我非常,非常高興!"
- }
- },
- "byron": {
- "encounter": {
- "1": "和我兒子瓢太一樣的年輕人啊!$我相信培養年輕人\n關係到寶可夢光明的未來!$為此就讓我來成為\n年輕人必須跨越的堡壘吧!"
- },
- "victory": {
- "1": "唔!我千錘百煉的寶可夢!"
- },
- "defeat": {
- "1": "哈哈哈哈!怎麼樣!我千錘百煉的寶可夢!"
- }
- },
- "olympia": {
- "encounter": {
- "1": "戰鬥是決定命運的古老傳統。讓我們開始吧!"
- },
- "victory": {
- "1": "創造你自己的道路。$不要讓任何東西阻擋你的路、你的命運、你的未來。"
- },
- "defeat": {
- "1": "我們的道路現在已經清晰了。"
- }
- },
- "volkner": {
- "encounter": {
- "1": "能留到最後的訓練家想必肯定是很強的…$希望你會是能讓我回憶起\n寶可夢對戰樂趣的訓練家!"
- },
- "victory": {
- "1": "我輸了…$你的心意,寶可夢的不顧一切。$戰鬥的時候就讓我熱血沸騰。"
- },
- "defeat": {
- "1": "完全沒感覺…$和我希望的完全不一樣!"
- }
- },
- "burgh": {
- "encounter": {
- "1": "唔…我有預感,\n只要贏了這場戰鬥就能畫出更好的畫來…$嗯!戰鬥充滿了幻象!那麼,馬上開始吧。",
- "2": "當然,我對我所有的寶可夢都相當驕傲! $現在…讓我們馬上開始吧!"
- },
- "victory": {
- "1": "結束了嗎?我的女神拋棄我了嗎?",
- "2": "啊唔,輸了……你還真是很強啊。"
- },
- "defeat": {
- "1": "唔啊……好……好美啊!",
- "2": "偶爾也有一些不是很好看的勝利,$但只要努力了,\n不管怎麼樣的戰鬥,都是很美麗的。"
- }
- },
- "elesa": {
- "encounter": {
- "1": "最後一擊!\n在確信這一點的時候全身會流淌過電流!$為追求這個快感,\n我要用可愛的寶可夢們讓你頭暈眼花。"
- },
- "victory": {
- "1": "本想讓你頭暈的,\n結果我倒反被你電到了。"
- },
- "defeat": {
- "1": "感覺還不夠啊……下次能使出全力來嗎?"
- }
- },
- "skyla": {
- "encounter": {
- "1": "終於到決戰了!\n這是決定頂點的寶可夢對戰吧?$我最喜歡頂點了!\n在高的地方能看到很遠很遠!$好了!就讓我和你好好地玩一場吧!"
- },
- "victory": {
- "1": "和你的戰鬥讓我更強了……謝謝。"
- },
- "defeat": {
- "1": "不管是贏了還是輸了,戰鬥都能得到一些東西。"
- }
- },
- "brycen": {
- "encounter": {
- "1": "有其他的人和寶可夢在一起,$這份支持會讓自己更強…\n讓我來給你展示一下這樣的強大吧!"
- },
- "victory": {
- "1": "你和你的寶可夢!配合得天衣無縫!\n華麗的友情!"
- },
- "defeat": {
- "1": "嘗試極限!鍛鍊!"
- }
- },
- "drayden": {
- "encounter": {
- "1": "現在我尋求的是\n能讓我看到光明未來的年輕訓練家。$你有多少實力,就讓我用我的經驗,\n我對寶可夢傾注的愛來驗證吧!"
- },
- "victory": {
- "1": "失敗後湧現的這灼熱的意志…\n該怎麼說呢…"
- },
- "defeat": {
- "1": "啊啊啊!你的實力就這種程度嗎!"
- }
- },
- "grant": {
- "encounter": {
- "1": "我只期待一件事。. $通過超越彼此,\n我們找到通往更高境界的道路。"
- },
- "victory": {
- "1": "你是一堵我無法逾越的牆!"
- },
- "defeat": {
- "1": "不要放棄。\n這就是人生的真諦。$大道至簡。"
- }
- },
- "korrina": {
- "encounter": {
- "1": "小女子科爾尼來大顯身手啦!"
- },
- "victory": {
- "1": "正因為有你,\n才能讓你的寶可夢進化!"
- },
- "defeat": {
- "1": "好勁爆的戰鬥呀!"
- }
- },
- "clemont": {
- "encounter": {
- "1": "哦!我很高興我們能見面!"
- },
- "victory": {
- "1": "你對戰鬥的熱情激勵了我!"
- },
- "defeat": {
- "1": "看來我的訓練師成長強化機-馬克2號,\n真的起作用了!"
- }
- },
- "valerie": {
- "encounter": {
- "1": "哦,這不是一個年輕的訓練師嗎……\n能這樣遇見你真是太好了。 $我想你已經獲得了這場戰鬥的資格,\n作為對你努力的獎勵。 $難以捉摸的妖精可能看起來像微風一樣脆弱,\n像花朵一樣精緻,但很堅強。"
- },
- "victory": {
- "1": "我希望明天你也能找到一些值得會心微笑的事物……"
- },
- "defeat": {
- "1": "哦,天哪,這太遺憾了……"
- }
- },
- "wulfric": {
- "encounter": {
- "1": "你知道嗎?\n我們都說戰鬥能學到東西,羈絆之類的,$但實際上,我這麼做只是因為有趣。 $誰在乎那些華而不實的東西?\n我們來戰鬥吧!"
- },
- "victory": {
- "1": "傑出!我像冰山一樣堅硬,但你徹底擊潰了我!"
- },
- "defeat": {
- "1": "和我幹的結果就是這樣!"
- }
- },
- "kabu": {
- "encounter": {
- "1": "每個訓練師和寶可夢都在努力追求勝利。$但這意味著你的對手也在努力贏得勝利。$最終,比賽是由哪一方\n能夠發揮出他們真正的潛力來決定的。"
- },
- "victory": {
- "1": "我很高興今天能和你戰鬥!"
- },
- "defeat": {
- "1": "這是我感覺自己的成長的好方式!"
- }
- },
- "bea": {
- "encounter": {
- "1": "你有沒有一種不可動搖的精神,\n受到什麼攻擊都安如磐石? $就讓我來試試吧?"
- },
- "victory": {
- "1": "我感受到了你的寶可夢\n在戰鬥中被你指揮時的戰鬥之魂。"
- },
- "defeat": {
- "1": "每個人都希望能有一場這樣的好比賽。"
- }
- },
- "opal": {
- "encounter": {
- "1": "讓我看看你和你的寶可夢的表現如何!"
- },
- "victory": {
- "1": "你不夠粉嫩呀,\n但你是一個優秀的訓練師,$還擁有著優秀的寶可夢。"
- },
- "defeat": {
- "1": "對你來說太慘了,我覺得。"
- }
- },
- "bede": {
- "encounter": {
- "1": "就讓我來證明你有多可憐,我有多強大。"
- },
- "victory": {
- "1": "我懂了……好吧。其實我還沒拿出全力呢。"
- },
- "defeat": {
- "1": "我覺得我打得不錯。"
- }
- },
- "gordie": {
- "encounter": {
- "1": "好了,我們來做個了結吧!"
- },
- "victory": {
- "1": "我只想要挖一個洞爬進去……$好吧,現在更像是掉了進去。"
- },
- "defeat": {
- "1": "像往常一樣戰鬥,勝利就會隨之而來!"
- }
- },
- "marnie": {
- "encounter": {
- "1": "事實上,言而總之… \n人家自己也想當冠軍呀! $所以別認為我在針對你!"
- },
- "victory": {
- "1": "好吧,我還是輸了……\n但是我看到了很多你和你寶可夢的優點哦"
- },
- "defeat": {
- "1": "希望你喜歡我們的戰鬥策略。"
- }
- },
- "raihan": {
- "encounter": {
- "1": "我打算擊敗冠軍,贏得錦標賽,\n並向世界證明奇巴納大人有多強!"
- },
- "victory": {
- "1": "就算輸了我也好帥。$真是罪孽深重啊。$看來得再來張自拍了!"
- },
- "defeat": {
- "1": "為了紀念此刻,來張自拍吧!"
- }
- },
- "brassius": {
- "encounter": {
- "1": "你應該準備好了吧,\n一起完成這美麗的藝術作品吧!"
- },
- "victory": {
- "1": "啊……前衛!"
- },
- "defeat": {
- "1": "我將立即開始新的創作!"
- }
- },
- "iono": {
- "encounter": {
- "1": "誰在奇述!是我奇樹!\n做好準備了嗎!$...$直播開始!\n今天的小挑戰者有多強?$奇樹不知道哦~\n讓我們一起來看看吧!"
- },
- "victory": {
- "1": "你的閃耀如1000萬伏特!朋友!"
- },
- "defeat": {
- "1": "奇樹奇樹捕獲你的眼球!"
- }
- },
- "larry": {
- "encounter": {
- "1": "歸根結底,普普通通就是最強。"
- },
- "victory": {
- "1": "哼,給我上了一道“戰敗”。"
- },
- "defeat": {
- "1": "下班打卡,走了"
- }
- },
- "ryme": {
- "encounter": {
- "1": "寶貝, 一起! \n搖滾搖到骨子裡!"
- },
- "victory": {
- "1": "你好酷!我佩服!\n我的靈魂為你哭!"
- },
- "defeat": {
- "1": "再會, 寶貝!"
- }
- },
- "grusha": {
- "encounter": {
- "1": "我保證我寶可夢的力量\n會讓你感到寒冷徹骨!"
- },
- "victory": {
- "1": "你燃燒的熱情……老實說,我有點喜歡。"
- },
- "defeat": {
- "1": "你沒有升溫。"
- }
- },
- "marnie_elite": {
- "encounter": {
- "1": "你已經走到這一步了?$哼~ 看看你能不能對付我的寶可夢!",
- "2": "我將全力以赴, 別覺得我會手下留情哦~"
- },
- "victory": {
- "1": "不敢相信…我輸掉了… $但是你確實贏得好,幹得漂亮捏~",
- "2": "看來我還要多多學習呀,\n不過你打得很不錯哦~"
- },
- "defeat": {
- "1": "你打得不錯,但是我更勝一籌!$祝你下次好運啦~",
- "2": "看來我的練習有所回報了。\n感謝一戰!"
- }
- },
- "nessa_elite": {
- "encounter": {
- "1": "海流正在朝著對我有利的方向轉變。$準備好被捲走了嗎?",
- "2": "讓我們在這場戰鬥中掀起波瀾!$我希望你做好準備!"
- },
- "victory": {
- "1": "你完美地渡過了這片水域......幹得好!",
- "2": "看來我現在無法與你匹敵。幹得好!"
- },
- "defeat": {
- "1": "水總能找到出路。\n真是爽快的一戰!",
- "2": "你打得很好,\n但海洋的力量是不可阻擋的!"
- }
- },
- "bea_elite": {
- "encounter": {
- "1": "做好準備!我的鬥志熊熊燃燒!",
- "2": "讓我們看看你是否能跟上我永不停歇的節奏!"
- },
- "victory": {
- "1": "你的實力......令人印象深刻。\n你真的值得這場勝利。",
- "2": "我以前從未感受過這種強度。\n太棒了!"
- },
- "defeat": {
- "1": "我的高強度訓練又帶來勝利了!\n幹得好!",
- "2": "你有實力,但我的訓練更努力。\n精彩的戰鬥!"
- }
- },
- "allister_elite": {
- "encounter": {
- "1": "黑暗降臨...你準備好面對你的恐懼了嗎?",
- "2": "讓我們看看你能否應對我所操控的黑暗。"
- },
- "victory": {
- "1": "你已經驅散了陰影......\n暫時。幹得很好。",
- "2": "你的光芒刺穿了我的黑暗。幹得好。"
- },
- "defeat": {
- "1": "黑影在輕語...\n你的力量還不夠。",
- "2": "黑暗獲勝了......\n也許下次你會看到光明。"
- }
- },
- "raihan_elite": {
- "encounter": {
- "1": "風暴來臨!你能挺過這場戰鬥嗎!",
- "2": "準備好面對風暴之眼!"
- },
- "victory": {
- "1": "你戰勝了風暴...難以置信!",
- "2": "你完美地駕馭了風……打得好!"
- },
- "defeat": {
- "1": "又一場風暴襲來,又一場勝利!打得好!",
- "2": "你被我的風暴捲入了!祝你下次好運!"
- }
- },
- "alder": {
- "encounter": {
- "1": "準備好和合眾最強的訓練家交手吧!"
- },
- "victory": {
- "1": "精彩!簡直就是天下無雙!"
- },
- "defeat": {
- "1": "戰鬥結束後,我的心像是吹過了溫和的風…\n$真是厲害!"
- }
- },
- "kieran": {
- "encounter": {
- "1": "我的努力讓我越來越強!\n$所以我不會輸。"
- },
- "victory": {
- "1": "不可能…\n$真是一場有趣又激動人心的戰鬥啊!"
- },
- "defeat": {
- "1": "哇塞,好一場戰鬥!\n$你得多練練了。"
- }
- },
- "rival": {
- "encounter": {
- "1": "@c{smile}嘿,我在找你呢!我知道你急著上路,\n但至少說個再見吧…$@c{smile_eclosed}所以你終於要開始追逐夢想了?\n我幾乎不敢相信。$@c{serious_smile_fists}來都來了,來一場對戰怎麼樣?\n畢竟,我想看看你是不是準備周全了。$@c{serious_mopen_fists}不要手下留情,我想讓你全力以赴!"
- },
- "victory": {
- "1": "@c{shock}哇…你徹底擊敗了我。\n你是真初學者嗎?$@c{smile}也許是靠點運氣,但是…\n誰知道,你可能真的能一路走下去。$順便說一下,博士讓我給你這些東西。它們看起來可牛了。$@c{serious_smile_fists}祝你好运!"
- }
- },
- "rival_female": {
- "encounter": {
- "1": "@c{smile_wave}你在這兒啊!我到處找你呢!$@c{angry_mopen}你忘了和你最好的朋友說再見了嗎?$@c{smile_ehalf}你要去追逐夢想了,對吧?\n從今天開始,是不是…$@c{smile}不管怎樣,忘了我的事就原諒你吧,\n但有個條件。@c{smile_wave_wink}你必須和我對戰!$@c{angry_mopen}全力以赴!\n你也不想讓你的冒險在開始之前就結束了,對吧?"
- },
- "victory": {
- "1": "@c{shock}你剛開始就已經這麼強了?!@d{96}$@c{angry}你是不是開了?$@c{smile_wave_wink}只是開個玩笑啦!@d{64} @c{smile_eclosed}我輸地心服口服了…\n我感覺你出去挺有天賦的。$@c{smile}順便說一下,博士想讓我給你一些東西。\n希望它們能幫上忙!$@c{smile_wave}像往常一樣盡力而為!\n我相信你!"
- }
- },
- "rival_2": {
- "encounter": {
- "1": "@c{smile}嘿,你也在這裡嗎?$@c{smile_eclosed}一路過關斬將,是吧?$@c{serious_mopen_fists}我知道看起來好像我尾隨著你來到這裡,\n怎麼可能啦。$@c{serious_smile_fists}說真的,自從你在老家打敗我後,\n我就一直很渴望再比一場。$我自己也進行了很多訓練,\n所以這次我肯定會好好打一場。$@c{serious_mopen_fists}不要手下留情,就像以前一樣!$讓我們開始吧!"
- },
- "victory": {
- "1": "@c{neutral_eclosed}哦。我過於自信了。$@c{smile}不過沒關係。我猜到可能會這樣。$@c{serious_mopen_fists}這只意味著我下次需要更努力!$$@c{smile}呃,不是特意幫你,我正好有多餘的這個,\n我覺得你可能想要。$$@c{serious_smile_fists}不過這次之後別指望再有了!$我不能一直給我的對手優勢。$@c{smile}反正,保重!"
- }
- },
- "rival_2_female": {
- "encounter": {
- "1": "@c{smile_wave}哦,真巧,在這裡遇見你。\n看來你還沒輸過嘛。@c{angry_mopen}哈……好傢伙!$@c{angry_mopen}我知道你在想什麼,\n不,我才不會跟蹤你什麼呢。 @c{smile_eclosed}我只是碰巧在附近。$@c{smile_ehalf}我為你感到高興,但我只想讓你知道\n有時輸了是可以接受的。$@c{smile}我們從錯誤中學到的東西\n往往比我們一直成功時學到的還要多。$@c{angry_mopen}無論如何,我為了我們的複賽已經努力訓練了\n所以你最好全力以赴!"
- },
- "victory": {
- "1": "@c{neutral}我……沒打算會輸來著……$@c{smile}嗷……好吧。看來我要再更加努力訓練了!$@c{smile_wave}我還給你帶了個這個$@c{smile_wave_wink}不用謝我哦~.$@c{angry_mopen}不過,這是最後一個啦!\n 你可別想再從我這賺小便宜了~$@c{smile_wave}要保重哦!"
- },
- "defeat": {
- "1": "輸了有時候也不要緊的…"
- }
- },
- "rival_3": {
- "encounter": {
- "1": "@c{smile}嘿,看看這是誰!好久不見啊。$@c{neutral}你……還是沒輸過?哈…$@c{neutral_eclosed}這有點……不太對勁。$沒有你一起,回家的感覺有很不一樣。$@c{serious}雖然我知道這挺別扭的,但我就直說了。$@c{neutral_eclosed}我覺得你有點兒難以理解。$@c{serious}沒有人能夠戰無不勝。$失敗乃成功之母。$@c{neutral_eclosed}你已經贏得了夠好的成績,\n但前面道阻且長,只會愈發艱難。 @c{neutral}你做好準備了沒?$@c{serious_mopen_fists}如果做好了,證明給我看吧。"
- },
- "victory": {
- "1": "@c{angry_mhalf}這太離譜了……我幾乎從沒停下訓練……$我們之間的差距怎麼還是這麼大?"
- }
- },
- "rival_3_female": {
- "encounter": {
- "1": "@c{smile_wave}好久不見!還沒輸過,對吧。$@c{angry}我覺得你點煩了。@c{smile_wave_wink}開玩笑啦!$@c{smile_ehalf}但說真的,你現在不想家嗎?\n 不想…我嗎?$我……我的意思是,我們真的很想你。$@c{smile_eclosed}我支持你的一切,包括你的夢想。\n但現實就是你早晚會經歷失敗。$@c{smile}當你失敗的時候,我想像往常一樣陪在你身邊。$@c{angry_mopen}現在,給你看看我變得多強了吧!"
- },
- "victory": {
- "1": "@c{shock}都這樣了……還是不夠嗎?$這樣下去,你就永遠不會回來了……"
- },
- "defeat": {
- "1": "你盡力了,現在讓我們回家吧。"
- }
- },
- "rival_4": {
- "encounter": {
- "1": "@c{neutral}嘿。$我不會對你說什麼拐彎抹角的客套話。$@c{neutral_eclosed}我來,就是為了贏,簡單明了。$@c{serious_mhalf_fists}我將所有時間都投入到訓練中,\n掌握了如何發揮我的潛力。$@c{smile}當你削減掉不必要的睡眠和社交後,\n你會得到很多額外的時間。$@c{serious_mopen_fists}但在我獲勝之前,這些都不重要了。$@c{neutral_eclosed}我甚至已經到達了戰無不敗的境地。$@c{smile_eclosed}我覺得你的思路倒是也沒毛病。$@c{angry_mhalf}失敗是屬於弱者的,\n我已經不再軟弱了。$@c{serious_mopen_fists}準備好吧。"
- },
- "victory": {
- "1": "@c{neutral}你…@d{64} 你是人嗎?"
- }
- },
- "rival_4_female": {
- "encounter": {
- "1": "@c{neutral}是我哦!沒又把我忘了吧……是嗎?$@c{smile}你應該為自己走了這麼遠感到驕傲。恭喜你!$但看來你的旅程到此為止了。$@c{smile_eclosed}你喚醒了我體內一些我從未有過的東西。\n就像我現在滿腦子除了訓練還是訓練。$@c{smile_ehalf}我幾乎已經沒空吃飯睡覺了,\n我沒日沒夜訓練我的寶可夢,每次都能變得更強。$@c{neutral}事實上,我……幾乎不認識自己了。$現在,我終於達到了巔峰。\n我感覺我已經戰無不勝了。$而且你知道嗎?這一切都是因為你。$@c{smile_ehalf}我不知道到底是該感謝你還是恨你。$@c{angry_mopen}做好準備…"
- },
- "victory": {
- "1": "@c{neutral}你…@d{64} 你是人嗎?"
- },
- "defeat": {
- "1": "@c{smile}你應該為自己走了這麼遠感到驕傲。"
- }
- },
- "rival_5": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- }
- },
- "rival_5_female": {
- "encounter": {
- "1": "@c{neutral}…"
- },
- "victory": {
- "1": "@c{neutral}…"
- },
- "defeat": {
- "1": "$@c{smile_ehalf}…"
- }
- },
- "rival_6": {
- "encounter": {
- "1": "@c{smile_eclosed}又見面了。$@c{neutral}我花了點時間思考反思\n有理由說明為什麼這一切都顯得如此奇妙。$@c{neutral_eclosed}你所追逐的夢想,我想擊敗你的決心…$這都是某種龐大使命的一部分。$@c{serious}這不僅僅是關於我和你… 而是關於這個世界, @c{serious_mhalf_fists}我的使命就是將你推向極限。$@c{neutral_eclosed}我是否達成了那個使命,我說不上來,但我已盡我所能。$@c{neutral}我們最終到達的這個地方看起來很可怕\n 然而不知何故,我心中毫無畏懼,好像我早就來過這裡。$@c{serious_mhalf_fists}你也有同樣的感覺,對吧?$@c{serious}……這裡好像有什麼東西在呼喚我。\n這是世界早已記錄的一切。$那些我們經歷過的時光,那些記憶猶新的過去,\n其實只是遙遠的回憶。$@c{neutral_eclosed}誰能保證它們是否真的發生過。$@c{serious_mopen_fists}你必須繼續前進,不然的話,這一切將永無止境。\n這件事而只有你能辦成。$@c{serious_smile_fists}我不清楚這一切意味著什麼,但我知道……$@c{serious_mopen_fists}如果現在你不能就此擊敗我,\n你將毫無機會可言。"
- },
- "victory": {
- "1": "@c{smile_eclosed}看來我的使命在這裡已經完成了。\n我想讓你答應我一件事。$@c{smile}在你拯救世界之後,要回家。"
- }
- },
- "rival_6_female": {
- "encounter": {
- "1": "@c{smile_ehalf}又只有我們兩個人了。$@c{smile_eclosed}你知道嗎,我在心裡想啊想,\n想了好久……$@c{smile_ehalf}這一切背後是有什麼原因嗎,\n為什麼一切現在看起來都這麼奇怪……$@c{smile}你有你的夢想,而我內心有這個抱負……$我不禁感覺這一切背後有一個更龐大的力量,$掌控者我們所做的一切,你和我之間。$@c{smile_eclosed}我想我注定要推動你……到你的極限。$@c{smile_ehalf}我不清楚我是否一直做得很好,\n但到現在為止,我已經盡力了。$這個奇怪而可怕的地方……\n一切看起來都那麼清晰……$這是世界早已記錄的一切。$@c{smile_eclosed}我好像記不清我們一起度過的日子了。$@c{smile_ehalf}那些回憶到底是真的嗎?\n怎麼感覺這麼久遠……$@c{angry_mopen}你得繼續前進,不然的話,這一切將永無止境。\n你是唯一能做到這件事的。$@c{smile_ehalf}我……不知道這一切意味著什麼……\n但我明白$@c{neutral}如果你現在不能就此擊敗我,\n你將毫無機會可言。"
- },
- "victory": {
- "1": "@c{smile_ehalf}我……\n我想我完成了我的使命……$@c{smile_eclosed}答應我……在你拯救世界之後\n……要……平安到家。$@c{smile_ehalf}……謝謝你。"
- }
- }
-}
\ No newline at end of file
diff --git a/src/locales/zh_TW/dialogue-misc-female.json b/src/locales/zh_TW/dialogue-misc-female.json
deleted file mode 100644
index 24e2109e5b3..00000000000
--- a/src/locales/zh_TW/dialogue-misc-female.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話",
- "ending_female": "@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。\n$@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。\n$@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒!\n$@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。\n$@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~"
-}
\ No newline at end of file
diff --git a/src/locales/zh_TW/dialogue-misc-male.json b/src/locales/zh_TW/dialogue-misc-male.json
deleted file mode 100644
index 24e2109e5b3..00000000000
--- a/src/locales/zh_TW/dialogue-misc-male.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "ending": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話",
- "ending_female": "@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。\n$@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。\n$@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒!\n$@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。\n$@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~"
-}
\ No newline at end of file
diff --git a/src/locales/zh_TW/dialogue-misc.json b/src/locales/zh_TW/dialogue-misc.json
new file mode 100644
index 00000000000..408bcac546b
--- /dev/null
+++ b/src/locales/zh_TW/dialogue-misc.json
@@ -0,0 +1,4 @@
+{
+ "ending": "@c{shock}你回來了?@d{32} 也就是說…@d{96} 你贏了呀!?\n@c{smile_ehalf}我應該早料到了。\n$@c{smile_eclosed}當然…我一直有這種感覺\n@c{smile}一切都結束了,對麼? 你打破了循環。\n$@c{smile_ehalf}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$我是唯一能夠記得你所作所為的人\n@c{angry_mopen}我會努力不忘掉哒!\n$@c{smile_wave_wink}開玩笑啦,@d{64} @c{smile}我才不會忘呢。@d{32}\n你的傳奇將永遠留存於我們心中。\n$@c{smile_wave}不管了,@d{64} 時候不早了@d{96} ,應該吧?\n在這地方還真搞不清楚。\n$一起回家吧。 @c{smile_wave_wink}可能明天,我們再來打一場,為了重溫回憶嘛~",
+ "ending_female": "@c{smile}哦?你贏了?@d{96} @c{smile_eclosed}我應該早猜到了\n你回來了。\n$@c{smile}結束了。@d{64} 你終結了這個循環。\n$@c{serious_smile_fists}你也完成了自己的夢想,不是嗎?\n你甚至一次都沒失敗。\n$@c{neutral}我是唯一能夠記得你所作所為的人@d{96}\n我覺得這應該也還行吧?\n$@c{serious_smile_fists}你的傳奇將永遠留存於我們心中。\n$@c{smile_eclosed}不管了,我真是受夠這個地方了,你也一樣嗎?我們回家吧。\n$@c{serious_smile_fists}可能等我們回家以後,再打一場?\n要是你想的話"
+}
diff --git a/src/locales/zh_TW/dialogue-female.json b/src/locales/zh_TW/dialogue.json
similarity index 100%
rename from src/locales/zh_TW/dialogue-female.json
rename to src/locales/zh_TW/dialogue.json
diff --git a/src/locales/zh_TW/modifier-type.json b/src/locales/zh_TW/modifier-type.json
index a7ddaea077b..68881a206cb 100644
--- a/src/locales/zh_TW/modifier-type.json
+++ b/src/locales/zh_TW/modifier-type.json
@@ -49,8 +49,8 @@
"DoubleBattleChanceBoosterModifierType": {
"description": "接下來的{{battleCount}}場戰鬥是雙打的概率翻倍。"
},
- "TempBattleStatBoosterModifierType": {
- "description": "爲所有成員寶可夢提升一級{{tempBattleStatName}},持續5場戰鬥。"
+ "TempStatStageBoosterModifierType": {
+ "description": "爲所有成員寶可夢提升一級{{stat}},持續5場戰鬥。"
},
"AttackTypeBoosterModifierType": {
"description": "一隻寶可夢的{{moveType}}系招式威力提升20%。"
@@ -61,8 +61,8 @@
"AllPokemonLevelIncrementModifierType": {
"description": "Increases all party members' level by {{levels}}."
},
- "PokemonBaseStatBoosterModifierType": {
- "description": "增加持有者的{{statName}}10%,個體值越高堆疊\n上限越高。"
+ "BaseStatBoosterModifierType": {
+ "description": "增加持有者的{{stat}}10%,個體值越高堆疊\n上限越高。"
},
"AllPokemonFullHpRestoreModifierType": {
"description": "所有寶可夢完全恢復HP。"
@@ -244,6 +244,12 @@
"name": "焦點鏡",
"description": "能看見弱點的鏡片。攜帶它的寶可夢的招式 會變得容易擊中要害。"
},
+ "DIRE_HIT": {
+ "name": "要害攻擊",
+ "extra": {
+ "raises": "會心"
+ }
+ },
"LEEK": {
"name": "大蔥",
"description": "非常長且堅硬的莖。讓大蔥鴨攜帶後,招式會 變得容易擊中要害。"
@@ -407,25 +413,13 @@
"description": "讓百變怪攜帶後,速度就會提高的神奇粉末。非常細緻堅硬。"
}
},
- "TempBattleStatBoosterItem": {
+ "TempStatStageBoosterItem": {
"x_attack": "力量強化",
"x_defense": "防禦強化",
"x_sp_atk": "特攻強化",
"x_sp_def": "特防強化",
"x_speed": "速度強化",
- "x_accuracy": "命中強化",
- "dire_hit": "要害攻擊"
- },
- "TempBattleStatBoosterStatName": {
- "ATK": "攻擊",
- "DEF": "防禦",
- "SPATK": "特攻",
- "SPDEF": "特防",
- "SPD": "速度",
- "ACC": "命中",
- "CRIT": "會心",
- "EVA": "閃避",
- "DEFAULT": "???"
+ "x_accuracy": "命中強化"
},
"AttackTypeBoosterItem": {
"silk_scarf": "絲綢圍巾",
@@ -600,6 +594,6 @@
"DRAGON_MEMORY": "龍記憶碟",
"DARK_MEMORY": "黑暗記憶碟",
"FAIRY_MEMORY": "妖精記憶碟",
- "BLANK_MEMORY": "空白記憶碟"
+ "NORMAL_MEMORY": "一般記憶碟"
}
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/modifier.json b/src/locales/zh_TW/modifier.json
index eb4b5107cff..1c0d4760e6f 100644
--- a/src/locales/zh_TW/modifier.json
+++ b/src/locales/zh_TW/modifier.json
@@ -8,4 +8,4 @@
"contactHeldItemTransferApply": "{{pokemonNameWithAffix}}的{{itemName}}被\n{{pokemonName}}的{{typeName}}奪取了!",
"enemyTurnHealApply": "{{pokemonNameWithAffix}}\n回復了一些體力!",
"bypassSpeedChanceApply": "{{pokemonName}}用了{{itemName}}後,行動變快了!"
-}
\ No newline at end of file
+}
diff --git a/src/locales/zh_TW/move-trigger.json b/src/locales/zh_TW/move-trigger.json
index 03ca6841a7f..d6d0ce659ea 100644
--- a/src/locales/zh_TW/move-trigger.json
+++ b/src/locales/zh_TW/move-trigger.json
@@ -3,6 +3,10 @@
"cutHpPowerUpMove": "{{pokemonName}}\n削減體力並提升了招式威力!",
"absorbedElectricity": "{{pokemonName}}\n吸收了电力!",
"switchedStatChanges": "{{pokemonName}}和對手互換了\n自身的能力變化!",
+ "switchedTwoStatChanges": "{{pokemonName}} 和對手互換了自身的{{firstStat}}和{{secondStat}}的能力變化!",
+ "switchedStat": "{{pokemonName}} 互換了各自的{{stat}}!",
+ "sharedGuard": "{{pokemonName}} 平分了各自的防守!",
+ "sharedPower": "{{pokemonName}} 平分了各自的力量!",
"goingAllOutForAttack": "{{pokemonName}}拿出全力了!",
"regainedHealth": "{{pokemonName}}的\n體力回復了!",
"keptGoingAndCrashed": "{{pokemonName}}因勢頭過猛\n而撞到了地面!",
@@ -61,5 +65,6 @@
"suppressAbilities": "{{pokemonName}}的特性\n變得無效了!",
"revivalBlessing": "{{pokemonName}}復活了!",
"swapArenaTags": "{{pokemonName}}\n交換了雙方的場地效果!",
- "exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!"
+ "exposedMove": "{{pokemonName}}識破了\n{{targetPokemonName}}的原形!",
+ "safeguard": "{{targetName}}\n正受到神秘之幕的保護!"
}
\ No newline at end of file
diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts
index 938f73a1e08..fe586074c79 100644
--- a/src/modifier/modifier-type.ts
+++ b/src/modifier/modifier-type.ts
@@ -3,12 +3,10 @@ import { AttackMove, allMoves, selfStatLowerMoves } from "../data/move";
import { MAX_PER_TYPE_POKEBALLS, PokeballType, getPokeballCatchMultiplier, getPokeballName } from "../data/pokeball";
import Pokemon, { EnemyPokemon, PlayerPokemon, PokemonMove } from "../field/pokemon";
import { EvolutionItem, pokemonEvolutions } from "../data/pokemon-evolutions";
-import { Stat, getStatName } from "../data/pokemon-stat";
import { tmPoolTiers, tmSpecies } from "../data/tms";
import { Type } from "../data/type";
import PartyUiHandler, { PokemonMoveSelectFilter, PokemonSelectFilter } from "../ui/party-ui-handler";
import * as Utils from "../utils";
-import { TempBattleStat, getTempBattleStatBoosterItemName, getTempBattleStatName } from "../data/temp-battle-stat";
import { getBerryEffectDescription, getBerryName } from "../data/berry";
import { Unlockables } from "../system/unlockables";
import { StatusEffect, getStatusEffectDescriptor } from "../data/status-effect";
@@ -28,6 +26,7 @@ import { BerryType } from "#enums/berry-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { getPokemonNameWithAffix } from "#app/messages.js";
+import { PermanentStat, TEMP_BATTLE_STATS, TempBattleStat, Stat, getStatKey } from "#app/enums/stat";
const outputModifierData = false;
const useMaxWeightForOutput = false;
@@ -447,26 +446,28 @@ export class DoubleBattleChanceBoosterModifierType extends ModifierType {
}
}
-export class TempBattleStatBoosterModifierType extends ModifierType implements GeneratedPersistentModifierType {
- public tempBattleStat: TempBattleStat;
+export class TempStatStageBoosterModifierType extends ModifierType implements GeneratedPersistentModifierType {
+ private stat: TempBattleStat;
+ private key: string;
- constructor(tempBattleStat: TempBattleStat) {
- super("", getTempBattleStatBoosterItemName(tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase(),
- (_type, _args) => new Modifiers.TempBattleStatBoosterModifier(this, this.tempBattleStat));
+ constructor(stat: TempBattleStat) {
+ const key = TempStatStageBoosterModifierTypeGenerator.items[stat];
+ super("", key, (_type, _args) => new Modifiers.TempStatStageBoosterModifier(this, this.stat));
- this.tempBattleStat = tempBattleStat;
+ this.stat = stat;
+ this.key = key;
}
get name(): string {
- return i18next.t(`modifierType:TempBattleStatBoosterItem.${getTempBattleStatBoosterItemName(this.tempBattleStat).replace(/\./g, "").replace(/[ ]/g, "_").toLowerCase()}`);
+ return i18next.t(`modifierType:TempStatStageBoosterItem.${this.key}`);
}
- getDescription(scene: BattleScene): string {
- return i18next.t("modifierType:ModifierType.TempBattleStatBoosterModifierType.description", { tempBattleStatName: getTempBattleStatName(this.tempBattleStat) });
+ getDescription(_scene: BattleScene): string {
+ return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)) });
}
getPregenArgs(): any[] {
- return [ this.tempBattleStat ];
+ return [ this.stat ];
}
}
@@ -611,40 +612,24 @@ export class AllPokemonLevelIncrementModifierType extends ModifierType {
}
}
-function getBaseStatBoosterItemName(stat: Stat) {
- switch (stat) {
- case Stat.HP:
- return "HP Up";
- case Stat.ATK:
- return "Protein";
- case Stat.DEF:
- return "Iron";
- case Stat.SPATK:
- return "Calcium";
- case Stat.SPDEF:
- return "Zinc";
- case Stat.SPD:
- return "Carbos";
- }
-}
+export class BaseStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType {
+ private stat: PermanentStat;
+ private key: string;
-export class PokemonBaseStatBoosterModifierType extends PokemonHeldItemModifierType implements GeneratedPersistentModifierType {
- private localeName: string;
- private stat: Stat;
+ constructor(stat: PermanentStat) {
+ const key = BaseStatBoosterModifierTypeGenerator.items[stat];
+ super("", key, (_type, args) => new Modifiers.BaseStatModifier(this, (args[0] as Pokemon).id, this.stat));
- constructor(localeName: string, stat: Stat) {
- super("", localeName.replace(/[ \-]/g, "_").toLowerCase(), (_type, args) => new Modifiers.PokemonBaseStatModifier(this, (args[0] as Pokemon).id, this.stat));
-
- this.localeName = localeName;
this.stat = stat;
+ this.key = key;
}
get name(): string {
- return i18next.t(`modifierType:BaseStatBoosterItem.${this.localeName.replace(/[ \-]/g, "_").toLowerCase()}`);
+ return i18next.t(`modifierType:BaseStatBoosterItem.${this.key}`);
}
- getDescription(scene: BattleScene): string {
- return i18next.t("modifierType:ModifierType.PokemonBaseStatBoosterModifierType.description", { statName: getStatName(this.stat) });
+ getDescription(_scene: BattleScene): string {
+ return i18next.t("modifierType:ModifierType.BaseStatBoosterModifierType.description", { stat: i18next.t(getStatKey(this.stat)) });
}
getPregenArgs(): any[] {
@@ -791,10 +776,10 @@ export class EvolutionItemModifierType extends PokemonModifierType implements Ge
super("", EvolutionItem[evolutionItem].toLowerCase(), (_type, args) => new Modifiers.EvolutionItemModifier(this, (args[0] as PlayerPokemon).id),
(pokemon: PlayerPokemon) => {
if (pokemonEvolutions.hasOwnProperty(pokemon.species.speciesId) && pokemonEvolutions[pokemon.species.speciesId].filter(e => e.item === this.evolutionItem
- && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === pokemon.getFormKey())).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) {
+ && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFormKey())).length && (pokemon.getFormKey() !== SpeciesFormKey.GIGANTAMAX)) {
return null;
} else if (pokemon.isFusion() && pokemon.fusionSpecies && pokemonEvolutions.hasOwnProperty(pokemon.fusionSpecies.speciesId) && pokemonEvolutions[pokemon.fusionSpecies.speciesId].filter(e => e.item === this.evolutionItem
- && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) {
+ && (!e.condition || e.condition.predicate(pokemon)) && (e.preFormKey === null || e.preFormKey === pokemon.getFusionFormKey())).length && (pokemon.getFusionFormKey() !== SpeciesFormKey.GIGANTAMAX)) {
return null;
}
@@ -922,6 +907,48 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator {
}
}
+class BaseStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
+ public static readonly items: Record = {
+ [Stat.HP]: "hp_up",
+ [Stat.ATK]: "protein",
+ [Stat.DEF]: "iron",
+ [Stat.SPATK]: "calcium",
+ [Stat.SPDEF]: "zinc",
+ [Stat.SPD]: "carbos"
+ };
+
+ constructor() {
+ super((_party: Pokemon[], pregenArgs?: any[]) => {
+ if (pregenArgs) {
+ return new BaseStatBoosterModifierType(pregenArgs[0]);
+ }
+ const randStat: PermanentStat = Utils.randSeedInt(Stat.SPD + 1);
+ return new BaseStatBoosterModifierType(randStat);
+ });
+ }
+}
+
+class TempStatStageBoosterModifierTypeGenerator extends ModifierTypeGenerator {
+ public static readonly items: Record = {
+ [Stat.ATK]: "x_attack",
+ [Stat.DEF]: "x_defense",
+ [Stat.SPATK]: "x_sp_atk",
+ [Stat.SPDEF]: "x_sp_def",
+ [Stat.SPD]: "x_speed",
+ [Stat.ACC]: "x_accuracy"
+ };
+
+ constructor() {
+ super((_party: Pokemon[], pregenArgs?: any[]) => {
+ if (pregenArgs && (pregenArgs.length === 1) && TEMP_BATTLE_STATS.includes(pregenArgs[0])) {
+ return new TempStatStageBoosterModifierType(pregenArgs[0]);
+ }
+ const randStat: TempBattleStat = Utils.randSeedInt(Stat.ACC, Stat.ATK);
+ return new TempStatStageBoosterModifierType(randStat);
+ });
+ }
+}
+
/**
* Modifier type generator for {@linkcode SpeciesStatBoosterModifierType}, which
* encapsulates the logic for weighting the most useful held item from
@@ -930,7 +957,7 @@ class AttackTypeBoosterModifierTypeGenerator extends ModifierTypeGenerator {
*/
class SpeciesStatBoosterModifierTypeGenerator extends ModifierTypeGenerator {
/** Object comprised of the currently available species-based stat boosting held items */
- public static items = {
+ public static readonly items = {
LIGHT_BALL: { stats: [Stat.ATK, Stat.SPATK], multiplier: 2, species: [Species.PIKACHU] },
THICK_CLUB: { stats: [Stat.ATK], multiplier: 2, species: [Species.CUBONE, Species.MAROWAK, Species.ALOLA_MAROWAK] },
METAL_POWDER: { stats: [Stat.DEF], multiplier: 2, species: [Species.DITTO] },
@@ -1043,7 +1070,7 @@ class EvolutionItemModifierTypeGenerator extends ModifierTypeGenerator {
}
class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
- constructor() {
+ constructor(rare: boolean) {
super((party: Pokemon[], pregenArgs?: any[]) => {
if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in FormChangeItem)) {
return new FormChangeItemModifierType(pregenArgs[0] as FormChangeItem);
@@ -1083,7 +1110,8 @@ class FormChangeItemModifierTypeGenerator extends ModifierTypeGenerator {
}
}
return formChangeItemTriggers;
- }).flat().flatMap(fc => fc.item))];
+ }).flat())
+ ].flat().flatMap(fc => fc.item).filter(i => (i && i < 100) === rare);
// 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) {
@@ -1232,7 +1260,7 @@ export type GeneratorModifierOverride = {
type?: SpeciesStatBoosterItem;
}
| {
- name: keyof Pick;
+ name: keyof Pick;
type?: TempBattleStat;
}
| {
@@ -1282,7 +1310,8 @@ export const modifierTypes = {
EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(false),
RARE_EVOLUTION_ITEM: () => new EvolutionItemModifierTypeGenerator(true),
- FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(),
+ FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(false),
+ RARE_FORM_CHANGE_ITEM: () => new FormChangeItemModifierTypeGenerator(true),
MEGA_BRACELET: () => new ModifierType("modifierType:ModifierType.MEGA_BRACELET", "mega_bracelet", (type, _args) => new Modifiers.MegaEvolutionAccessModifier(type)),
DYNAMAX_BAND: () => new ModifierType("modifierType:ModifierType.DYNAMAX_BAND", "dynamax_band", (type, _args) => new Modifiers.GigantamaxAccessModifier(type)),
@@ -1304,7 +1333,7 @@ export const modifierTypes = {
SACRED_ASH: () => new AllPokemonFullReviveModifierType("modifierType:ModifierType.SACRED_ASH", "sacred_ash"),
REVIVER_SEED: () => new PokemonHeldItemModifierType("modifierType:ModifierType.REVIVER_SEED", "reviver_seed", (type, args) => new Modifiers.PokemonInstantReviveModifier(type, (args[0] as Pokemon).id)),
- WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new Modifiers.PokemonResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)),
+ WHITE_HERB: () => new PokemonHeldItemModifierType("modifierType:ModifierType.WHITE_HERB", "white_herb", (type, args) => new Modifiers.ResetNegativeStatStageModifier(type, (args[0] as Pokemon).id)),
ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.ETHER", "ether", 10),
MAX_ETHER: () => new PokemonPpRestoreModifierType("modifierType:ModifierType.MAX_ETHER", "max_ether", -1),
@@ -1325,23 +1354,15 @@ export const modifierTypes = {
SPECIES_STAT_BOOSTER: () => new SpeciesStatBoosterModifierTypeGenerator(),
- TEMP_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
- if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in TempBattleStat)) {
- return new TempBattleStatBoosterModifierType(pregenArgs[0] as TempBattleStat);
- }
- const randTempBattleStat = Utils.randSeedInt(6) as TempBattleStat;
- return new TempBattleStatBoosterModifierType(randTempBattleStat);
- }),
- DIRE_HIT: () => new TempBattleStatBoosterModifierType(TempBattleStat.CRIT),
+ TEMP_STAT_STAGE_BOOSTER: () => new TempStatStageBoosterModifierTypeGenerator(),
- BASE_STAT_BOOSTER: () => new ModifierTypeGenerator((party: Pokemon[], pregenArgs?: any[]) => {
- if (pregenArgs && (pregenArgs.length === 1) && (pregenArgs[0] in Stat)) {
- const stat = pregenArgs[0] as Stat;
- return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(stat), stat);
+ DIRE_HIT: () => new class extends ModifierType {
+ getDescription(_scene: BattleScene): string {
+ return i18next.t("modifierType:ModifierType.TempStatStageBoosterModifierType.description", { stat: i18next.t("modifierType:ModifierType.DIRE_HIT.extra.raises") });
}
- const randStat = Utils.randSeedInt(6) as Stat;
- return new PokemonBaseStatBoosterModifierType(getBaseStatBoosterItemName(randStat), randStat);
- }),
+ }("modifierType:ModifierType.DIRE_HIT", "dire_hit", (type, _args) => new Modifiers.TempCritBoosterModifier(type)),
+
+ BASE_STAT_BOOSTER: () => new BaseStatBoosterModifierTypeGenerator(),
ATTACK_TYPE_BOOSTER: () => new AttackTypeBoosterModifierTypeGenerator(),
@@ -1511,7 +1532,7 @@ const modifierPool: ModifierPool = {
return thresholdPartyMemberCount;
}, 3),
new WeightedModifierType(modifierTypes.LURE, skipInLastClassicWaveOrDefault(2)),
- new WeightedModifierType(modifierTypes.TEMP_STAT_BOOSTER, 4),
+ new WeightedModifierType(modifierTypes.TEMP_STAT_STAGE_BOOSTER, 4),
new WeightedModifierType(modifierTypes.BERRY, 2),
new WeightedModifierType(modifierTypes.TM_COMMON, 2),
].map(m => {
@@ -1595,6 +1616,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.PP_MAX, 3),
new WeightedModifierType(modifierTypes.MINT, 4),
new WeightedModifierType(modifierTypes.RARE_EVOLUTION_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 15) * 4, 32), 32),
+ new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
new WeightedModifierType(modifierTypes.AMULET_COIN, skipInLastClassicWaveOrDefault(3)),
new WeightedModifierType(modifierTypes.EVIOLITE, (party: Pokemon[]) => {
if (!party[0].scene.gameMode.isFreshStartChallenge() && party[0].scene.gameData.unlocks[Unlockables.EVIOLITE]) {
@@ -1623,7 +1645,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.WHITE_HERB, (party: Pokemon[]) => {
const checkedAbilities = [Abilities.WEAK_ARMOR, Abilities.CONTRARY, Abilities.MOODY, Abilities.ANGER_SHELL, Abilities.COMPETITIVE, Abilities.DEFIANT];
const weightMultiplier = party.filter(
- p => !p.getHeldItems().some(i => i instanceof Modifiers.PokemonResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) &&
+ p => !p.getHeldItems().some(i => i instanceof Modifiers.ResetNegativeStatStageModifier && i.stackCount >= i.getMaxHeldItemCount(p)) &&
(checkedAbilities.some(a => p.hasAbility(a, false, true)) || p.getMoveset(true).some(m => m && selfStatLowerMoves.includes(m.moveId)))).length;
// If a party member has one of the above moves or abilities and doesn't have max herbs, the herb will appear more frequently
return 0 * (weightMultiplier ? 2 : 1) + (weightMultiplier ? weightMultiplier * 0 : 0);
@@ -1661,7 +1683,7 @@ const modifierPool: ModifierPool = {
new WeightedModifierType(modifierTypes.KINGS_ROCK, 3),
new WeightedModifierType(modifierTypes.LOCK_CAPSULE, skipInLastClassicWaveOrDefault(3)),
new WeightedModifierType(modifierTypes.SUPER_EXP_CHARM, skipInLastClassicWaveOrDefault(8)),
- new WeightedModifierType(modifierTypes.FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
+ new WeightedModifierType(modifierTypes.RARE_FORM_CHANGE_ITEM, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 6, 24),
new WeightedModifierType(modifierTypes.MEGA_BRACELET, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
new WeightedModifierType(modifierTypes.DYNAMAX_BAND, (party: Pokemon[]) => Math.min(Math.ceil(party[0].scene.currentBattle.waveIndex / 50), 4) * 9, 36),
new WeightedModifierType(modifierTypes.VOUCHER_PLUS, (party: Pokemon[], rerollCount: integer) => !party[0].scene.gameMode.isDaily ? Math.max(3 - rerollCount * 1, 0) : 0, 3),
@@ -2222,7 +2244,7 @@ export class ModifierTypeOption {
}
export function getPartyLuckValue(party: Pokemon[]): integer {
- const luck = Phaser.Math.Clamp(party.map(p => p.isFainted() ? 0 : p.getLuck())
+ const luck = Phaser.Math.Clamp(party.map(p => p.isAllowedInBattle() ? p.getLuck() : 0)
.reduce((total: integer, value: integer) => total += value, 0), 0, 14);
return luck || 0;
}
diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts
index 99f4540f493..84d8a1385af 100644
--- a/src/modifier/modifier.ts
+++ b/src/modifier/modifier.ts
@@ -3,16 +3,14 @@ import BattleScene from "../battle-scene";
import { getLevelTotalExp } from "../data/exp";
import { MAX_PER_TYPE_POKEBALLS, PokeballType } from "../data/pokeball";
import Pokemon, { PlayerPokemon } from "../field/pokemon";
-import { Stat } from "../data/pokemon-stat";
import { addTextObject, TextStyle } from "../ui/text";
import { Type } from "../data/type";
import { EvolutionPhase } from "../phases/evolution-phase";
import { FusionSpeciesFormEvolution, pokemonEvolutions, pokemonPrevolutions } from "../data/pokemon-evolutions";
import { getPokemonNameWithAffix } from "../messages";
import * as Utils from "../utils";
-import { TempBattleStat } from "../data/temp-battle-stat";
import { getBerryEffectFunc, getBerryPredicate } from "../data/berry";
-import { BattlerTagType} from "#enums/battler-tag-type";
+import { BattlerTagType } from "#enums/battler-tag-type";
import { BerryType } from "#enums/berry-type";
import { StatusEffect, getStatusEffectHealText } from "../data/status-effect";
import { achvs } from "../system/achv";
@@ -23,6 +21,7 @@ import Overrides from "#app/overrides";
import { ModifierType, modifierTypes } from "./modifier-type";
import { Command } from "#app/ui/command-ui-handler";
import { Species } from "#enums/species";
+import { Stat, type PermanentStat, type TempBattleStat, BATTLE_STATS, TEMP_BATTLE_STATS } from "#app/enums/stat";
import i18next from "i18next";
import { allMoves } from "#app/data/move";
@@ -362,41 +361,160 @@ export class DoubleBattleChanceBoosterModifier extends LapsingPersistentModifier
}
}
-export class TempBattleStatBoosterModifier extends LapsingPersistentModifier {
- private tempBattleStat: TempBattleStat;
+/**
+ * Modifier used for party-wide items, specifically the X items, that
+ * temporarily increases the stat stage multiplier of the corresponding
+ * {@linkcode TempBattleStat}.
+ * @extends LapsingPersistentModifier
+ * @see {@linkcode apply}
+ */
+export class TempStatStageBoosterModifier extends LapsingPersistentModifier {
+ private stat: TempBattleStat;
+ private multiplierBoost: number;
- constructor(type: ModifierTypes.TempBattleStatBoosterModifierType, tempBattleStat: TempBattleStat, battlesLeft?: integer, stackCount?: integer) {
- super(type, battlesLeft || 5, stackCount);
+ constructor(type: ModifierType, stat: TempBattleStat, battlesLeft?: number, stackCount?: number) {
+ super(type, battlesLeft ?? 5, stackCount);
- this.tempBattleStat = tempBattleStat;
+ this.stat = stat;
+ // Note that, because we want X Accuracy to maintain its original behavior,
+ // it will increment as it did previously, directly to the stat stage.
+ this.multiplierBoost = stat !== Stat.ACC ? 0.3 : 1;
}
match(modifier: Modifier): boolean {
- if (modifier instanceof TempBattleStatBoosterModifier) {
- return (modifier as TempBattleStatBoosterModifier).tempBattleStat === this.tempBattleStat
- && (modifier as TempBattleStatBoosterModifier).battlesLeft === this.battlesLeft;
+ if (modifier instanceof TempStatStageBoosterModifier) {
+ const modifierInstance = modifier as TempStatStageBoosterModifier;
+ return (modifierInstance.stat === this.stat);
}
return false;
}
- clone(): TempBattleStatBoosterModifier {
- return new TempBattleStatBoosterModifier(this.type as ModifierTypes.TempBattleStatBoosterModifierType, this.tempBattleStat, this.battlesLeft, this.stackCount);
+ clone() {
+ return new TempStatStageBoosterModifier(this.type, this.stat, this.battlesLeft, this.stackCount);
}
getArgs(): any[] {
- return [ this.tempBattleStat, this.battlesLeft ];
+ return [ this.stat, this.battlesLeft ];
}
- apply(args: any[]): boolean {
- const tempBattleStat = args[0] as TempBattleStat;
+ /**
+ * Checks if {@linkcode args} contains the necessary elements and if the
+ * incoming stat is matches {@linkcode stat}.
+ * @param args [0] {@linkcode TempBattleStat} being checked at the time
+ * [1] {@linkcode Utils.NumberHolder} N/A
+ * @returns true if the modifier can be applied, false otherwise
+ */
+ shouldApply(args: any[]): boolean {
+ return args && (args.length === 2) && TEMP_BATTLE_STATS.includes(args[0]) && (args[0] === this.stat) && (args[1] instanceof Utils.NumberHolder);
+ }
- if (tempBattleStat === this.tempBattleStat) {
- const statLevel = args[1] as Utils.IntegerHolder;
- statLevel.value = Math.min(statLevel.value + 1, 6);
- return true;
+ /**
+ * Increases the incoming stat stage matching {@linkcode stat} by {@linkcode multiplierBoost}.
+ * @param args [0] {@linkcode TempBattleStat} N/A
+ * [1] {@linkcode Utils.NumberHolder} that holds the resulting value of the stat stage multiplier
+ */
+ apply(args: any[]): boolean {
+ (args[1] as Utils.NumberHolder).value += this.multiplierBoost;
+ return true;
+ }
+
+ /**
+ * Goes through existing modifiers for any that match the selected modifier,
+ * which will then either add it to the existing modifiers if none were found
+ * or, if one was found, it will refresh {@linkcode battlesLeft}.
+ * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers
+ * @param _virtual N/A
+ * @param _scene N/A
+ * @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 TempStatStageBoosterModifier;
+ if (modifierInstance.getBattlesLeft() < 5) {
+ modifierInstance.battlesLeft = 5;
+ return true;
+ }
+ // should never get here
+ return false;
+ }
}
- return false;
+ modifiers.push(this);
+ return true;
+ }
+
+ getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number {
+ return 1;
+ }
+}
+
+/**
+ * Modifier used for party-wide items, namely Dire Hit, that
+ * temporarily increments the critical-hit stage
+ * @extends LapsingPersistentModifier
+ * @see {@linkcode apply}
+ */
+export class TempCritBoosterModifier extends LapsingPersistentModifier {
+ constructor(type: ModifierType, battlesLeft?: integer, stackCount?: number) {
+ super(type, battlesLeft || 5, stackCount);
+ }
+
+ clone() {
+ return new TempCritBoosterModifier(this.type, this.stackCount);
+ }
+
+ match(modifier: Modifier): boolean {
+ return (modifier instanceof TempCritBoosterModifier);
+ }
+
+ /**
+ * Checks if {@linkcode args} contains the necessary elements.
+ * @param args [1] {@linkcode Utils.NumberHolder} N/A
+ * @returns true if the critical-hit stage boost applies successfully
+ */
+ shouldApply(args: any[]): boolean {
+ return args && (args.length === 1) && (args[0] instanceof Utils.NumberHolder);
+ }
+
+ /**
+ * Increases the current critical-hit stage value by 1.
+ * @param args [0] {@linkcode Utils.IntegerHolder} that holds the resulting critical-hit level
+ * @returns true if the critical-hit stage boost applies successfully
+ */
+ apply(args: any[]): boolean {
+ (args[0] as Utils.NumberHolder).value++;
+ return true;
+ }
+
+ /**
+ * Goes through existing modifiers for any that match the selected modifier,
+ * which will then either add it to the existing modifiers if none were found
+ * or, if one was found, it will refresh {@linkcode battlesLeft}.
+ * @param modifiers {@linkcode PersistentModifier} array of the player's modifiers
+ * @param _virtual N/A
+ * @param _scene N/A
+ * @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 TempCritBoosterModifier;
+ if (modifierInstance.getBattlesLeft() < 5) {
+ modifierInstance.battlesLeft = 5;
+ return true;
+ }
+ // should never get here
+ return false;
+ }
+ }
+
+ modifiers.push(this);
+ return true;
+ }
+
+ getMaxStackCount(_scene: BattleScene, _forThreshold?: boolean): number {
+ return 1;
}
}
@@ -663,24 +781,30 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier {
}
}
-export class PokemonBaseStatModifier extends PokemonHeldItemModifier {
- protected stat: Stat;
+/**
+ * Modifier used for held items, specifically vitamins like Carbos, Hp Up, etc., that
+ * increase the value of a given {@linkcode PermanentStat}.
+ * @extends LapsingPersistentModifier
+ * @see {@linkcode apply}
+ */
+export class BaseStatModifier extends PokemonHeldItemModifier {
+ protected stat: PermanentStat;
readonly isTransferrable: boolean = false;
- constructor(type: ModifierTypes.PokemonBaseStatBoosterModifierType, pokemonId: integer, stat: Stat, stackCount?: integer) {
+ constructor(type: ModifierType, pokemonId: integer, stat: PermanentStat, stackCount?: integer) {
super(type, pokemonId, stackCount);
this.stat = stat;
}
matchType(modifier: Modifier): boolean {
- if (modifier instanceof PokemonBaseStatModifier) {
- return (modifier as PokemonBaseStatModifier).stat === this.stat;
+ if (modifier instanceof BaseStatModifier) {
+ return (modifier as BaseStatModifier).stat === this.stat;
}
return false;
}
clone(): PersistentModifier {
- return new PokemonBaseStatModifier(this.type as ModifierTypes.PokemonBaseStatBoosterModifierType, this.pokemonId, this.stat, this.stackCount);
+ return new BaseStatModifier(this.type, this.pokemonId, this.stat, this.stackCount);
}
getArgs(): any[] {
@@ -688,12 +812,12 @@ export class PokemonBaseStatModifier extends PokemonHeldItemModifier {
}
shouldApply(args: any[]): boolean {
- return super.shouldApply(args) && args.length === 2 && args[1] instanceof Array;
+ return super.shouldApply(args) && args.length === 2 && Array.isArray(args[1]);
}
apply(args: any[]): boolean {
- args[1][this.stat] = Math.min(Math.floor(args[1][this.stat] * (1 + this.getStackCount() * 0.1)), 999999);
-
+ const baseStats = args[1] as number[];
+ baseStats[this.stat] = Math.floor(baseStats[this.stat] * (1 + this.getStackCount() * 0.1));
return true;
}
@@ -1398,42 +1522,48 @@ export class PokemonInstantReviveModifier extends PokemonHeldItemModifier {
}
/**
- * Modifier used for White Herb, which resets negative {@linkcode Stat} changes
+ * Modifier used for held items, namely White Herb, that restore adverse stat
+ * stages in battle.
* @extends PokemonHeldItemModifier
* @see {@linkcode apply}
*/
-export class PokemonResetNegativeStatStageModifier extends PokemonHeldItemModifier {
+export class ResetNegativeStatStageModifier extends PokemonHeldItemModifier {
constructor(type: ModifierType, pokemonId: integer, stackCount?: integer) {
super(type, pokemonId, stackCount);
}
matchType(modifier: Modifier) {
- return modifier instanceof PokemonResetNegativeStatStageModifier;
+ return modifier instanceof ResetNegativeStatStageModifier;
}
clone() {
- return new PokemonResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount);
+ return new ResetNegativeStatStageModifier(this.type, this.pokemonId, this.stackCount);
}
/**
- * Restores any negative stat stages of the mon to 0
- * @param args args[0] is the {@linkcode Pokemon} whose stat stages are being checked
- * @returns true if any stat changes were applied (item was used), false otherwise
+ * Goes through the holder's stat stages and, if any are negative, resets that
+ * stat stage back to 0.
+ * @param args [0] {@linkcode Pokemon} that holds the held item
+ * @returns true if any stat stages were reset, false otherwise
*/
apply(args: any[]): boolean {
const pokemon = args[0] as Pokemon;
- const loweredStats = pokemon.summonData.battleStats.filter(s => s < 0);
- if (loweredStats.length) {
- for (let s = 0; s < pokemon.summonData.battleStats.length; s++) {
- pokemon.summonData.battleStats[s] = Math.max(0, pokemon.summonData.battleStats[s]);
+ let statRestored = false;
+
+ for (const s of BATTLE_STATS) {
+ if (pokemon.getStatStage(s) < 0) {
+ pokemon.setStatStage(s, 0);
+ statRestored = true;
}
- pokemon.scene.queueMessage(i18next.t("modifier:pokemonResetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }));
- return true;
}
- return false;
+
+ if (statRestored) {
+ pokemon.scene.queueMessage(i18next.t("modifier:resetNegativeStatStageApply", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), typeName: this.type.name }));
+ }
+ return statRestored;
}
- getMaxHeldItemCount(pokemon: Pokemon): integer {
+ getMaxHeldItemCount(_pokemon: Pokemon): integer {
return 2;
}
}
@@ -1625,7 +1755,7 @@ export class TmModifier extends ConsumablePokemonModifier {
apply(args: any[]): boolean {
const pokemon = args[0] as PlayerPokemon;
- pokemon.scene.unshiftPhase(new LearnMovePhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), (this.type as ModifierTypes.TmModifierType).moveId));
+ pokemon.scene.unshiftPhase(new LearnMovePhase(pokemon.scene, pokemon.scene.getParty().indexOf(pokemon), (this.type as ModifierTypes.TmModifierType).moveId, true));
return true;
}
@@ -2193,7 +2323,7 @@ export class ShinyRateBoosterModifier extends PersistentModifier {
}
apply(args: any[]): boolean {
- (args[0] as Utils.IntegerHolder).value *= Math.pow(2, 2 + this.getStackCount());
+ (args[0] as Utils.IntegerHolder).value *= Math.pow(2, 1 + this.getStackCount());
return true;
}
@@ -2745,7 +2875,7 @@ export class EnemyFusionChanceModifier extends EnemyPersistentModifier {
* - The player
* - The enemy
* @param scene current {@linkcode BattleScene}
- * @param isPlayer {@linkcode boolean} for whether the the player (`true`) or enemy (`false`) is being overridden
+ * @param isPlayer {@linkcode boolean} for whether the player (`true`) or enemy (`false`) is being overridden
*/
export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true): void {
const modifiersOverride: ModifierTypes.ModifierOverride[] = isPlayer ? Overrides.STARTING_MODIFIER_OVERRIDE : Overrides.OPP_MODIFIER_OVERRIDE;
@@ -2760,13 +2890,22 @@ export function overrideModifiers(scene: BattleScene, isPlayer: boolean = true):
modifiersOverride.forEach(item => {
const modifierFunc = modifierTypes[item.name];
- const modifier = modifierFunc().withIdFromFunc(modifierFunc).newModifier() as PersistentModifier;
- modifier.stackCount = item.count || 1;
+ let modifierType: ModifierType | null = modifierFunc();
- if (isPlayer) {
- scene.addModifier(modifier, true, false, false, true);
- } else {
- scene.addEnemyModifier(modifier, true, true);
+ if (modifierType instanceof ModifierTypes.ModifierTypeGenerator) {
+ const pregenArgs = ("type" in item) && (item.type !== null) ? [item.type] : undefined;
+ modifierType = modifierType.generateType([], pregenArgs);
+ }
+
+ const modifier = modifierType && modifierType.withIdFromFunc(modifierFunc).newModifier() as PersistentModifier;
+ if (modifier) {
+ modifier.stackCount = item.count || 1;
+
+ if (isPlayer) {
+ scene.addModifier(modifier, true, false, false, true);
+ } else {
+ scene.addEnemyModifier(modifier, true, true);
+ }
}
});
}
diff --git a/src/overrides.ts b/src/overrides.ts
index 32ff116f41d..48c118b55bc 100644
--- a/src/overrides.ts
+++ b/src/overrides.ts
@@ -116,6 +116,14 @@ class DefaultOverrides {
readonly OPP_VARIANT_OVERRIDE: Variant = 0;
readonly OPP_IVS_OVERRIDE: number | number[] = [];
readonly OPP_FORM_OVERRIDES: Partial> = {};
+ /**
+ * Override to give the enemy Pokemon a given amount of health segments
+ *
+ * 0 (default): the health segments will be handled normally based on wave, level and species
+ * 1: the Pokemon will have a single health segment and therefore will not be a boss
+ * 2+: the Pokemon will be a boss with the given number of health segments
+ */
+ readonly OPP_HEALTH_SEGMENTS_OVERRIDE: number = 0;
// -------------
// EGG OVERRIDES
diff --git a/src/phases/battle-end-phase.ts b/src/phases/battle-end-phase.ts
index a9999370cdd..06315668a8b 100644
--- a/src/phases/battle-end-phase.ts
+++ b/src/phases/battle-end-phase.ts
@@ -23,12 +23,6 @@ export class BattleEndPhase extends BattlePhase {
this.scene.unshiftPhase(new GameOverPhase(this.scene, true));
}
- for (const pokemon of this.scene.getField()) {
- if (pokemon) {
- pokemon.resetBattleSummonData();
- }
- }
-
for (const pokemon of this.scene.getParty().filter(p => p.isAllowedInBattle())) {
applyPostBattleAbAttrs(PostBattleAbAttr, pokemon);
}
diff --git a/src/phases/command-phase.ts b/src/phases/command-phase.ts
index 68ede826d95..9681a6eeee8 100644
--- a/src/phases/command-phase.ts
+++ b/src/phases/command-phase.ts
@@ -1,21 +1,18 @@
-import BattleScene from "#app/battle-scene.js";
-import { TurnCommand, BattleType } from "#app/battle.js";
-import { applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "#app/data/ability.js";
-import { TrappedTag, EncoreTag } from "#app/data/battler-tags.js";
-import { MoveTargetSet, getMoveTargets } from "#app/data/move.js";
-import { speciesStarters } from "#app/data/pokemon-species.js";
-import { Type } from "#app/data/type.js";
-import { Abilities } from "#app/enums/abilities.js";
-import { BattlerTagType } from "#app/enums/battler-tag-type.js";
-import { Biome } from "#app/enums/biome.js";
-import { Moves } from "#app/enums/moves.js";
-import { PokeballType } from "#app/enums/pokeball.js";
-import { FieldPosition, PlayerPokemon } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { Command } from "#app/ui/command-ui-handler.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { TurnCommand, BattleType } from "#app/battle";
+import { TrappedTag, EncoreTag } from "#app/data/battler-tags";
+import { MoveTargetSet, getMoveTargets } from "#app/data/move";
+import { speciesStarters } from "#app/data/pokemon-species";
+import { Abilities } from "#app/enums/abilities";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { Biome } from "#app/enums/biome";
+import { Moves } from "#app/enums/moves";
+import { PokeballType } from "#app/enums/pokeball";
+import { FieldPosition, PlayerPokemon } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { Command } from "#app/ui/command-ui-handler";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
-import * as Utils from "#app/utils.js";
import { FieldPhase } from "./field-phase";
import { SelectTargetPhase } from "./select-target-phase";
@@ -77,7 +74,6 @@ export class CommandPhase extends FieldPhase {
handleCommand(command: Command, cursor: integer, ...args: any[]): boolean {
const playerPokemon = this.scene.getPlayerField()[this.fieldIndex];
- const enemyField = this.scene.getEnemyField();
let success: boolean;
switch (command) {
@@ -184,14 +180,9 @@ export class CommandPhase extends FieldPhase {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}, null, true);
} else {
- const trapTag = playerPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag;
- const trapped = new Utils.BooleanHolder(false);
const batonPass = isSwitch && args[0] as boolean;
const trappedAbMessages: string[] = [];
- if (!batonPass) {
- enemyField.forEach(enemyPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trapped, playerPokemon, trappedAbMessages, true));
- }
- if (batonPass || (!trapTag && !trapped.value)) {
+ if (batonPass || !playerPokemon.isTrapped(trappedAbMessages)) {
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
? { command: Command.POKEMON, cursor: cursor, args: args }
: { command: Command.RUN };
@@ -199,14 +190,27 @@ export class CommandPhase extends FieldPhase {
if (!isSwitch && this.fieldIndex) {
this.scene.currentBattle.turnCommands[this.fieldIndex - 1]!.skip = true;
}
- } else if (trapTag) {
- if (trapTag.sourceMove === Moves.INGRAIN && trapTag.sourceId && this.scene.getPokemonById(trapTag.sourceId)?.isOfType(Type.GHOST)) {
- success = 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) {
this.scene.currentBattle.turnCommands[this.fieldIndex] = isSwitch
? { command: Command.POKEMON, cursor: cursor, args: args }
: { command: Command.RUN };
break;
}
+
if (!isSwitch) {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
this.scene.ui.setMode(Mode.MESSAGE);
@@ -224,16 +228,6 @@ export class CommandPhase extends FieldPhase {
this.scene.ui.setMode(Mode.COMMAND, this.fieldIndex);
}
}, null, true);
- } else if (trapped.value && 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);
}
}
break;
diff --git a/src/phases/egg-hatch-phase.ts b/src/phases/egg-hatch-phase.ts
index a5b0252d4de..4b03aa62f02 100644
--- a/src/phases/egg-hatch-phase.ts
+++ b/src/phases/egg-hatch-phase.ts
@@ -1,23 +1,29 @@
-import BattleScene, { AnySound } from "#app/battle-scene.js";
-import { Egg, EGG_SEED } from "#app/data/egg.js";
-import { EggCountChangedEvent } from "#app/events/egg.js";
-import { PlayerPokemon } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { Phase } from "#app/phase.js";
-import { achvs } from "#app/system/achv.js";
-import EggCounterContainer from "#app/ui/egg-counter-container.js";
-import EggHatchSceneHandler from "#app/ui/egg-hatch-scene-handler.js";
-import PokemonInfoContainer from "#app/ui/pokemon-info-container.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene, { AnySound } from "#app/battle-scene";
+import { Egg } from "#app/data/egg";
+import { EggCountChangedEvent } from "#app/events/egg";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { Phase } from "#app/phase";
+import { achvs } from "#app/system/achv";
+import EggCounterContainer from "#app/ui/egg-counter-container";
+import EggHatchSceneHandler from "#app/ui/egg-hatch-scene-handler";
+import PokemonInfoContainer from "#app/ui/pokemon-info-container";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import SoundFade from "phaser3-rex-plugins/plugins/soundfade";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
+import { EggLapsePhase } from "./egg-lapse-phase";
+import { EggHatchData } from "#app/data/egg-hatch-data";
+
+
/**
* Class that represents egg hatching
*/
export class EggHatchPhase extends Phase {
/** The egg that is hatching */
private egg: Egg;
+ /** The new EggHatchData for the egg/pokemon that hatches */
+ private eggHatchData: EggHatchData;
/** The number of eggs that are hatching */
private eggsToHatchCount: integer;
@@ -58,10 +64,11 @@ export class EggHatchPhase extends Phase {
private skipped: boolean;
/** The sound effect being played when the egg is hatched */
private evolutionBgm: AnySound;
+ private eggLapsePhase: EggLapsePhase;
- constructor(scene: BattleScene, egg: Egg, eggsToHatchCount: integer) {
+ constructor(scene: BattleScene, hatchScene: EggLapsePhase, egg: Egg, eggsToHatchCount: integer) {
super(scene);
-
+ this.eggLapsePhase = hatchScene;
this.egg = egg;
this.eggsToHatchCount = eggsToHatchCount;
}
@@ -307,6 +314,7 @@ export class EggHatchPhase extends Phase {
* Function to do the logic and animation of completing a hatch and revealing the Pokemon
*/
doReveal(): void {
+ // set the previous dex data so info container can show new unlocks in egg summary
const isShiny = this.pokemon.isShiny();
if (this.pokemon.species.subLegendary) {
this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY);
@@ -345,13 +353,13 @@ export class EggHatchPhase extends Phase {
this.scene.ui.showText(i18next.t("egg:hatchFromTheEgg", { pokemonName: getPokemonNameWithAffix(this.pokemon) }), null, () => {
this.scene.gameData.updateSpeciesDexIvs(this.pokemon.species.speciesId, this.pokemon.ivs);
this.scene.gameData.setPokemonCaught(this.pokemon, true, true).then(() => {
- this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then(() => {
+ this.scene.gameData.setEggMoveUnlocked(this.pokemon.species, this.eggMoveIndex).then((value) => {
+ this.eggHatchData.setEggMoveUnlocked(value);
this.scene.ui.showText("", 0);
this.end();
});
});
}, null, true, 3000);
- //this.scene.time.delayedCall(Utils.fixedInt(4250), () => this.scene.playBgm());
});
});
this.scene.tweens.add({
@@ -435,17 +443,11 @@ export class EggHatchPhase extends Phase {
/**
* Generates a Pokemon to be hatched by the egg
+ * Also stores the generated pokemon in this.eggHatchData
* @returns the hatched PlayerPokemon
*/
generatePokemon(): PlayerPokemon {
- let ret: PlayerPokemon;
-
- this.scene.executeWithSeedOffset(() => {
- ret = this.egg.generatePlayerPokemon(this.scene);
- this.eggMoveIndex = this.egg.eggMoveIndex;
-
- }, this.egg.id, EGG_SEED.toString());
-
- return ret!;
+ this.eggHatchData = this.eggLapsePhase.generatePokemon(this.egg);
+ return this.eggHatchData.pokemon;
}
}
diff --git a/src/phases/egg-lapse-phase.ts b/src/phases/egg-lapse-phase.ts
index 50d7106f229..1adb1568166 100644
--- a/src/phases/egg-lapse-phase.ts
+++ b/src/phases/egg-lapse-phase.ts
@@ -1,11 +1,23 @@
-import BattleScene from "#app/battle-scene.js";
-import { Egg } from "#app/data/egg.js";
-import { Phase } from "#app/phase.js";
+import BattleScene from "#app/battle-scene";
+import { Egg, EGG_SEED } from "#app/data/egg";
+import { Phase } from "#app/phase";
import i18next from "i18next";
import Overrides from "#app/overrides";
import { EggHatchPhase } from "./egg-hatch-phase";
+import { Mode } from "#app/ui/ui";
+import { achvs } from "#app/system/achv";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { EggSummaryPhase } from "./egg-summary-phase";
+import { EggHatchData } from "#app/data/egg-hatch-data";
+/**
+ * Phase that handles updating eggs, and hatching any ready eggs
+ * Also handles prompts for skipping animation, and calling the egg summary phase
+ */
export class EggLapsePhase extends Phase {
+
+ private eggHatchData: EggHatchData[] = [];
+ private readonly minEggsToPromptSkip: number = 5;
constructor(scene: BattleScene) {
super(scene);
}
@@ -16,20 +28,111 @@ export class EggLapsePhase extends Phase {
const eggsToHatch: Egg[] = this.scene.gameData.eggs.filter((egg: Egg) => {
return Overrides.EGG_IMMEDIATE_HATCH_OVERRIDE ? true : --egg.hatchWaves < 1;
});
+ const eggsToHatchCount: number = eggsToHatch.length;
+ this.eggHatchData= [];
- let eggCount: integer = eggsToHatch.length;
+ if (eggsToHatchCount > 0) {
- if (eggCount) {
- this.scene.queueMessage(i18next.t("battle:eggHatching"));
-
- for (const egg of eggsToHatch) {
- this.scene.unshiftPhase(new EggHatchPhase(this.scene, egg, eggCount));
- if (eggCount > 0) {
- eggCount--;
- }
+ if (eggsToHatchCount >= this.minEggsToPromptSkip) {
+ this.scene.ui.showText(i18next.t("battle:eggHatching"), 0, () => {
+ // show prompt for skip
+ this.scene.ui.showText(i18next.t("battle:eggSkipPrompt"), 0);
+ this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => {
+ this.hatchEggsSkipped(eggsToHatch);
+ this.showSummary();
+ }, () => {
+ this.hatchEggsRegular(eggsToHatch);
+ this.showSummary();
+ }
+ );
+ }, 100, true);
+ } else {
+ // regular hatches, no summary
+ this.scene.queueMessage(i18next.t("battle:eggHatching"));
+ this.hatchEggsRegular(eggsToHatch);
+ this.end();
}
-
+ } else {
+ this.end();
}
+ }
+
+ /**
+ * Hatches eggs normally one by one, showing animations
+ * @param eggsToHatch list of eggs to hatch
+ */
+ hatchEggsRegular(eggsToHatch: Egg[]) {
+ let eggsToHatchCount: number = eggsToHatch.length;
+ for (const egg of eggsToHatch) {
+ this.scene.unshiftPhase(new EggHatchPhase(this.scene, this, egg, eggsToHatchCount));
+ eggsToHatchCount--;
+ }
+ }
+
+ /**
+ * Hatches eggs with no animations
+ * @param eggsToHatch list of eggs to hatch
+ */
+ hatchEggsSkipped(eggsToHatch: Egg[]) {
+ for (const egg of eggsToHatch) {
+ this.hatchEggSilently(egg);
+ }
+ }
+
+ showSummary() {
+ this.scene.unshiftPhase(new EggSummaryPhase(this.scene, this.eggHatchData));
this.end();
}
+
+ /**
+ * Hatches an egg and stores it in the local EggHatchData array without animations
+ * Also validates the achievements for the hatched pokemon and removes the egg
+ * @param egg egg to hatch
+ */
+ hatchEggSilently(egg: Egg) {
+ const eggIndex = this.scene.gameData.eggs.findIndex(e => e.id === egg.id);
+ if (eggIndex === -1) {
+ return this.end();
+ }
+ this.scene.gameData.eggs.splice(eggIndex, 1);
+
+ const data = this.generatePokemon(egg);
+ const pokemon = data.pokemon;
+ if (pokemon.fusionSpecies) {
+ pokemon.clearFusionSpecies();
+ }
+
+ if (pokemon.species.subLegendary) {
+ this.scene.validateAchv(achvs.HATCH_SUB_LEGENDARY);
+ }
+ if (pokemon.species.legendary) {
+ this.scene.validateAchv(achvs.HATCH_LEGENDARY);
+ }
+ if (pokemon.species.mythical) {
+ this.scene.validateAchv(achvs.HATCH_MYTHICAL);
+ }
+ if (pokemon.isShiny()) {
+ this.scene.validateAchv(achvs.HATCH_SHINY);
+ }
+
+ }
+
+ /**
+ * Generates a Pokemon and creates a new EggHatchData instance for the given egg
+ * @param egg the egg to hatch
+ * @returns the hatched PlayerPokemon
+ */
+ generatePokemon(egg: Egg): EggHatchData {
+ let ret: PlayerPokemon;
+ let newHatchData: EggHatchData;
+ this.scene.executeWithSeedOffset(() => {
+ ret = egg.generatePlayerPokemon(this.scene);
+ newHatchData = new EggHatchData(this.scene, ret, egg.eggMoveIndex);
+ newHatchData.setDex();
+ this.eggHatchData.push(newHatchData);
+
+ }, egg.id, EGG_SEED.toString());
+ return newHatchData!;
+ }
+
}
diff --git a/src/phases/egg-summary-phase.ts b/src/phases/egg-summary-phase.ts
new file mode 100644
index 00000000000..190af17c724
--- /dev/null
+++ b/src/phases/egg-summary-phase.ts
@@ -0,0 +1,50 @@
+import BattleScene from "#app/battle-scene";
+import { Phase } from "#app/phase";
+import { Mode } from "#app/ui/ui";
+import EggHatchSceneHandler from "#app/ui/egg-hatch-scene-handler";
+import { EggHatchData } from "#app/data/egg-hatch-data";
+
+/**
+ * Class that represents the egg summary phase
+ * It does some of the function for updating egg data
+ * Phase is handled mostly by the egg-hatch-scene-handler UI
+ */
+export class EggSummaryPhase extends Phase {
+ private eggHatchData: EggHatchData[];
+ private eggHatchHandler: EggHatchSceneHandler;
+
+ constructor(scene: BattleScene, eggHatchData: EggHatchData[]) {
+ super(scene);
+ this.eggHatchData = eggHatchData;
+ }
+
+ start() {
+ super.start();
+
+ // updates next pokemon once the current update has been completed
+ const updateNextPokemon = (i: number) => {
+ if (i >= this.eggHatchData.length) {
+ this.scene.ui.setModeForceTransition(Mode.EGG_HATCH_SUMMARY, this.eggHatchData).then(() => {
+ this.scene.fadeOutBgm(undefined, false);
+ this.eggHatchHandler = this.scene.ui.getHandler() as EggHatchSceneHandler;
+ });
+
+ } else {
+ this.eggHatchData[i].setDex();
+ this.eggHatchData[i].updatePokemon().then(() => {
+ if (i < this.eggHatchData.length) {
+ updateNextPokemon(i + 1);
+ }
+ });
+ }
+ };
+ updateNextPokemon(0);
+
+ }
+
+ end() {
+ this.eggHatchHandler.clear();
+ this.scene.ui.setModeForceTransition(Mode.MESSAGE).then(() => {});
+ super.end();
+ }
+}
diff --git a/src/phases/encounter-phase.ts b/src/phases/encounter-phase.ts
index dfa198c8339..3f37095569a 100644
--- a/src/phases/encounter-phase.ts
+++ b/src/phases/encounter-phase.ts
@@ -1,23 +1,23 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattleType, BattlerIndex } from "#app/battle.js";
-import { applyAbAttrs, SyncEncounterNatureAbAttr } from "#app/data/ability.js";
-import { getCharVariantFromDialogue } from "#app/data/dialogue.js";
-import { TrainerSlot } from "#app/data/trainer-config.js";
-import { getRandomWeatherType } from "#app/data/weather.js";
-import { BattleSpec } from "#app/enums/battle-spec.js";
-import { PlayerGender } from "#app/enums/player-gender.js";
-import { Species } from "#app/enums/species.js";
-import { EncounterPhaseEvent } from "#app/events/battle-scene.js";
-import Pokemon, { FieldPosition } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { regenerateModifierPoolThresholds, ModifierPoolType } from "#app/modifier/modifier-type.js";
-import { IvScannerModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier.js";
-import { achvs } from "#app/system/achv.js";
-import { handleTutorial, Tutorial } from "#app/tutorial.js";
-import { Mode } from "#app/ui/ui.js";
+import BattleScene from "#app/battle-scene";
+import { BattleType, BattlerIndex } from "#app/battle";
+import { applyAbAttrs, SyncEncounterNatureAbAttr } from "#app/data/ability";
+import { getCharVariantFromDialogue } from "#app/data/dialogue";
+import { TrainerSlot } from "#app/data/trainer-config";
+import { getRandomWeatherType } from "#app/data/weather";
+import { BattleSpec } from "#app/enums/battle-spec";
+import { PlayerGender } from "#app/enums/player-gender";
+import { Species } from "#app/enums/species";
+import { EncounterPhaseEvent } from "#app/events/battle-scene";
+import Pokemon, { FieldPosition } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { regenerateModifierPoolThresholds, ModifierPoolType } from "#app/modifier/modifier-type";
+import { IvScannerModifier, TurnHeldItemTransferModifier } from "#app/modifier/modifier";
+import { achvs } from "#app/system/achv";
+import { handleTutorial, Tutorial } from "#app/tutorial";
+import { Mode } from "#app/ui/ui";
import i18next from "i18next";
import { BattlePhase } from "./battle-phase";
-import * as Utils from "#app/utils.js";
+import * as Utils from "#app/utils";
import { CheckSwitchPhase } from "./check-switch-phase";
import { GameOverPhase } from "./game-over-phase";
import { PostSummonPhase } from "./post-summon-phase";
@@ -26,6 +26,7 @@ import { ScanIvsPhase } from "./scan-ivs-phase";
import { ShinySparklePhase } from "./shiny-sparkle-phase";
import { SummonPhase } from "./summon-phase";
import { ToggleDoublePositionPhase } from "./toggle-double-position-phase";
+import Overrides from "#app/overrides";
export class EncounterPhase extends BattlePhase {
private loaded: boolean;
@@ -112,10 +113,11 @@ export class EncounterPhase extends BattlePhase {
if (battle.battleType === BattleType.TRAINER) {
loadEnemyAssets.push(battle.trainer?.loadAssets().then(() => battle.trainer?.initSprite())!); // TODO: is this bang correct?
} else {
- // This block only applies for double battles to init the boss segments (idk why it's split up like this)
- if (battle.enemyParty.filter(p => p.isBoss()).length > 1) {
+ const overridedBossSegments = Overrides.OPP_HEALTH_SEGMENTS_OVERRIDE > 1;
+ // for double battles, reduce the health segments for boss Pokemon unless there is an override
+ if (!overridedBossSegments && battle.enemyParty.filter(p => p.isBoss()).length > 1) {
for (const enemyPokemon of battle.enemyParty) {
- // If the enemy pokemon is a boss and wasn't populated from data source, then set it up
+ // If the enemy pokemon is a boss and wasn't populated from data source, then update the number of segments
if (enemyPokemon.isBoss() && !enemyPokemon.isPopulatedFromDataSource) {
enemyPokemon.setBoss(true, Math.ceil(enemyPokemon.bossSegments * (enemyPokemon.getSpeciesForm().baseTotal / totalBst)));
enemyPokemon.initBattleInfo();
@@ -159,9 +161,11 @@ export class EncounterPhase extends BattlePhase {
return this.scene.reset(true);
}
this.doEncounter();
+ this.scene.resetSeed();
});
} else {
this.doEncounter();
+ this.scene.resetSeed();
}
});
});
@@ -358,22 +362,29 @@ export class EncounterPhase extends BattlePhase {
case BattleSpec.FINAL_BOSS:
const enemy = this.scene.getEnemyPokemon();
this.scene.ui.showText(this.getEncounterMessage(), null, () => {
- const count = 5643853 + this.scene.gameData.gameStats.classicSessionsPlayed;
- //The two lines below check if English ordinals (1st, 2nd, 3rd, Xth) are used and determine which one to use.
- //Otherwise, it defaults to an empty string.
- //As of 08-07-24: Spanish and Italian default to the English translations
- const ordinalUse = ["en", "es", "it"];
- const currentLanguage = i18next.resolvedLanguage ?? "en";
- const ordinalIndex = (ordinalUse.includes(currentLanguage)) ? ["st", "nd", "rd"][((count + 90) % 100 - 10) % 10 - 1] ?? "th" : "";
- const cycleCount = count.toLocaleString() + ordinalIndex;
- const encounterDialogue = i18next.t(`${(this.scene.gameData.gender === PlayerGender.FEMALE) ? "PGF" : "PGM"}battleSpecDialogue:encounter`, {cycleCount: cycleCount});
- this.scene.ui.showDialogue(encounterDialogue, enemy?.species.name, 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, () => {
+ this.doEncounterCommon(false);
+ });
+ }
}, 1500, true);
return true;
}
-
return false;
}
}
diff --git a/src/phases/enemy-command-phase.ts b/src/phases/enemy-command-phase.ts
index 0b62fcbe813..91ee0456cd4 100644
--- a/src/phases/enemy-command-phase.ts
+++ b/src/phases/enemy-command-phase.ts
@@ -1,9 +1,6 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "#app/data/ability.js";
-import { TrappedTag } from "#app/data/battler-tags.js";
-import { Command } from "#app/ui/command-ui-handler.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex } from "#app/battle";
+import { Command } from "#app/ui/command-ui-handler";
import { FieldPhase } from "./field-phase";
/**
@@ -45,10 +42,7 @@ export class EnemyCommandPhase extends FieldPhase {
if (trainer && !enemyPokemon.getMoveQueue().length) {
const opponents = enemyPokemon.getOpponents();
- const trapTag = enemyPokemon.findTag(t => t instanceof TrappedTag) as TrappedTag;
- const trapped = new Utils.BooleanHolder(false);
- opponents.forEach(playerPokemon => applyCheckTrappedAbAttrs(CheckTrappedAbAttr, playerPokemon, trapped, enemyPokemon, [], true));
- if (!trapTag && !trapped.value) {
+ if (!enemyPokemon.isTrapped()) {
const partyMemberScores = trainer.getPartyMemberMatchupScores(enemyPokemon.trainerSlot, true);
if (partyMemberScores.length) {
@@ -83,4 +77,8 @@ export class EnemyCommandPhase extends FieldPhase {
this.end();
}
+
+ getFieldIndex(): number {
+ return this.fieldIndex;
+ }
}
diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts
index 66946d268cb..d5dd9f61340 100644
--- a/src/phases/faint-phase.ts
+++ b/src/phases/faint-phase.ts
@@ -1,14 +1,14 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex, BattleType } from "#app/battle.js";
-import { applyPostFaintAbAttrs, PostFaintAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr } from "#app/data/ability.js";
-import { BattlerTagLapseType } from "#app/data/battler-tags.js";
-import { battleSpecDialogue } from "#app/data/dialogue.js";
-import { allMoves, PostVictoryStatChangeAttr } from "#app/data/move.js";
-import { BattleSpec } from "#app/enums/battle-spec.js";
-import { StatusEffect } from "#app/enums/status-effect.js";
-import { PokemonMove, EnemyPokemon, PlayerPokemon, HitResult } from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { PokemonInstantReviveModifier } from "#app/modifier/modifier.js";
+import BattleScene from "#app/battle-scene";
+import { BattlerIndex, BattleType } from "#app/battle";
+import { applyPostFaintAbAttrs, PostFaintAbAttr, applyPostKnockOutAbAttrs, PostKnockOutAbAttr, applyPostVictoryAbAttrs, PostVictoryAbAttr } from "#app/data/ability";
+import { BattlerTagLapseType } from "#app/data/battler-tags";
+import { battleSpecDialogue } from "#app/data/dialogue";
+import { allMoves, PostVictoryStatStageChangeAttr } from "#app/data/move";
+import { BattleSpec } from "#app/enums/battle-spec";
+import { StatusEffect } from "#app/enums/status-effect";
+import { PokemonMove, EnemyPokemon, PlayerPokemon, HitResult } from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { PokemonInstantReviveModifier } from "#app/modifier/modifier";
import i18next from "i18next";
import { DamagePhase } from "./damage-phase";
import { PokemonPhase } from "./pokemon-phase";
@@ -72,7 +72,7 @@ export class FaintPhase extends PokemonPhase {
if (defeatSource?.isOnField()) {
applyPostVictoryAbAttrs(PostVictoryAbAttr, defeatSource);
const pvmove = allMoves[pokemon.turnData.attacksReceived[0].move];
- const pvattrs = pvmove.getAttrs(PostVictoryStatChangeAttr);
+ const pvattrs = pvmove.getAttrs(PostVictoryStatStageChangeAttr);
if (pvattrs.length) {
for (const pvattr of pvattrs) {
pvattr.applyPostVictory(defeatSource, defeatSource, pvmove);
diff --git a/src/phases/field-phase.ts b/src/phases/field-phase.ts
index a9622271f14..b65e903a32b 100644
--- a/src/phases/field-phase.ts
+++ b/src/phases/field-phase.ts
@@ -1,42 +1,9 @@
-import { BattlerIndex } from "#app/battle.js";
-import { TrickRoomTag } from "#app/data/arena-tag.js";
-import { Stat } from "#app/enums/stat.js";
import Pokemon from "#app/field/pokemon.js";
import { BattlePhase } from "./battle-phase";
-import * as Utils from "#app/utils.js";
type PokemonFunc = (pokemon: Pokemon) => void;
export abstract class FieldPhase extends BattlePhase {
- getOrder(): BattlerIndex[] {
- const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[];
- const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[];
-
- // We shuffle the list before sorting so speed ties produce random results
- let orderedTargets: Pokemon[] = playerField.concat(enemyField);
- // We seed it with the current turn to prevent an inconsistency where it
- // was varying based on how long since you last reloaded
- this.scene.executeWithSeedOffset(() => {
- orderedTargets = Utils.randSeedShuffle(orderedTargets);
- }, this.scene.currentBattle.turn, this.scene.waveSeed);
-
- orderedTargets.sort((a: Pokemon, b: Pokemon) => {
- const aSpeed = a?.getBattleStat(Stat.SPD) || 0;
- const bSpeed = b?.getBattleStat(Stat.SPD) || 0;
-
- return bSpeed - aSpeed;
- });
-
- const speedReversed = new Utils.BooleanHolder(false);
- this.scene.arena.applyTags(TrickRoomTag, speedReversed);
-
- if (speedReversed.value) {
- orderedTargets = orderedTargets.reverse();
- }
-
- return orderedTargets.map(t => t.getFieldIndex() + (!t.isPlayer() ? BattlerIndex.ENEMY : 0));
- }
-
executeForAll(func: PokemonFunc): void {
const field = this.scene.getField(true).filter(p => p.summonData);
field.forEach(pokemon => func(pokemon));
diff --git a/src/phases/game-over-phase.ts b/src/phases/game-over-phase.ts
index 78dd73057a1..ebe58b20d3e 100644
--- a/src/phases/game-over-phase.ts
+++ b/src/phases/game-over-phase.ts
@@ -1,7 +1,7 @@
import { clientSessionId } from "#app/account";
import BattleScene from "#app/battle-scene";
import { BattleType } from "#app/battle";
-import { miscDialogue, getCharVariantFromDialogue } from "#app/data/dialogue";
+import { getCharVariantFromDialogue } from "#app/data/dialogue";
import { pokemonEvolutions } from "#app/data/pokemon-evolutions";
import PokemonSpecies, { getPokemonSpecies } from "#app/data/pokemon-species";
import { trainerConfigs } from "#app/data/trainer-config";
@@ -136,12 +136,16 @@ export class GameOverPhase extends BattlePhase {
};
if (this.victory && this.scene.gameMode.isClassic) {
- const message = miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1];
+ const dialogueKey = "miscDialogue:ending";
- if (!this.scene.ui.shouldSkipDialogue(message)) {
+ if (!this.scene.ui.shouldSkipDialogue(dialogueKey)) {
this.scene.ui.fadeIn(500).then(() => {
- this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, getCharVariantFromDialogue(miscDialogue.ending[this.scene.gameData.gender === PlayerGender.FEMALE ? 0 : 1])).then(() => {
- this.scene.ui.showDialogue(message, this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => {
+ const genderIndex = this.scene.gameData.gender ?? PlayerGender.UNSET;
+ const genderStr = PlayerGender[genderIndex].toLowerCase();
+ // Dialogue has to be retrieved so that the rival's expressions can be loaded and shown via getCharVariantFromDialogue
+ const dialogue = i18next.t(dialogueKey, { context: genderStr });
+ this.scene.charSprite.showCharacter(`rival_${this.scene.gameData.gender === PlayerGender.FEMALE ? "m" : "f"}`, getCharVariantFromDialogue(dialogue)).then(() => {
+ this.scene.ui.showDialogue(dialogueKey, this.scene.gameData.gender === PlayerGender.FEMALE ? trainerConfigs[TrainerType.RIVAL].name : trainerConfigs[TrainerType.RIVAL].nameFemale, null, () => {
this.scene.ui.fadeOut(500).then(() => {
this.scene.charSprite.hide().then(() => {
const endCardPhase = new EndCardPhase(this.scene);
diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts
index 5a9a16b6f5e..201019e8860 100644
--- a/src/phases/learn-move-phase.ts
+++ b/src/phases/learn-move-phase.ts
@@ -12,11 +12,13 @@ import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-pha
export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
private moveId: Moves;
+ private fromTM: boolean;
- constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves) {
+ constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves, fromTM?: boolean) {
super(scene, partyMemberIndex);
this.moveId = moveId;
+ this.fromTM = fromTM ?? false;
}
start() {
@@ -41,6 +43,9 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
if (emptyMoveIndex > -1) {
pokemon.setMove(emptyMoveIndex, this.moveId);
+ if (this.fromTM) {
+ pokemon.usedTMs.push(this.moveId);
+ }
initMoveAnim(this.scene, this.moveId).then(() => {
loadMoveAnimAssets(this.scene, [this.moveId], true)
.then(() => {
@@ -85,6 +90,9 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase {
this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => {
this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }), null, () => { // TODO: is the bang correct?
this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => {
+ if (this.fromTM) {
+ pokemon.usedTMs.push(this.moveId);
+ }
pokemon.setMove(moveIndex, Moves.NONE);
this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId));
this.end();
diff --git a/src/phases/move-phase.ts b/src/phases/move-phase.ts
index c446660b16f..e2893d587a7 100644
--- a/src/phases/move-phase.ts
+++ b/src/phases/move-phase.ts
@@ -1,9 +1,9 @@
import BattleScene from "#app/battle-scene.js";
import { BattlerIndex } from "#app/battle.js";
-import { applyAbAttrs, RedirectMoveAbAttr, BlockRedirectAbAttr, IncreasePpAbAttr, applyPreAttackAbAttrs, PokemonTypeChangeAbAttr, applyPostMoveUsedAbAttrs, PostMoveUsedAbAttr } from "#app/data/ability.js";
+import { applyAbAttrs, applyPostMoveUsedAbAttrs, applyPreAttackAbAttrs, BlockRedirectAbAttr, IncreasePpAbAttr, PokemonTypeChangeAbAttr, PostMoveUsedAbAttr, RedirectMoveAbAttr } from "#app/data/ability.js";
import { CommonAnim } from "#app/data/battle-anims.js";
-import { CenterOfAttentionTag, BattlerTagLapseType } from "#app/data/battler-tags.js";
-import { MoveFlags, BypassRedirectAttr, allMoves, CopyMoveAttr, applyMoveAttrs, BypassSleepAttr, HealStatusEffectAttr, ChargeAttr, PreMoveMessageAttr } from "#app/data/move.js";
+import { BattlerTagLapseType, CenterOfAttentionTag } from "#app/data/battler-tags.js";
+import { allMoves, applyMoveAttrs, BypassRedirectAttr, BypassSleepAttr, ChargeAttr, CopyMoveAttr, HealStatusEffectAttr, MoveFlags, PreMoveMessageAttr } from "#app/data/move.js";
import { SpeciesFormChangePreMoveTrigger } from "#app/data/pokemon-forms.js";
import { getStatusEffectActivationText, getStatusEffectHealText } from "#app/data/status-effect.js";
import { Type } from "#app/data/type.js";
@@ -13,10 +13,10 @@ import { BattlerTagType } from "#app/enums/battler-tag-type.js";
import { Moves } from "#app/enums/moves.js";
import { StatusEffect } from "#app/enums/status-effect.js";
import { MoveUsedEvent } from "#app/events/battle-scene.js";
-import Pokemon, { PokemonMove, MoveResult, TurnMove } from "#app/field/pokemon.js";
+import Pokemon, { MoveResult, PokemonMove, TurnMove } from "#app/field/pokemon.js";
import { getPokemonNameWithAffix } from "#app/messages.js";
-import i18next from "i18next";
import * as Utils from "#app/utils.js";
+import i18next from "i18next";
import { BattlePhase } from "./battle-phase";
import { CommonAnimPhase } from "./common-anim-phase";
import { MoveEffectPhase } from "./move-effect-phase";
@@ -38,8 +38,8 @@ export class MovePhase extends BattlePhase {
this.pokemon = pokemon;
this.targets = targets;
this.move = move;
- this.followUp = !!followUp;
- this.ignorePp = !!ignorePp;
+ this.followUp = followUp ?? false;
+ this.ignorePp = ignorePp ?? false;
this.failed = false;
this.cancelled = false;
}
@@ -194,7 +194,7 @@ export class MovePhase extends BattlePhase {
return this.end();
}
- if (!moveQueue.length || !moveQueue.shift()?.ignorePP) { // using .shift here clears out two turn moves once they've been used
+ if ((!moveQueue.length || !moveQueue.shift()?.ignorePP) && !this.ignorePp) { // using .shift here clears out two turn moves once they've been used
this.move.usePp(ppUsed);
this.scene.eventTarget.dispatchEvent(new MoveUsedEvent(this.pokemon?.id, this.move.getMove(), this.move.ppUsed));
}
diff --git a/src/phases/stat-change-phase.ts b/src/phases/stat-change-phase.ts
deleted file mode 100644
index 856d0a33eea..00000000000
--- a/src/phases/stat-change-phase.ts
+++ /dev/null
@@ -1,234 +0,0 @@
-import BattleScene from "#app/battle-scene.js";
-import { BattlerIndex } from "#app/battle.js";
-import { applyPreStatChangeAbAttrs, ProtectStatAbAttr, applyAbAttrs, StatChangeMultiplierAbAttr, StatChangeCopyAbAttr, applyPostStatChangeAbAttrs, PostStatChangeAbAttr } from "#app/data/ability.js";
-import { MistTag, ArenaTagSide } from "#app/data/arena-tag.js";
-import { BattleStat, getBattleStatName, getBattleStatLevelChangeDescription } from "#app/data/battle-stat.js";
-import Pokemon from "#app/field/pokemon.js";
-import { getPokemonNameWithAffix } from "#app/messages.js";
-import { PokemonResetNegativeStatStageModifier } from "#app/modifier/modifier.js";
-import { handleTutorial, Tutorial } from "#app/tutorial.js";
-import i18next from "i18next";
-import * as Utils from "#app/utils.js";
-import { PokemonPhase } from "./pokemon-phase";
-
-export type StatChangeCallback = (target: Pokemon | null, changed: BattleStat[], relativeChanges: number[]) => void;
-
-export class StatChangePhase extends PokemonPhase {
- private stats: BattleStat[];
- private selfTarget: boolean;
- private levels: integer;
- private showMessage: boolean;
- private ignoreAbilities: boolean;
- private canBeCopied: boolean;
- private onChange: StatChangeCallback | null;
-
-
- constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], levels: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatChangeCallback | null = null) {
- super(scene, battlerIndex);
-
- this.selfTarget = selfTarget;
- this.stats = stats;
- this.levels = levels;
- this.showMessage = showMessage;
- this.ignoreAbilities = ignoreAbilities;
- this.canBeCopied = canBeCopied;
- this.onChange = onChange;
- }
-
- start() {
- const pokemon = this.getPokemon();
-
- let random = false;
-
- if (this.stats.length === 1 && this.stats[0] === BattleStat.RAND) {
- this.stats[0] = this.getRandomStat();
- random = true;
- }
-
- this.aggregateStatChanges(random);
-
- if (!pokemon.isActive(true)) {
- return this.end();
- }
-
- const filteredStats = this.stats.map(s => s !== BattleStat.RAND ? s : this.getRandomStat()).filter(stat => {
- const cancelled = new Utils.BooleanHolder(false);
-
- if (!this.selfTarget && this.levels < 0) {
- this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, cancelled);
- }
-
- if (!cancelled.value && !this.selfTarget && this.levels < 0) {
- applyPreStatChangeAbAttrs(ProtectStatAbAttr, this.getPokemon(), stat, cancelled);
- }
-
- return !cancelled.value;
- });
-
- const levels = new Utils.IntegerHolder(this.levels);
-
- if (!this.ignoreAbilities) {
- applyAbAttrs(StatChangeMultiplierAbAttr, pokemon, null, false, levels);
- }
-
- const battleStats = this.getPokemon().summonData.battleStats;
- const relLevels = filteredStats.map(stat => (levels.value >= 1 ? Math.min(battleStats![stat] + levels.value, 6) : Math.max(battleStats![stat] + levels.value, -6)) - battleStats![stat]);
-
- this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels);
-
- const end = () => {
- if (this.showMessage) {
- const messages = this.getStatChangeMessages(filteredStats, levels.value, relLevels);
- for (const message of messages) {
- this.scene.queueMessage(message);
- }
- }
-
- for (const stat of filteredStats) {
- pokemon.summonData.battleStats[stat] = Math.max(Math.min(pokemon.summonData.battleStats[stat] + levels.value, 6), -6);
- }
-
- if (levels.value > 0 && this.canBeCopied) {
- for (const opponent of pokemon.getOpponents()) {
- applyAbAttrs(StatChangeCopyAbAttr, opponent, null, false, this.stats, levels.value);
- }
- }
-
- applyPostStatChangeAbAttrs(PostStatChangeAbAttr, pokemon, filteredStats, this.levels, this.selfTarget);
-
- // Look for any other stat change phases; if this is the last one, do White Herb check
- const existingPhase = this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex);
- if (!(existingPhase instanceof StatChangePhase)) {
- // Apply White Herb if needed
- const whiteHerb = this.scene.applyModifier(PokemonResetNegativeStatStageModifier, this.player, pokemon) as PokemonResetNegativeStatStageModifier;
- // If the White Herb was applied, consume it
- if (whiteHerb) {
- --whiteHerb.stackCount;
- if (whiteHerb.stackCount <= 0) {
- this.scene.removeModifier(whiteHerb);
- }
- this.scene.updateModifiers(this.player);
- }
- }
-
- pokemon.updateInfo();
-
- handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end());
- };
-
- if (relLevels.filter(l => l).length && this.scene.moveAnimations) {
- pokemon.enableMask();
- const pokemonMaskSprite = pokemon.maskSprite;
-
- const tileX = (this.player ? 106 : 236) * pokemon.getSpriteScale() * this.scene.field.scale;
- const tileY = ((this.player ? 148 : 84) + (levels.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * this.scene.field.scale;
- const tileWidth = 156 * this.scene.field.scale * pokemon.getSpriteScale();
- const tileHeight = 316 * this.scene.field.scale * pokemon.getSpriteScale();
-
- // On increase, show the red sprite located at ATK
- // On decrease, show the blue sprite located at SPD
- const spriteColor = levels.value >= 1 ? BattleStat[BattleStat.ATK].toLowerCase() : BattleStat[BattleStat.SPD].toLowerCase();
- const statSprite = this.scene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, "battle_stats", spriteColor);
- statSprite.setPipeline(this.scene.fieldSpritePipeline);
- statSprite.setAlpha(0);
- statSprite.setScale(6);
- statSprite.setOrigin(0.5, 1);
-
- this.scene.playSound(`se/stat_${levels.value >= 1 ? "up" : "down"}`);
-
- statSprite.setMask(new Phaser.Display.Masks.BitmapMask(this.scene, pokemonMaskSprite ?? undefined));
-
- this.scene.tweens.add({
- targets: statSprite,
- duration: 250,
- alpha: 0.8375,
- onComplete: () => {
- this.scene.tweens.add({
- targets: statSprite,
- delay: 1000,
- duration: 250,
- alpha: 0
- });
- }
- });
-
- this.scene.tweens.add({
- targets: statSprite,
- duration: 1500,
- y: `${levels.value >= 1 ? "-" : "+"}=${160 * 6}`
- });
-
- this.scene.time.delayedCall(1750, () => {
- pokemon.disableMask();
- end();
- });
- } else {
- end();
- }
- }
-
- getRandomStat(): BattleStat {
- const allStats = Utils.getEnumValues(BattleStat);
- return this.getPokemon() ? allStats[this.getPokemon()!.randSeedInt(BattleStat.SPD + 1)] : BattleStat.ATK; // TODO: return default ATK on random? idk...
- }
-
- aggregateStatChanges(random: boolean = false): void {
- const isAccEva = [BattleStat.ACC, BattleStat.EVA].some(s => this.stats.includes(s));
- let existingPhase: StatChangePhase;
- if (this.stats.length === 1) {
- while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1
- && (p.stats[0] === this.stats[0] || (random && p.stats[0] === BattleStat.RAND))
- && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) {
- if (existingPhase.stats[0] === BattleStat.RAND) {
- existingPhase.stats[0] = this.getRandomStat();
- if (existingPhase.stats[0] !== this.stats[0]) {
- continue;
- }
- }
- this.levels += existingPhase.levels;
-
- if (!this.scene.tryRemovePhase(p => p === existingPhase)) {
- break;
- }
- }
- }
- while ((existingPhase = (this.scene.findPhase(p => p instanceof StatChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget
- && ([BattleStat.ACC, BattleStat.EVA].some(s => p.stats.includes(s)) === isAccEva)
- && p.levels === this.levels && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatChangePhase))) {
- this.stats.push(...existingPhase.stats);
- if (!this.scene.tryRemovePhase(p => p === existingPhase)) {
- break;
- }
- }
- }
-
- getStatChangeMessages(stats: BattleStat[], levels: integer, relLevels: integer[]): string[] {
- const messages: string[] = [];
-
- const relLevelStatIndexes = {};
- for (let rl = 0; rl < relLevels.length; rl++) {
- const relLevel = relLevels[rl];
- if (!relLevelStatIndexes[relLevel]) {
- relLevelStatIndexes[relLevel] = [];
- }
- relLevelStatIndexes[relLevel].push(rl);
- }
-
- Object.keys(relLevelStatIndexes).forEach(rl => {
- const relLevelStats = stats.filter((_, i) => relLevelStatIndexes[rl].includes(i));
- let statsFragment = "";
-
- if (relLevelStats.length > 1) {
- statsFragment = relLevelStats.length >= 5
- ? i18next.t("battle:stats")
- : `${relLevelStats.slice(0, -1).map(s => getBattleStatName(s)).join(", ")}${relLevelStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${getBattleStatName(relLevelStats[relLevelStats.length - 1])}`;
- messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1, relLevelStats.length));
- } else {
- statsFragment = getBattleStatName(relLevelStats[0]);
- messages.push(getBattleStatLevelChangeDescription(getPokemonNameWithAffix(this.getPokemon()), statsFragment, Math.abs(parseInt(rl)), levels >= 1, relLevelStats.length));
- }
- });
-
- return messages;
- }
-}
diff --git a/src/phases/stat-stage-change-phase.ts b/src/phases/stat-stage-change-phase.ts
new file mode 100644
index 00000000000..55faaa29903
--- /dev/null
+++ b/src/phases/stat-stage-change-phase.ts
@@ -0,0 +1,244 @@
+import { BattlerIndex } from "#app/battle";
+import BattleScene from "#app/battle-scene";
+import { applyAbAttrs, applyPostStatStageChangeAbAttrs, applyPreStatStageChangeAbAttrs, PostStatStageChangeAbAttr, ProtectStatAbAttr, StatStageChangeCopyAbAttr, StatStageChangeMultiplierAbAttr } from "#app/data/ability";
+import { ArenaTagSide, MistTag } from "#app/data/arena-tag";
+import Pokemon from "#app/field/pokemon";
+import { getPokemonNameWithAffix } from "#app/messages";
+import { ResetNegativeStatStageModifier } from "#app/modifier/modifier";
+import { handleTutorial, Tutorial } from "#app/tutorial";
+import * as Utils from "#app/utils";
+import i18next from "i18next";
+import { PokemonPhase } from "./pokemon-phase";
+import { Stat, type BattleStat, getStatKey, getStatStageChangeDescriptionKey } from "#enums/stat";
+
+export type StatStageChangeCallback = (target: Pokemon | null, changed: BattleStat[], relativeChanges: number[]) => void;
+
+export class StatStageChangePhase extends PokemonPhase {
+ private stats: BattleStat[];
+ private selfTarget: boolean;
+ private stages: integer;
+ private showMessage: boolean;
+ private ignoreAbilities: boolean;
+ private canBeCopied: boolean;
+ private onChange: StatStageChangeCallback | null;
+
+
+ constructor(scene: BattleScene, battlerIndex: BattlerIndex, selfTarget: boolean, stats: BattleStat[], stages: integer, showMessage: boolean = true, ignoreAbilities: boolean = false, canBeCopied: boolean = true, onChange: StatStageChangeCallback | null = null) {
+ super(scene, battlerIndex);
+
+ this.selfTarget = selfTarget;
+ this.stats = stats;
+ this.stages = stages;
+ this.showMessage = showMessage;
+ this.ignoreAbilities = ignoreAbilities;
+ this.canBeCopied = canBeCopied;
+ this.onChange = onChange;
+ }
+
+ start() {
+ const pokemon = this.getPokemon();
+
+ if (!pokemon.isActive(true)) {
+ return this.end();
+ }
+
+ let simulate = false;
+
+ const filteredStats = this.stats.filter(stat => {
+ const cancelled = new Utils.BooleanHolder(false);
+
+ if (!this.selfTarget && this.stages < 0) {
+ // TODO: Include simulate boolean when tag applications can be simulated
+ this.scene.arena.applyTagsForSide(MistTag, pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY, cancelled);
+ }
+
+ if (!cancelled.value && !this.selfTarget && this.stages < 0) {
+ applyPreStatStageChangeAbAttrs(ProtectStatAbAttr, pokemon, stat, cancelled, simulate);
+ }
+
+ // If one stat stage decrease is cancelled, simulate the rest of the applications
+ if (cancelled.value) {
+ simulate = true;
+ }
+
+ return !cancelled.value;
+ });
+
+ const stages = new Utils.IntegerHolder(this.stages);
+
+ if (!this.ignoreAbilities) {
+ applyAbAttrs(StatStageChangeMultiplierAbAttr, pokemon, null, false, stages);
+ }
+
+ const relLevels = filteredStats.map(s => (stages.value >= 1 ? Math.min(pokemon.getStatStage(s) + stages.value, 6) : Math.max(pokemon.getStatStage(s) + stages.value, -6)) - pokemon.getStatStage(s));
+
+ this.onChange && this.onChange(this.getPokemon(), filteredStats, relLevels);
+
+ const end = () => {
+ if (this.showMessage) {
+ const messages = this.getStatStageChangeMessages(filteredStats, stages.value, relLevels);
+ for (const message of messages) {
+ this.scene.queueMessage(message);
+ }
+ }
+
+ for (const s of filteredStats) {
+ if (stages.value > 0 && pokemon.getStatStage(s) < 6) {
+ if (!pokemon.turnData) {
+ // Temporary fix for missing turn data struct on turn 1
+ pokemon.resetTurnData();
+ }
+ pokemon.turnData.statStagesIncreased = true;
+ } else if (stages.value < 0 && pokemon.getStatStage(s) > -6) {
+ if (!pokemon.turnData) {
+ // Temporary fix for missing turn data struct on turn 1
+ pokemon.resetTurnData();
+ }
+ pokemon.turnData.statStagesDecreased = true;
+ }
+
+ pokemon.setStatStage(s, pokemon.getStatStage(s) + stages.value);
+ }
+
+ if (stages.value > 0 && this.canBeCopied) {
+ for (const opponent of pokemon.getOpponents()) {
+ applyAbAttrs(StatStageChangeCopyAbAttr, opponent, null, false, this.stats, stages.value);
+ }
+ }
+
+ applyPostStatStageChangeAbAttrs(PostStatStageChangeAbAttr, pokemon, filteredStats, this.stages, this.selfTarget);
+
+ // Look for any other stat change phases; if this is the last one, do White Herb check
+ const existingPhase = this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex);
+ if (!(existingPhase instanceof StatStageChangePhase)) {
+ // Apply White Herb if needed
+ const whiteHerb = this.scene.applyModifier(ResetNegativeStatStageModifier, this.player, pokemon) as ResetNegativeStatStageModifier;
+ // If the White Herb was applied, consume it
+ if (whiteHerb) {
+ whiteHerb.stackCount--;
+ if (whiteHerb.stackCount <= 0) {
+ this.scene.removeModifier(whiteHerb);
+ }
+ this.scene.updateModifiers(this.player);
+ }
+ }
+
+ pokemon.updateInfo();
+
+ handleTutorial(this.scene, Tutorial.Stat_Change).then(() => super.end());
+ };
+
+ if (relLevels.filter(l => l).length && this.scene.moveAnimations) {
+ pokemon.enableMask();
+ const pokemonMaskSprite = pokemon.maskSprite;
+
+ const tileX = (this.player ? 106 : 236) * pokemon.getSpriteScale() * this.scene.field.scale;
+ const tileY = ((this.player ? 148 : 84) + (stages.value >= 1 ? 160 : 0)) * pokemon.getSpriteScale() * this.scene.field.scale;
+ const tileWidth = 156 * this.scene.field.scale * pokemon.getSpriteScale();
+ const tileHeight = 316 * this.scene.field.scale * pokemon.getSpriteScale();
+
+ // On increase, show the red sprite located at ATK
+ // On decrease, show the blue sprite located at SPD
+ const spriteColor = stages.value >= 1 ? Stat[Stat.ATK].toLowerCase() : Stat[Stat.SPD].toLowerCase();
+ const statSprite = this.scene.add.tileSprite(tileX, tileY, tileWidth, tileHeight, "battle_stats", spriteColor);
+ statSprite.setPipeline(this.scene.fieldSpritePipeline);
+ statSprite.setAlpha(0);
+ statSprite.setScale(6);
+ statSprite.setOrigin(0.5, 1);
+
+ this.scene.playSound(`se/stat_${stages.value >= 1 ? "up" : "down"}`);
+
+ statSprite.setMask(new Phaser.Display.Masks.BitmapMask(this.scene, pokemonMaskSprite ?? undefined));
+
+ this.scene.tweens.add({
+ targets: statSprite,
+ duration: 250,
+ alpha: 0.8375,
+ onComplete: () => {
+ this.scene.tweens.add({
+ targets: statSprite,
+ delay: 1000,
+ duration: 250,
+ alpha: 0
+ });
+ }
+ });
+
+ this.scene.tweens.add({
+ targets: statSprite,
+ duration: 1500,
+ y: `${stages.value >= 1 ? "-" : "+"}=${160 * 6}`
+ });
+
+ this.scene.time.delayedCall(1750, () => {
+ pokemon.disableMask();
+ end();
+ });
+ } else {
+ end();
+ }
+ }
+
+ aggregateStatStageChanges(): void {
+ const accEva: BattleStat[] = [ Stat.ACC, Stat.EVA ];
+ const isAccEva = accEva.some(s => this.stats.includes(s));
+ let existingPhase: StatStageChangePhase;
+ if (this.stats.length === 1) {
+ while ((existingPhase = (this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.stats.length === 1
+ && (p.stats[0] === this.stats[0])
+ && p.selfTarget === this.selfTarget && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) {
+ this.stages += existingPhase.stages;
+
+ if (!this.scene.tryRemovePhase(p => p === existingPhase)) {
+ break;
+ }
+ }
+ }
+ while ((existingPhase = (this.scene.findPhase(p => p instanceof StatStageChangePhase && p.battlerIndex === this.battlerIndex && p.selfTarget === this.selfTarget
+ && (accEva.some(s => p.stats.includes(s)) === isAccEva)
+ && p.stages === this.stages && p.showMessage === this.showMessage && p.ignoreAbilities === this.ignoreAbilities) as StatStageChangePhase))) {
+ this.stats.push(...existingPhase.stats);
+ if (!this.scene.tryRemovePhase(p => p === existingPhase)) {
+ break;
+ }
+ }
+ }
+
+ getStatStageChangeMessages(stats: BattleStat[], stages: integer, relStages: integer[]): string[] {
+ const messages: string[] = [];
+
+ const relStageStatIndexes = {};
+ for (let rl = 0; rl < relStages.length; rl++) {
+ const relStage = relStages[rl];
+ if (!relStageStatIndexes[relStage]) {
+ relStageStatIndexes[relStage] = [];
+ }
+ relStageStatIndexes[relStage].push(rl);
+ }
+
+ Object.keys(relStageStatIndexes).forEach(rl => {
+ const relStageStats = stats.filter((_, i) => relStageStatIndexes[rl].includes(i));
+ let statsFragment = "";
+
+ if (relStageStats.length > 1) {
+ statsFragment = relStageStats.length >= 5
+ ? i18next.t("battle:stats")
+ : `${relStageStats.slice(0, -1).map(s => i18next.t(getStatKey(s))).join(", ")}${relStageStats.length > 2 ? "," : ""} ${i18next.t("battle:statsAnd")} ${i18next.t(getStatKey(relStageStats[relStageStats.length - 1]))}`;
+ messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), {
+ pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()),
+ stats: statsFragment,
+ count: relStageStats.length
+ }));
+ } else {
+ statsFragment = i18next.t(getStatKey(relStageStats[0]));
+ messages.push(i18next.t(getStatStageChangeDescriptionKey(Math.abs(parseInt(rl)), stages >= 1), {
+ pokemonNameWithAffix: getPokemonNameWithAffix(this.getPokemon()),
+ stats: statsFragment,
+ count: relStageStats.length
+ }));
+ }
+ });
+
+ return messages;
+ }
+}
diff --git a/src/phases/switch-summon-phase.ts b/src/phases/switch-summon-phase.ts
index 68dc8f8bf65..8201f2879ed 100644
--- a/src/phases/switch-summon-phase.ts
+++ b/src/phases/switch-summon-phase.ts
@@ -71,7 +71,7 @@ export class SwitchSummonPhase extends SummonPhase {
i18next.t("battle:playerComeBack", { pokemonName: getPokemonNameWithAffix(pokemon) }) :
i18next.t("battle:trainerComeBack", {
trainerName: this.scene.currentBattle.trainer?.getName(!(this.fieldIndex % 2) ? TrainerSlot.TRAINER : TrainerSlot.TRAINER_PARTNER),
- pokemonName: getPokemonNameWithAffix(pokemon)
+ pokemonName: pokemon.getNameToRender()
})
);
this.scene.playSound("se/pb_rel");
diff --git a/src/phases/title-phase.ts b/src/phases/title-phase.ts
index c74dca97f5c..4c89b725c2d 100644
--- a/src/phases/title-phase.ts
+++ b/src/phases/title-phase.ts
@@ -293,7 +293,7 @@ export class TitlePhase extends Phase {
}
for (const achv of Object.keys(this.scene.gameData.achvUnlocks)) {
- if (vouchers.hasOwnProperty(achv)) {
+ if (vouchers.hasOwnProperty(achv) && achv !== "CLASSIC_VICTORY") {
this.scene.validateVoucher(vouchers[achv]);
}
}
diff --git a/src/phases/turn-start-phase.ts b/src/phases/turn-start-phase.ts
index e4064fc784a..5c1af4228c6 100644
--- a/src/phases/turn-start-phase.ts
+++ b/src/phases/turn-start-phase.ts
@@ -1,12 +1,12 @@
-import BattleScene from "#app/battle-scene.js";
-import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr, ChangeMovePriorityAbAttr } from "#app/data/ability.js";
-import { allMoves, applyMoveAttrs, IncrementMovePriorityAttr, MoveHeaderAttr } from "#app/data/move.js";
-import { Abilities } from "#app/enums/abilities.js";
-import { Stat } from "#app/enums/stat.js";
-import { PokemonMove } from "#app/field/pokemon.js";
-import { BypassSpeedChanceModifier } from "#app/modifier/modifier.js";
-import { Command } from "#app/ui/command-ui-handler.js";
-import * as Utils from "#app/utils.js";
+import BattleScene from "#app/battle-scene";
+import { applyAbAttrs, BypassSpeedChanceAbAttr, PreventBypassSpeedChanceAbAttr, ChangeMovePriorityAbAttr } from "#app/data/ability";
+import { allMoves, applyMoveAttrs, IncrementMovePriorityAttr, MoveHeaderAttr } from "#app/data/move";
+import { Abilities } from "#app/enums/abilities";
+import { Stat } from "#app/enums/stat";
+import Pokemon, { PokemonMove } from "#app/field/pokemon";
+import { BypassSpeedChanceModifier } from "#app/modifier/modifier";
+import { Command } from "#app/ui/command-ui-handler";
+import * as Utils from "#app/utils";
import { AttemptCapturePhase } from "./attempt-capture-phase";
import { AttemptRunPhase } from "./attempt-run-phase";
import { BerryPhase } from "./berry-phase";
@@ -17,18 +17,59 @@ import { PostTurnStatusEffectPhase } from "./post-turn-status-effect-phase";
import { SwitchSummonPhase } from "./switch-summon-phase";
import { TurnEndPhase } from "./turn-end-phase";
import { WeatherEffectPhase } from "./weather-effect-phase";
+import { BattlerIndex } from "#app/battle";
+import { TrickRoomTag } from "#app/data/arena-tag";
export class TurnStartPhase extends FieldPhase {
constructor(scene: BattleScene) {
super(scene);
}
- start() {
- super.start();
+ /**
+ * This orders the active Pokemon on the field by speed into an BattlerIndex array and returns that array.
+ * It also checks for Trick Room and reverses the array if it is present.
+ * @returns {@linkcode BattlerIndex[]} the battle indices of all pokemon on the field ordered by speed
+ */
+ getSpeedOrder(): BattlerIndex[] {
+ const playerField = this.scene.getPlayerField().filter(p => p.isActive()) as Pokemon[];
+ const enemyField = this.scene.getEnemyField().filter(p => p.isActive()) as Pokemon[];
- const field = this.scene.getField();
- const order = this.getOrder();
+ // We shuffle the list before sorting so speed ties produce random results
+ let orderedTargets: Pokemon[] = playerField.concat(enemyField);
+ // We seed it with the current turn to prevent an inconsistency where it
+ // was varying based on how long since you last reloaded
+ this.scene.executeWithSeedOffset(() => {
+ orderedTargets = Utils.randSeedShuffle(orderedTargets);
+ }, this.scene.currentBattle.turn, this.scene.waveSeed);
+ orderedTargets.sort((a: Pokemon, b: Pokemon) => {
+ const aSpeed = a?.getEffectiveStat(Stat.SPD) || 0;
+ const bSpeed = b?.getEffectiveStat(Stat.SPD) || 0;
+
+ return bSpeed - aSpeed;
+ });
+
+ // Next, a check for Trick Room is applied. If Trick Room is present, the order is reversed.
+ const speedReversed = new Utils.BooleanHolder(false);
+ this.scene.arena.applyTags(TrickRoomTag, speedReversed);
+
+ if (speedReversed.value) {
+ orderedTargets = orderedTargets.reverse();
+ }
+
+ return orderedTargets.map(t => t.getFieldIndex() + (!t.isPlayer() ? BattlerIndex.ENEMY : BattlerIndex.PLAYER));
+ }
+
+ /**
+ * This takes the result of getSpeedOrder and applies priority / bypass speed attributes to it.
+ * This also considers the priority levels of various commands and changes the result of getSpeedOrder based on such.
+ * @returns {@linkcode BattlerIndex[]} the final sequence of commands for this turn
+ */
+ getCommandOrder(): BattlerIndex[] {
+ let moveOrder = this.getSpeedOrder();
+ // The creation of the battlerBypassSpeed object contains checks for the ability Quick Draw and the held item Quick Claw
+ // The ability Mycelium Might disables Quick Claw's activation when using a status move
+ // This occurs before the main loop because of battles with more than two Pokemon
const battlerBypassSpeed = {};
this.scene.getField(true).filter(p => p.summonData).map(p => {
@@ -42,8 +83,9 @@ export class TurnStartPhase extends FieldPhase {
battlerBypassSpeed[p.getBattlerIndex()] = bypassSpeed;
});
- const moveOrder = order.slice(0);
-
+ // The function begins sorting orderedTargets based on command priority, move priority, and possible speed bypasses.
+ // Non-FIGHT commands (SWITCH, BALL, RUN) have a higher command priority and will always occur before any FIGHT commands.
+ moveOrder = moveOrder.slice(0);
moveOrder.sort((a, b) => {
const aCommand = this.scene.currentBattle.turnCommands[a];
const bCommand = this.scene.currentBattle.turnCommands[b];
@@ -55,37 +97,50 @@ export class TurnStartPhase extends FieldPhase {
return -1;
}
} else if (aCommand?.command === Command.FIGHT) {
- const aMove = allMoves[aCommand.move!.move];//TODO: is the bang correct here?
- const bMove = allMoves[bCommand!.move!.move];//TODO: is the bang correct here?
+ const aMove = allMoves[aCommand.move!.move];
+ const bMove = allMoves[bCommand!.move!.move];
+ // The game now considers priority and applies the relevant move and ability attributes
const aPriority = new Utils.IntegerHolder(aMove.priority);
const bPriority = new Utils.IntegerHolder(bMove.priority);
- applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, aMove, aPriority); //TODO: is the bang correct here?
- applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, bMove, bPriority); //TODO: is the bang correct here?
+ applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, aMove, aPriority);
+ applyMoveAttrs(IncrementMovePriorityAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, bMove, bPriority);
- applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, false, aMove, aPriority); //TODO: is the bang correct here?
- applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, false, bMove, bPriority); //TODO: is the bang correct here?
+ applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === a)!, null, false, aMove, aPriority);
+ applyAbAttrs(ChangeMovePriorityAbAttr, this.scene.getField().find(p => p?.isActive() && p.getBattlerIndex() === b)!, null, false, bMove, bPriority);
+ // The game now checks for differences in priority levels.
+ // If the moves share the same original priority bracket, it can check for differences in battlerBypassSpeed and return the result.
+ // This conditional is used to ensure that Quick Claw can still activate with abilities like Stall and Mycelium Might (attack moves only)
+ // Otherwise, the game returns the user of the move with the highest priority.
+ const isSameBracket = Math.ceil(aPriority.value) - Math.ceil(bPriority.value) === 0;
if (aPriority.value !== bPriority.value) {
- const bracketDifference = Math.ceil(aPriority.value) - Math.ceil(bPriority.value);
- const hasSpeedDifference = battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value;
- if (bracketDifference === 0 && hasSpeedDifference) {
+ if (isSameBracket && battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) {
return battlerBypassSpeed[a].value ? -1 : 1;
}
return aPriority.value < bPriority.value ? 1 : -1;
}
}
+ // If there is no difference between the move's calculated priorities, the game checks for differences in battlerBypassSpeed and returns the result.
if (battlerBypassSpeed[a].value !== battlerBypassSpeed[b].value) {
return battlerBypassSpeed[a].value ? -1 : 1;
}
- const aIndex = order.indexOf(a);
- const bIndex = order.indexOf(b);
+ const aIndex = moveOrder.indexOf(a);
+ const bIndex = moveOrder.indexOf(b);
return aIndex < bIndex ? -1 : aIndex > bIndex ? 1 : 0;
});
+ return moveOrder;
+ }
+
+ start() {
+ super.start();
+
+ const field = this.scene.getField();
+ const moveOrder = this.getCommandOrder();
let orderIndex = 0;
@@ -150,10 +205,9 @@ export class TurnStartPhase extends FieldPhase {
}
}
-
this.scene.pushPhase(new WeatherEffectPhase(this.scene));
- for (const o of order) {
+ for (const o of moveOrder) {
if (field[o].status && field[o].status.isPostTurn()) {
this.scene.pushPhase(new PostTurnStatusEffectPhase(this.scene, o));
}
diff --git a/src/system/achv.ts b/src/system/achv.ts
index 0f9bc5ac6de..89e5493eb2e 100644
--- a/src/system/achv.ts
+++ b/src/system/achv.ts
@@ -5,8 +5,10 @@ import { pokemonEvolutions } from "#app/data/pokemon-evolutions";
import i18next from "i18next";
import * as Utils from "../utils";
import { PlayerGender } from "#enums/player-gender";
-import { Challenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge } from "#app/data/challenge.js";
-import { ConditionFn } from "#app/@types/common.js";
+import { Challenge, FreshStartChallenge, SingleGenerationChallenge, SingleTypeChallenge, InverseBattleChallenge } from "#app/data/challenge";
+import { ConditionFn } from "#app/@types/common";
+import { Stat, getShortenedStatKey } from "#app/enums/stat";
+import { Challenges } from "#app/enums/challenges";
export enum AchvTier {
COMMON,
@@ -137,8 +139,8 @@ export class ModifierAchv extends Achv {
}
export class ChallengeAchv extends Achv {
- constructor(localizationKey: string, name: string, description: string, iconImage: string, score: integer, challengeFunc: (challenge: Challenge) => boolean) {
- super(localizationKey, name, description, iconImage, score, (_scene: BattleScene, args: any[]) => challengeFunc((args[0] as Challenge)));
+ constructor(localizationKey: string, name: string, description: string, iconImage: string, score: integer, challengeFunc: (challenge: Challenge, scene: BattleScene) => boolean) {
+ super(localizationKey, name, description, iconImage, score, (_scene: BattleScene, args: any[]) => challengeFunc(args[0] as Challenge, _scene));
}
}
@@ -171,13 +173,13 @@ export function getAchievementDescription(localizationKey: string): string {
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("pokemonInfo:Stat.HPshortened")});
+ 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("pokemonInfo:Stat.HPshortened")});
+ 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("pokemonInfo:Stat.HPshortened")});
+ 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("pokemonInfo:Stat.HPshortened")});
+ 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":
@@ -194,7 +196,7 @@ export function getAchievementDescription(localizationKey: string): string {
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_BATTLE_STAT":
+ case "TRANSFER_MAX_STAT_STAGE":
return i18next.t("achv:TRANSFER_MAX_BATTLE_STAT.description", { context: genderStr });
case "MAX_FRIENDSHIP":
return i18next.t("achv:MAX_FRIENDSHIP.description", { context: genderStr });
@@ -275,6 +277,8 @@ export function getAchievementDescription(localizationKey: string): string {
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 });
default:
return "";
}
@@ -302,7 +306,7 @@ export const achvs = {
_50_RIBBONS: new RibbonAchv("50_RIBBONS", "", 50, "ultra_ribbon", 50).setSecret(true),
_75_RIBBONS: new RibbonAchv("75_RIBBONS", "", 75, "rogue_ribbon", 75).setSecret(true),
_100_RIBBONS: new RibbonAchv("100_RIBBONS", "", 100, "master_ribbon", 100).setSecret(true),
- TRANSFER_MAX_BATTLE_STAT: new Achv("TRANSFER_MAX_BATTLE_STAT", "", "TRANSFER_MAX_BATTLE_STAT.description", "baton", 20),
+ TRANSFER_MAX_STAT_STAGE: new Achv("TRANSFER_MAX_STAT_STAGE", "", "TRANSFER_MAX_STAT_STAGE.description", "baton", 20),
MAX_FRIENDSHIP: new Achv("MAX_FRIENDSHIP", "", "MAX_FRIENDSHIP.description", "soothe_bell", 25),
MEGA_EVOLVE: new Achv("MEGA_EVOLVE", "", "MEGA_EVOLVE.description", "mega_bracelet", 50),
GIGANTAMAX: new Achv("GIGANTAMAX", "", "GIGANTAMAX.description", "dynamax_band", 50),
@@ -321,36 +325,37 @@ export const achvs = {
HATCH_SHINY: new Achv("HATCH_SHINY", "", "HATCH_SHINY.description", "golden_egg", 100).setSecret(),
HIDDEN_ABILITY: new Achv("HIDDEN_ABILITY", "", "HIDDEN_ABILITY.description", "ability_charm", 75),
PERFECT_IVS: new Achv("PERFECT_IVS", "", "PERFECT_IVS.description", "blunder_policy", 100),
- CLASSIC_VICTORY: new Achv("CLASSIC_VICTORY", "", "CLASSIC_VICTORY.description", "relic_crown", 150),
+ CLASSIC_VICTORY: new Achv("CLASSIC_VICTORY", "", "CLASSIC_VICTORY.description", "relic_crown", 150, c => c.gameData.gameStats.sessionsWon === 0),
UNEVOLVED_CLASSIC_VICTORY: new Achv("UNEVOLVED_CLASSIC_VICTORY", "", "UNEVOLVED_CLASSIC_VICTORY.description", "eviolite", 175, c => c.getParty().some(p => p.getSpeciesForm(true).speciesId in pokemonEvolutions)),
- MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE", "", "MONO_GEN_ONE.description", "ribbon_gen1", 100, c => c instanceof SingleGenerationChallenge && c.value === 1),
- MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO", "", "MONO_GEN_TWO.description", "ribbon_gen2", 100, c => c instanceof SingleGenerationChallenge && c.value === 2),
- MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE", "", "MONO_GEN_THREE.description", "ribbon_gen3", 100, c => c instanceof SingleGenerationChallenge && c.value === 3),
- MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR", "", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, c => c instanceof SingleGenerationChallenge && c.value === 4),
- MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE", "", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, c => c instanceof SingleGenerationChallenge && c.value === 5),
- MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX", "", "MONO_GEN_SIX.description", "ribbon_gen6", 100, c => c instanceof SingleGenerationChallenge && c.value === 6),
- MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN", "", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, c => c instanceof SingleGenerationChallenge && c.value === 7),
- MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT", "", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, c => c instanceof SingleGenerationChallenge && c.value === 8),
- MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE", "", "MONO_GEN_NINE.description", "ribbon_gen9", 100, c => c instanceof SingleGenerationChallenge && c.value === 9),
- MONO_NORMAL: new ChallengeAchv("MONO_NORMAL", "", "MONO_NORMAL.description", "silk_scarf", 100, c => c instanceof SingleTypeChallenge && c.value === 1),
- MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING", "", "MONO_FIGHTING.description", "black_belt", 100, c => c instanceof SingleTypeChallenge && c.value === 2),
- MONO_FLYING: new ChallengeAchv("MONO_FLYING", "", "MONO_FLYING.description", "sharp_beak", 100, c => c instanceof SingleTypeChallenge && c.value === 3),
- MONO_POISON: new ChallengeAchv("MONO_POISON", "", "MONO_POISON.description", "poison_barb", 100, c => c instanceof SingleTypeChallenge && c.value === 4),
- MONO_GROUND: new ChallengeAchv("MONO_GROUND", "", "MONO_GROUND.description", "soft_sand", 100, c => c instanceof SingleTypeChallenge && c.value === 5),
- MONO_ROCK: new ChallengeAchv("MONO_ROCK", "", "MONO_ROCK.description", "hard_stone", 100, c => c instanceof SingleTypeChallenge && c.value === 6),
- MONO_BUG: new ChallengeAchv("MONO_BUG", "", "MONO_BUG.description", "silver_powder", 100, c => c instanceof SingleTypeChallenge && c.value === 7),
- MONO_GHOST: new ChallengeAchv("MONO_GHOST", "", "MONO_GHOST.description", "spell_tag", 100, c => c instanceof SingleTypeChallenge && c.value === 8),
- MONO_STEEL: new ChallengeAchv("MONO_STEEL", "", "MONO_STEEL.description", "metal_coat", 100, c => c instanceof SingleTypeChallenge && c.value === 9),
- MONO_FIRE: new ChallengeAchv("MONO_FIRE", "", "MONO_FIRE.description", "charcoal", 100, c => c instanceof SingleTypeChallenge && c.value === 10),
- MONO_WATER: new ChallengeAchv("MONO_WATER", "", "MONO_WATER.description", "mystic_water", 100, c => c instanceof SingleTypeChallenge && c.value === 11),
- MONO_GRASS: new ChallengeAchv("MONO_GRASS", "", "MONO_GRASS.description", "miracle_seed", 100, c => c instanceof SingleTypeChallenge && c.value === 12),
- MONO_ELECTRIC: new ChallengeAchv("MONO_ELECTRIC", "", "MONO_ELECTRIC.description", "magnet", 100, c => c instanceof SingleTypeChallenge && c.value === 13),
- MONO_PSYCHIC: new ChallengeAchv("MONO_PSYCHIC", "", "MONO_PSYCHIC.description", "twisted_spoon", 100, c => c instanceof SingleTypeChallenge && c.value === 14),
- MONO_ICE: new ChallengeAchv("MONO_ICE", "", "MONO_ICE.description", "never_melt_ice", 100, c => c instanceof SingleTypeChallenge && c.value === 15),
- MONO_DRAGON: new ChallengeAchv("MONO_DRAGON", "", "MONO_DRAGON.description", "dragon_fang", 100, c => c instanceof SingleTypeChallenge && c.value === 16),
- MONO_DARK: new ChallengeAchv("MONO_DARK", "", "MONO_DARK.description", "black_glasses", 100, c => c instanceof SingleTypeChallenge && c.value === 17),
- MONO_FAIRY: new ChallengeAchv("MONO_FAIRY", "", "MONO_FAIRY.description", "fairy_feather", 100, c => c instanceof SingleTypeChallenge && c.value === 18),
- FRESH_START: new ChallengeAchv("FRESH_START", "", "FRESH_START.description", "reviver_seed", 100, c => c instanceof FreshStartChallenge && c.value === 1),
+ MONO_GEN_ONE_VICTORY: new ChallengeAchv("MONO_GEN_ONE", "", "MONO_GEN_ONE.description", "ribbon_gen1", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 1 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_TWO_VICTORY: new ChallengeAchv("MONO_GEN_TWO", "", "MONO_GEN_TWO.description", "ribbon_gen2", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 2 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_THREE_VICTORY: new ChallengeAchv("MONO_GEN_THREE", "", "MONO_GEN_THREE.description", "ribbon_gen3", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 3 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_FOUR_VICTORY: new ChallengeAchv("MONO_GEN_FOUR", "", "MONO_GEN_FOUR.description", "ribbon_gen4", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 4 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_FIVE_VICTORY: new ChallengeAchv("MONO_GEN_FIVE", "", "MONO_GEN_FIVE.description", "ribbon_gen5", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 5 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_SIX_VICTORY: new ChallengeAchv("MONO_GEN_SIX", "", "MONO_GEN_SIX.description", "ribbon_gen6", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 6 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_SEVEN_VICTORY: new ChallengeAchv("MONO_GEN_SEVEN", "", "MONO_GEN_SEVEN.description", "ribbon_gen7", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 7 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_EIGHT_VICTORY: new ChallengeAchv("MONO_GEN_EIGHT", "", "MONO_GEN_EIGHT.description", "ribbon_gen8", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 8 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GEN_NINE_VICTORY: new ChallengeAchv("MONO_GEN_NINE", "", "MONO_GEN_NINE.description", "ribbon_gen9", 100, (c, scene) => c instanceof SingleGenerationChallenge && c.value === 9 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_NORMAL: new ChallengeAchv("MONO_NORMAL", "", "MONO_NORMAL.description", "silk_scarf", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 1 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_FIGHTING: new ChallengeAchv("MONO_FIGHTING", "", "MONO_FIGHTING.description", "black_belt", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 2 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_FLYING: new ChallengeAchv("MONO_FLYING", "", "MONO_FLYING.description", "sharp_beak", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 3 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_POISON: new ChallengeAchv("MONO_POISON", "", "MONO_POISON.description", "poison_barb", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 4 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GROUND: new ChallengeAchv("MONO_GROUND", "", "MONO_GROUND.description", "soft_sand", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 5 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_ROCK: new ChallengeAchv("MONO_ROCK", "", "MONO_ROCK.description", "hard_stone", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 6 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_BUG: new ChallengeAchv("MONO_BUG", "", "MONO_BUG.description", "silver_powder", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 7 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GHOST: new ChallengeAchv("MONO_GHOST", "", "MONO_GHOST.description", "spell_tag", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 8 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_STEEL: new ChallengeAchv("MONO_STEEL", "", "MONO_STEEL.description", "metal_coat", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 9 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_FIRE: new ChallengeAchv("MONO_FIRE", "", "MONO_FIRE.description", "charcoal", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 10 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_WATER: new ChallengeAchv("MONO_WATER", "", "MONO_WATER.description", "mystic_water", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 11 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_GRASS: new ChallengeAchv("MONO_GRASS", "", "MONO_GRASS.description", "miracle_seed", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 12 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_ELECTRIC: new ChallengeAchv("MONO_ELECTRIC", "", "MONO_ELECTRIC.description", "magnet", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 13 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_PSYCHIC: new ChallengeAchv("MONO_PSYCHIC", "", "MONO_PSYCHIC.description", "twisted_spoon", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 14 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_ICE: new ChallengeAchv("MONO_ICE", "", "MONO_ICE.description", "never_melt_ice", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 15 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_DRAGON: new ChallengeAchv("MONO_DRAGON", "", "MONO_DRAGON.description", "dragon_fang", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 16 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_DARK: new ChallengeAchv("MONO_DARK", "", "MONO_DARK.description", "black_glasses", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 17 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ MONO_FAIRY: new ChallengeAchv("MONO_FAIRY", "", "MONO_FAIRY.description", "fairy_feather", 100, (c, scene) => c instanceof SingleTypeChallenge && c.value === 18 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ FRESH_START: new ChallengeAchv("FRESH_START", "", "FRESH_START.description", "reviver_seed", 100, (c, scene) => c instanceof FreshStartChallenge && c.value > 0 && !scene.gameMode.challenges.some(c => c.id === Challenges.INVERSE_BATTLE && c.value > 0)),
+ INVERSE_BATTLE: new ChallengeAchv("INVERSE_BATTLE", "", "INVERSE_BATTLE.description", "inverse", 100, c => c instanceof InverseBattleChallenge && c.value > 0),
};
export function initAchievements() {
diff --git a/src/system/game-data.ts b/src/system/game-data.ts
index d10d6288696..1a47294906e 100644
--- a/src/system/game-data.ts
+++ b/src/system/game-data.ts
@@ -243,6 +243,8 @@ export class StarterPrefs {
if (pStr !== StarterPrefers_private_latest) {
// something changed, store the update
localStorage.setItem(`starterPrefs_${loggedInUser?.username}`, pStr);
+ // update the latest prefs
+ StarterPrefers_private_latest = pStr;
}
}
}
@@ -462,7 +464,7 @@ export class GameData {
const lsItemKey = `runHistoryData_${loggedInUser?.username}`;
const lsItem = localStorage.getItem(lsItemKey);
if (!lsItem) {
- localStorage.setItem(lsItemKey, encrypt("", true));
+ localStorage.setItem(lsItemKey, "");
}
this.trainerId = systemData.trainerId;
@@ -592,7 +594,7 @@ export class GameData {
if (lsItem) {
const cachedResponse = lsItem;
if (cachedResponse) {
- const runHistory = JSON.parse(decrypt(cachedResponse, true));
+ const runHistory = JSON.parse(decrypt(cachedResponse, bypassLogin));
return runHistory;
}
return {};
@@ -614,7 +616,7 @@ export class GameData {
if (lsItem) {
const cachedResponse = lsItem;
if (cachedResponse) {
- const runHistory : RunHistoryData = JSON.parse(decrypt(cachedResponse, true));
+ const runHistory : RunHistoryData = JSON.parse(decrypt(cachedResponse, bypassLogin));
return runHistory;
}
return {};
@@ -650,7 +652,7 @@ export class GameData {
isVictory: isVictory,
isFavorite: false,
};
- localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, encrypt(JSON.stringify(runHistoryData), true));
+ localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, encrypt(JSON.stringify(runHistoryData), bypassLogin));
/**
* Networking Code DO NOT DELETE
*
@@ -944,7 +946,7 @@ export class GameData {
return ret;
}
- private getSessionSaveData(scene: BattleScene): SessionSaveData {
+ public getSessionSaveData(scene: BattleScene): SessionSaveData {
return {
seed: scene.seed,
playTime: scene.sessionPlayTime,
@@ -1366,8 +1368,7 @@ export class GameData {
} else {
const data = localStorage.getItem(dataKey);
if (data) {
- handleData(decrypt(data, (dataType !== GameDataType.RUN_HISTORY) ? bypassLogin : true));
- // This conditional is necessary because at the moment, run history is stored locally only so it has to be decoded from Base64 as if it was local
+ handleData(decrypt(data, bypassLogin));
}
resolve(!!data);
}
@@ -1416,9 +1417,6 @@ export class GameData {
const entryKeys = Object.keys(data[key]);
valid = ["isFavorite", "isVictory", "entry"].every(v => entryKeys.includes(v)) && entryKeys.length === 3;
});
- if (valid) {
- localStorage.setItem(`runHistoryData_${loggedInUser?.username}`, dataStr);
- }
break;
case GameDataType.SETTINGS:
case GameDataType.TUTORIALS:
@@ -1490,7 +1488,7 @@ export class GameData {
};
}
- const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM;
+ const defaultStarterAttr = DexAttr.NON_SHINY | DexAttr.MALE | DexAttr.FEMALE | DexAttr.DEFAULT_VARIANT | DexAttr.DEFAULT_FORM;
const defaultStarterNatures: Nature[] = [];
@@ -1555,11 +1553,11 @@ export class GameData {
}
}
- setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false): Promise {
- return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg);
+ setPokemonCaught(pokemon: Pokemon, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise {
+ return this.setPokemonSpeciesCaught(pokemon, pokemon.species, incrementCount, fromEgg, showMessage);
}
- setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false): Promise {
+ setPokemonSpeciesCaught(pokemon: Pokemon, species: PokemonSpecies, incrementCount: boolean = true, fromEgg: boolean = false, showMessage: boolean = true): Promise {
return new Promise(resolve => {
const dexEntry = this.dexData[species.speciesId];
const caughtAttr = dexEntry.caughtAttr;
@@ -1618,13 +1616,17 @@ export class GameData {
const checkPrevolution = () => {
if (hasPrevolution) {
const prevolutionSpecies = pokemonPrevolutions[species.speciesId];
- return this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg).then(() => resolve());
+ this.setPokemonSpeciesCaught(pokemon, getPokemonSpecies(prevolutionSpecies), incrementCount, fromEgg, showMessage).then(() => resolve());
} else {
resolve();
}
};
if (newCatch && speciesStarters.hasOwnProperty(species.speciesId)) {
+ if (!showMessage) {
+ resolve();
+ return;
+ }
this.scene.playSound("level_up_fanfare");
this.scene.ui.showText(i18next.t("battle:addedAsAStarter", { pokemonName: species.name }), null, () => checkPrevolution(), null, true);
} else {
@@ -1670,7 +1672,7 @@ export class GameData {
this.starterData[species.speciesId].candyCount += count;
}
- setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: integer): Promise {
+ setEggMoveUnlocked(species: PokemonSpecies, eggMoveIndex: integer, showMessage: boolean = true): Promise {
return new Promise(resolve => {
const speciesId = species.speciesId;
if (!speciesEggMoves.hasOwnProperty(speciesId) || !speciesEggMoves[speciesId][eggMoveIndex]) {
@@ -1690,11 +1692,15 @@ export class GameData {
}
this.starterData[speciesId].eggMoves |= value;
-
+ if (!showMessage) {
+ resolve(true);
+ return;
+ }
this.scene.playSound("level_up_fanfare");
-
const moveName = allMoves[speciesEggMoves[speciesId][eggMoveIndex]].name;
- this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, () => resolve(true), null, true);
+ this.scene.ui.showText(eggMoveIndex === 3 ? i18next.t("egg:rareEggMoveUnlock", { moveName: moveName }) : i18next.t("egg:eggMoveUnlock", { moveName: moveName }), null, (() => {
+ resolve(true);
+ }), null, true);
});
}
@@ -1921,6 +1927,7 @@ export class GameData {
fixStarterData(systemData: SystemSaveData): void {
for (const starterId of defaultStarterSpecies) {
systemData.starterData[starterId].abilityAttr |= AbilityAttr.ABILITY_1;
+ systemData.dexData[starterId].caughtAttr |= DexAttr.FEMALE;
}
}
diff --git a/src/system/pokemon-data.ts b/src/system/pokemon-data.ts
index 8f094379434..9a743ceb1d2 100644
--- a/src/system/pokemon-data.ts
+++ b/src/system/pokemon-data.ts
@@ -42,6 +42,7 @@ export default class PokemonData {
public luck: integer;
public pauseEvolutions: boolean;
public pokerus: boolean;
+ public usedTMs: Moves[];
public fusionSpecies: Species;
public fusionFormIndex: integer;
@@ -98,6 +99,7 @@ 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.usedTMs = source.usedTMs ?? [];
if (!forHistory) {
this.boss = (source instanceof EnemyPokemon && !!source.bossSegments) || (!this.player && !!source.boss);
@@ -122,7 +124,8 @@ export default class PokemonData {
this.summonData = new PokemonSummonData();
if (!forHistory && source.summonData) {
- this.summonData.battleStats = source.summonData.battleStats;
+ this.summonData.stats = source.summonData.stats;
+ this.summonData.statStages = source.summonData.statStages;
this.summonData.moveQueue = source.summonData.moveQueue;
this.summonData.disabledMove = source.summonData.disabledMove;
this.summonData.disabledTurns = source.summonData.disabledTurns;
diff --git a/src/system/settings/settings.ts b/src/system/settings/settings.ts
index 7b0fea95a98..6b46b6fe96c 100644
--- a/src/system/settings/settings.ts
+++ b/src/system/settings/settings.ts
@@ -25,6 +25,7 @@ const VOLUME_OPTIONS: SettingOption[] = new Array(11).fill(null).map((_, i) => i
value: "Mute",
label: getTranslation("settings:mute")
});
+
const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).map((_, i) => {
const value = ((i + 1) * 10).toString();
return {
@@ -32,6 +33,7 @@ const SHOP_OVERLAY_OPACITY_OPTIONS: SettingOption[] = new Array(9).fill(null).ma
label: value,
};
});
+
const OFF_ON: SettingOption[] = [
{
value: "Off",
@@ -53,6 +55,40 @@ const AUTO_DISABLED: SettingOption[] = [
}
];
+const SHOP_CURSOR_TARGET_OPTIONS: SettingOption[] = [
+ {
+ value: "Rewards",
+ label: i18next.t("settings:rewards")
+ },
+ {
+ value: "Shop",
+ label: i18next.t("settings:shop")
+ },
+ {
+ value: "Reroll",
+ label: i18next.t("settings:reroll")
+ },
+ {
+ value: "Check Team",
+ label: i18next.t("settings:checkTeam")
+ }
+];
+
+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}`);
+ }
+});
+
/**
* Types for helping separate settings to different menus
*/
@@ -103,7 +139,7 @@ export const SettingKeys = {
Damage_Numbers: "DAMAGE_NUMBERS",
Move_Animations: "MOVE_ANIMATIONS",
Show_Stats_on_Level_Up: "SHOW_LEVEL_UP_STATS",
- Reroll_Target: "REROLL_TARGET",
+ Shop_Cursor_Target: "SHOP_CURSOR_TARGET",
Candy_Upgrade_Notification: "CANDY_UPGRADE_NOTIFICATION",
Candy_Upgrade_Display: "CANDY_UPGRADE_DISPLAY",
Move_Info: "MOVE_INFO",
@@ -596,27 +632,10 @@ export const Setting: Array = [
isHidden: () => !hasTouchscreen()
},
{
- key: SettingKeys.Reroll_Target,
+ key: SettingKeys.Shop_Cursor_Target,
label: i18next.t("settings:shopCursorTarget"),
- options: [
- {
- value:"Reroll",
- label: i18next.t("settings:reroll")
- },
- {
- value:"Items",
- label: i18next.t("settings:items")
- },
- {
- value:"Shop",
- label: i18next.t("settings:shop")
- },
- {
- value:"Check Team",
- label: i18next.t("settings:checkTeam")
- }
- ],
- default: ShopCursorTarget.CHECK_TEAM,
+ options: SHOP_CURSOR_TARGET_OPTIONS,
+ default: 0,
type: SettingType.DISPLAY
},
{
@@ -758,8 +777,10 @@ export function setSetting(scene: BattleScene, setting: string, value: integer):
case SettingKeys.Show_Stats_on_Level_Up:
scene.showLevelUpStats = Setting[index].options[value].value === "On";
break;
- case SettingKeys.Reroll_Target:
- scene.shopCursorTarget = value;
+ case SettingKeys.Shop_Cursor_Target:
+ const selectedValue = shopCursorTargetIndexMap[value];
+ scene.shopCursorTarget = selectedValue;
+ break;
case SettingKeys.EXP_Gains_Speed:
scene.expGainsSpeed = value;
break;
diff --git a/src/test/abilities/ability_timing.test.ts b/src/test/abilities/ability_timing.test.ts
index 3238f880992..fb3d3af1a6b 100644
--- a/src/test/abilities/ability_timing.test.ts
+++ b/src/test/abilities/ability_timing.test.ts
@@ -1,13 +1,11 @@
+import { BattleStyle } from "#app/enums/battle-style";
import { CommandPhase } from "#app/phases/command-phase";
-import { MessagePhase } from "#app/phases/message-phase";
import { TurnInitPhase } from "#app/phases/turn-init-phase";
import i18next, { initI18n } from "#app/plugins/i18n";
import { Mode } from "#app/ui/ui";
import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -28,19 +26,18 @@ describe("Ability Timing", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
- game.override.enemySpecies(Species.PIDGEY);
- game.override.enemyAbility(Abilities.INTIMIDATE);
- game.override.enemyMoveset(SPLASH_ONLY);
-
- game.override.ability(Abilities.BALL_FETCH);
- game.override.moveset([Moves.SPLASH, Moves.ICE_BEAM]);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.INTIMIDATE)
+ .ability(Abilities.BALL_FETCH);
});
- it("should trigger after switch check", async() => {
+ it("should trigger after switch check", async () => {
initI18n();
i18next.changeLanguage("en");
+ game.settings.battleStyle = BattleStyle.SWITCH;
await game.classicMode.runToSummon([Species.EEVEE, Species.FEEBAS]);
game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
@@ -48,7 +45,7 @@ describe("Ability Timing", () => {
game.endPhase();
}, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase));
- await game.phaseInterceptor.to(MessagePhase);
+ await game.phaseInterceptor.to("MessagePhase");
const message = game.textInterceptor.getLatestMessage();
expect(message).toContain("Attack fell");
}, 5000);
diff --git a/src/test/abilities/beast_boost.test.ts b/src/test/abilities/beast_boost.test.ts
new file mode 100644
index 00000000000..05645a1231d
--- /dev/null
+++ b/src/test/abilities/beast_boost.test.ts
@@ -0,0 +1,89 @@
+import { BattlerIndex } from "#app/battle";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+describe("Abilities - Beast 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.BULBASAUR)
+ .enemyAbility(Abilities.BEAST_BOOST)
+ .ability(Abilities.BEAST_BOOST)
+ .startingLevel(2000)
+ .moveset([ Moves.FLAMETHROWER ])
+ .enemyMoveset(SPLASH_ONLY);
+ });
+
+ it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => {
+ await game.classicMode.startBattle([Species.SLOWBRO]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ // Set the pokemon's highest stat to DEF, so it should be picked by Beast Boost
+ vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 1000, 200, 100, 100 ]);
+ console.log(playerPokemon.stats);
+
+ expect(playerPokemon.getStatStage(Stat.DEF)).toBe(0);
+
+ game.move.select(Moves.FLAMETHROWER);
+ await game.phaseInterceptor.to("VictoryPhase");
+
+ expect(playerPokemon.getStatStage(Stat.DEF)).toBe(1);
+ }, 20000);
+
+ it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => {
+ game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT));
+
+ await game.classicMode.startBattle([Species.SLOWBRO]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ // If the opponent uses Guard Split, the pokemon's second highest stat (SPATK) should be chosen
+ vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 100, 201, 200, 100, 100 ]);
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0);
+
+ game.move.select(Moves.FLAMETHROWER);
+
+ await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
+ await game.phaseInterceptor.to("VictoryPhase");
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1);
+ }, 20000);
+
+ it("should have order preference in case of stat ties", async() => {
+ // Order preference follows the order of EFFECTIVE_STAT
+ await game.classicMode.startBattle([Species.SLOWBRO]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
+ // Set up tie between SPATK, SPDEF, and SPD, where SPATK should win
+ vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([ 10000, 1, 1, 100, 100, 100 ]);
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0);
+
+ game.move.select(Moves.FLAMETHROWER);
+
+ await game.phaseInterceptor.to("VictoryPhase");
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1);
+ }, 20000);
+});
diff --git a/src/test/abilities/contrary.test.ts b/src/test/abilities/contrary.test.ts
new file mode 100644
index 00000000000..19ecc7e0240
--- /dev/null
+++ b/src/test/abilities/contrary.test.ts
@@ -0,0 +1,42 @@
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
+import { Abilities } from "#enums/abilities";
+import { Species } from "#enums/species";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Abilities - Contrary", () => {
+ 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.BULBASAUR)
+ .enemyAbility(Abilities.CONTRARY)
+ .ability(Abilities.INTIMIDATE)
+ .enemyMoveset(SPLASH_ONLY);
+ });
+
+ it("should invert stat changes when applied", async() => {
+ await game.startBattle([
+ Species.SLOWBRO
+ ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
+ }, 20000);
+});
diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts
index 9a4baeef1fb..96ec775f2a0 100644
--- a/src/test/abilities/costar.test.ts
+++ b/src/test/abilities/costar.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
@@ -35,7 +35,7 @@ describe("Abilities - COSTAR", () => {
test(
- "ability copies positive stat changes",
+ "ability copies positive stat stages",
async () => {
game.override.enemyAbility(Abilities.BALL_FETCH);
@@ -48,8 +48,8 @@ describe("Abilities - COSTAR", () => {
game.move.select(Moves.SPLASH, 1);
await game.toNextTurn();
- expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2);
- expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0);
+ expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2);
+ expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(0);
game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to(CommandPhase);
@@ -57,14 +57,14 @@ describe("Abilities - COSTAR", () => {
await game.phaseInterceptor.to(MessagePhase);
[leftPokemon, rightPokemon] = game.scene.getPlayerField();
- expect(leftPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2);
- expect(rightPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(+2);
+ expect(leftPokemon.getStatStage(Stat.SPATK)).toBe(2);
+ expect(rightPokemon.getStatStage(Stat.SPATK)).toBe(2);
},
TIMEOUT,
);
test(
- "ability copies negative stat changes",
+ "ability copies negative stat stages",
async () => {
game.override.enemyAbility(Abilities.INTIMIDATE);
@@ -72,8 +72,8 @@ describe("Abilities - COSTAR", () => {
let [leftPokemon, rightPokemon] = game.scene.getPlayerField();
- expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2);
- expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2);
+ expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2);
+ expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2);
game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to(CommandPhase);
@@ -81,8 +81,8 @@ describe("Abilities - COSTAR", () => {
await game.phaseInterceptor.to(MessagePhase);
[leftPokemon, rightPokemon] = game.scene.getPlayerField();
- expect(leftPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2);
- expect(rightPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-2);
+ expect(leftPokemon.getStatStage(Stat.ATK)).toBe(-2);
+ expect(rightPokemon.getStatStage(Stat.ATK)).toBe(-2);
},
TIMEOUT,
);
diff --git a/src/test/abilities/dancer.test.ts b/src/test/abilities/dancer.test.ts
new file mode 100644
index 00000000000..d80f497f8b2
--- /dev/null
+++ b/src/test/abilities/dancer.test.ts
@@ -0,0 +1,64 @@
+import { BattlerIndex } from "#app/battle";
+import { MovePhase } from "#app/phases/move-phase";
+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";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Abilities - Dancer", () => {
+ 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")
+ .moveset([Moves.SWORDS_DANCE, Moves.SPLASH])
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.DANCER)
+ .enemyMoveset(Array(4).fill(Moves.VICTORY_DANCE));
+ });
+
+ // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability)
+
+ it("triggers when dance moves are used, doesn't consume extra PP", async () => {
+ await game.classicMode.startBattle([Species.ORICORIO, Species.FEEBAS]);
+
+ const [oricorio] = game.scene.getPlayerField();
+
+ game.move.select(Moves.SPLASH);
+ game.move.select(Moves.SWORDS_DANCE, 1);
+ await game.setTurnOrder([BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]);
+ await game.phaseInterceptor.to("MovePhase");
+ // immediately copies ally move
+ await game.phaseInterceptor.to("MovePhase", false);
+ let currentPhase = game.scene.getCurrentPhase() as MovePhase;
+ expect(currentPhase.pokemon).toBe(oricorio);
+ expect(currentPhase.move.moveId).toBe(Moves.SWORDS_DANCE);
+ await game.phaseInterceptor.to("MoveEndPhase");
+ await game.phaseInterceptor.to("MovePhase");
+ // immediately copies enemy move
+ await game.phaseInterceptor.to("MovePhase", false);
+ currentPhase = game.scene.getCurrentPhase() as MovePhase;
+ expect(currentPhase.pokemon).toBe(oricorio);
+ expect(currentPhase.move.moveId).toBe(Moves.VICTORY_DANCE);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ // doesn't use PP if copied move is also in moveset
+ expect(oricorio.moveset[0]?.ppUsed).toBe(0);
+ }, TIMEOUT);
+});
diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts
index 85141fdb491..f7c45e91724 100644
--- a/src/test/abilities/disguise.test.ts
+++ b/src/test/abilities/disguise.test.ts
@@ -1,14 +1,8 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { StatusEffect } from "#app/data/status-effect";
-import { CommandPhase } from "#app/phases/command-phase";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase";
-import { MoveEndPhase } from "#app/phases/move-end-phase";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
-import { Mode } from "#app/ui/ui";
import { toDmgValue } from "#app/utils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
+import { StatusEffect } from "#app/data/status-effect";
+import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import { SPLASH_ONLY } from "../utils/testUtils";
@@ -33,17 +27,16 @@ describe("Abilities - Disguise", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
-
- game.override.enemySpecies(Species.MIMIKYU);
- game.override.enemyMoveset(SPLASH_ONLY);
-
- game.override.starterSpecies(Species.REGIELEKI);
- game.override.moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.MIMIKYU)
+ .enemyMoveset(SPLASH_ONLY)
+ .starterSpecies(Species.REGIELEKI)
+ .moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]);
}, TIMEOUT);
it("takes no damage from attacking move and transforms to Busted form, takes 1/8 max HP damage from the disguise breaking", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
const maxHp = mimikyu.getMaxHp();
@@ -53,14 +46,14 @@ describe("Abilities - Disguise", () => {
game.move.select(Moves.SHADOW_SNEAK);
- await game.phaseInterceptor.to(MoveEndPhase);
+ await game.phaseInterceptor.to("MoveEndPhase");
expect(mimikyu.hp).equals(maxHp - disguiseDamage);
expect(mimikyu.formIndex).toBe(bustedForm);
}, TIMEOUT);
it("doesn't break disguise when attacked with ineffective move", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
@@ -68,15 +61,15 @@ describe("Abilities - Disguise", () => {
game.move.select(Moves.VACUUM_WAVE);
- await game.phaseInterceptor.to(MoveEndPhase);
+ await game.phaseInterceptor.to("MoveEndPhase");
expect(mimikyu.formIndex).toBe(disguisedForm);
}, TIMEOUT);
it("takes no damage from the first hit of a multihit move and transforms to Busted form, then takes damage from the second hit", async () => {
- game.override.moveset([Moves.SURGING_STRIKES]);
+ game.override.moveset([ Moves.SURGING_STRIKES ]);
game.override.enemyLevel(5);
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
const maxHp = mimikyu.getMaxHp();
@@ -87,29 +80,29 @@ describe("Abilities - Disguise", () => {
game.move.select(Moves.SURGING_STRIKES);
// First hit
- await game.phaseInterceptor.to(MoveEffectPhase);
+ await game.phaseInterceptor.to("MoveEffectPhase");
expect(mimikyu.hp).equals(maxHp - disguiseDamage);
expect(mimikyu.formIndex).toBe(disguisedForm);
// Second hit
- await game.phaseInterceptor.to(MoveEffectPhase);
+ await game.phaseInterceptor.to("MoveEffectPhase");
expect(mimikyu.hp).lessThan(maxHp - disguiseDamage);
expect(mimikyu.formIndex).toBe(bustedForm);
}, TIMEOUT);
it("takes effects from status moves and damage from status effects", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
expect(mimikyu.hp).toBe(mimikyu.getMaxHp());
game.move.select(Moves.TOXIC_THREAD);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(mimikyu.formIndex).toBe(disguisedForm);
expect(mimikyu.status?.effect).toBe(StatusEffect.POISON);
- expect(mimikyu.summonData.battleStats[BattleStat.SPD]).toBe(-1);
+ expect(mimikyu.getStatStage(Stat.SPD)).toBe(-1);
expect(mimikyu.hp).toBeLessThan(mimikyu.getMaxHp());
}, TIMEOUT);
@@ -117,7 +110,7 @@ describe("Abilities - Disguise", () => {
game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
game.override.starterSpecies(0);
- await game.startBattle([Species.MIMIKYU, Species.FURRET]);
+ await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]);
const mimikyu = game.scene.getPlayerPokemon()!;
const maxHp = mimikyu.getMaxHp();
@@ -125,7 +118,7 @@ describe("Abilities - Disguise", () => {
game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(mimikyu.formIndex).toBe(bustedForm);
expect(mimikyu.hp).equals(maxHp - disguiseDamage);
@@ -133,7 +126,7 @@ describe("Abilities - Disguise", () => {
await game.toNextTurn();
game.doSwitchPokemon(1);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(mimikyu.formIndex).toBe(bustedForm);
}, TIMEOUT);
@@ -143,7 +136,7 @@ describe("Abilities - Disguise", () => {
game.override.starterForms({
[Species.MIMIKYU]: bustedForm
});
- await game.startBattle([Species.FURRET, Species.MIMIKYU]);
+ await game.classicMode.startBattle([ Species.FURRET, Species.MIMIKYU ]);
const mimikyu = game.scene.getParty()[1]!;
expect(mimikyu.formIndex).toBe(bustedForm);
@@ -162,7 +155,7 @@ describe("Abilities - Disguise", () => {
[Species.MIMIKYU]: bustedForm
});
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getPlayerPokemon()!;
@@ -182,7 +175,7 @@ describe("Abilities - Disguise", () => {
[Species.MIMIKYU]: bustedForm
});
- await game.startBattle([Species.MIMIKYU, Species.FURRET]);
+ await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]);
const mimikyu1 = game.scene.getPlayerPokemon()!;
@@ -194,15 +187,6 @@ describe("Abilities - Disguise", () => {
await game.toNextTurn();
game.move.select(Moves.SPLASH);
await game.doKillOpponents();
- game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => { // TODO: Make tests run in set mode instead of switch mode
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase));
-
- game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase));
await game.phaseInterceptor.to("PartyHealPhase");
expect(mimikyu1.formIndex).toBe(disguisedForm);
@@ -210,7 +194,7 @@ describe("Abilities - Disguise", () => {
it("doesn't faint twice when fainting due to Disguise break damage, nor prevent faint from Disguise break damage if using Endure", async () => {
game.override.enemyMoveset(Array(4).fill(Moves.ENDURE));
- await game.startBattle();
+ await game.classicMode.startBattle();
const mimikyu = game.scene.getEnemyPokemon()!;
mimikyu.hp = 1;
diff --git a/src/test/abilities/flower_gift.test.ts b/src/test/abilities/flower_gift.test.ts
new file mode 100644
index 00000000000..de07bd29478
--- /dev/null
+++ b/src/test/abilities/flower_gift.test.ts
@@ -0,0 +1,154 @@
+import { BattlerIndex } from "#app/battle";
+import { Abilities } from "#app/enums/abilities";
+import { Stat } from "#app/enums/stat";
+import { WeatherType } from "#app/enums/weather-type";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import GameManager from "#test/utils/gameManager";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+
+describe("Abilities - Flower Gift", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const OVERCAST_FORM = 0;
+ const SUNSHINE_FORM = 1;
+
+ /**
+ * Tests reverting to normal form when Cloud Nine/Air Lock is active on the field
+ * @param {GameManager} game The game manager instance
+ * @param {Abilities} ability The ability that is active on the field
+ */
+ const testRevertFormAgainstAbility = async (game: GameManager, ability: Abilities) => {
+ game.override.starterForms({ [Species.CASTFORM]: SUNSHINE_FORM }).enemyAbility(ability);
+ await game.classicMode.startBattle([Species.CASTFORM]);
+
+ game.move.select(Moves.SPLASH);
+
+ expect(game.scene.getPlayerPokemon()?.formIndex).toBe(OVERCAST_FORM);
+ };
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP])
+ .enemySpecies(Species.MAGIKARP)
+ .enemyMoveset(SPLASH_ONLY)
+ .enemyAbility(Abilities.BALL_FETCH);
+ });
+
+ // TODO: Uncomment expect statements when the ability is implemented - currently does not increase stats of allies
+ it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => {
+ game.override.battleType("double");
+ await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]);
+
+ const [ cherrim ] = game.scene.getPlayerField();
+ const cherrimAtkStat = cherrim.getEffectiveStat(Stat.ATK);
+ const cherrimSpDefStat = cherrim.getEffectiveStat(Stat.SPDEF);
+
+ // const magikarpAtkStat = magikarp.getEffectiveStat(Stat.ATK);;
+ // const magikarpSpDefStat = magikarp.getEffectiveStat(Stat.SPDEF);
+
+ game.move.select(Moves.SUNNY_DAY, 0);
+ game.move.select(Moves.SPLASH, 1);
+
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY, BattlerIndex.ENEMY_2]);
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+ expect(cherrim.getEffectiveStat(Stat.ATK)).toBe(Math.floor(cherrimAtkStat * 1.5));
+ expect(cherrim.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(cherrimSpDefStat * 1.5));
+ // expect(magikarp.getEffectiveStat(Stat.ATK)).toBe(Math.floor(magikarpAtkStat * 1.5));
+ // expect(magikarp.getEffectiveStat(Stat.SPDEF)).toBe(Math.floor(magikarpSpDefStat * 1.5));
+ });
+
+ it("changes the Pokemon's form during Harsh Sunlight", async () => {
+ game.override.weather(WeatherType.HARSH_SUN);
+ await game.classicMode.startBattle([Species.CHERRIM]);
+
+ const cherrim = game.scene.getPlayerPokemon()!;
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+
+ game.move.select(Moves.SPLASH);
+ });
+
+ it("reverts to Overcast Form if a Pokémon on the field has Air Lock", async () => {
+ await testRevertFormAgainstAbility(game, Abilities.AIR_LOCK);
+ });
+
+ it("reverts to Overcast Form if a Pokémon on the field has Cloud Nine", async () => {
+ await testRevertFormAgainstAbility(game, Abilities.CLOUD_NINE);
+ });
+
+ it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)).weather(WeatherType.HARSH_SUN);
+
+ await game.classicMode.startBattle([Species.CHERRIM]);
+
+ const cherrim = game.scene.getPlayerPokemon()!;
+
+ game.move.select(Moves.SKILL_SWAP);
+
+ await game.phaseInterceptor.to("TurnStartPhase");
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(cherrim.formIndex).toBe(OVERCAST_FORM);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+ });
+
+ it("reverts to Overcast Form when the Flower Gift is suppressed, changes form under Harsh Sunlight/Sunny when it regains it", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.HARSH_SUN);
+
+ await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]);
+
+ const cherrim = game.scene.getPlayerPokemon()!;
+
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+
+ game.move.select(Moves.SPLASH);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("TurnEndPhase");
+
+ expect(cherrim.summonData.abilitySuppressed).toBe(true);
+ expect(cherrim.formIndex).toBe(OVERCAST_FORM);
+
+ await game.toNextTurn();
+
+ game.doSwitchPokemon(1);
+ await game.toNextTurn();
+
+ game.doSwitchPokemon(1);
+ await game.phaseInterceptor.to("MovePhase");
+
+ expect(cherrim.summonData.abilitySuppressed).toBe(false);
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+ });
+
+ it("should be in Overcast Form after the user is switched out", async () => {
+ game.override.weather(WeatherType.SUNNY);
+
+ await game.classicMode.startBattle([Species.CASTFORM, Species.MAGIKARP]);
+ const cherrim = game.scene.getPlayerPokemon()!;
+
+ expect(cherrim.formIndex).toBe(SUNSHINE_FORM);
+
+ game.doSwitchPokemon(1);
+ await game.toNextTurn();
+
+ expect(cherrim.formIndex).toBe(OVERCAST_FORM);
+ });
+});
diff --git a/src/test/abilities/gulp_missile.test.ts b/src/test/abilities/gulp_missile.test.ts
index a451d290906..286c3af1c56 100644
--- a/src/test/abilities/gulp_missile.test.ts
+++ b/src/test/abilities/gulp_missile.test.ts
@@ -1,4 +1,3 @@
-import { BattleStat } from "#app/data/battle-stat";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { StatusEffect } from "#app/enums/status-effect";
import Pokemon from "#app/field/pokemon";
@@ -13,6 +12,7 @@ import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import { SPLASH_ONLY } from "../utils/testUtils";
+import { Stat } from "#enums/stat";
describe("Abilities - Gulp Missile", () => {
let phaserGame: Phaser.Game;
@@ -107,7 +107,7 @@ describe("Abilities - Gulp Missile", () => {
expect(cramorant.formIndex).toBe(GULPING_FORM);
});
- it("deals ¼ of the attacker's maximum HP when hit by a damaging attack", async () => {
+ it("deals 1/4 of the attacker's maximum HP when hit by a damaging attack", async () => {
game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
await game.startBattle([Species.CRAMORANT]);
@@ -139,7 +139,7 @@ describe("Abilities - Gulp Missile", () => {
expect(cramorant.formIndex).toBe(GULPING_FORM);
});
- it("lowers the attacker's Defense by 1 stage when hit in Gulping form", async () => {
+ it("lowers attacker's DEF stat stage by 1 when hit in Gulping form", async () => {
game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
await game.startBattle([Species.CRAMORANT]);
@@ -158,7 +158,7 @@ describe("Abilities - Gulp Missile", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(enemy.damageAndUpdate).toHaveReturnedWith(getEffectDamage(enemy));
- expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(-1);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(-1);
expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined();
expect(cramorant.formIndex).toBe(NORMAL_FORM);
});
@@ -219,7 +219,7 @@ describe("Abilities - Gulp Missile", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(enemy.hp).toBe(enemyHpPreEffect);
- expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(-1);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(-1);
expect(cramorant.getTag(BattlerTagType.GULP_MISSILE_ARROKUDA)).toBeUndefined();
expect(cramorant.formIndex).toBe(NORMAL_FORM);
});
diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts
index b7c3b723c4b..ff96b98c7ac 100644
--- a/src/test/abilities/hustle.test.ts
+++ b/src/test/abilities/hustle.test.ts
@@ -1,8 +1,6 @@
import { allMoves } from "#app/data/move";
import { Abilities } from "#app/enums/abilities";
import { Stat } from "#app/enums/stat";
-import { DamagePhase } from "#app/phases/damage-phase";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
@@ -26,54 +24,54 @@ describe("Abilities - Hustle", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.ability(Abilities.HUSTLE);
- game.override.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]);
- game.override.startingLevel(5);
- game.override.disableCrits();
- game.override.enemyLevel(5);
- game.override.enemyMoveset(SPLASH_ONLY);
- game.override.enemySpecies(Species.SHUCKLE);
- game.override.enemyAbility(Abilities.BALL_FETCH);
+ game.override
+ .ability(Abilities.HUSTLE)
+ .moveset([ Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE ])
+ .disableCrits()
+ .battleType("single")
+ .enemyMoveset(SPLASH_ONLY)
+ .enemySpecies(Species.SHUCKLE)
+ .enemyAbility(Abilities.BALL_FETCH);
});
it("increases the user's Attack stat by 50%", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const atk = pikachu.stats[Stat.ATK];
- vi.spyOn(pikachu, "getBattleStat");
+ vi.spyOn(pikachu, "getEffectiveStat");
game.move.select(Moves.TACKLE);
await game.move.forceHit();
- await game.phaseInterceptor.to(DamagePhase);
+ await game.phaseInterceptor.to("DamagePhase");
- expect(pikachu.getBattleStat).toHaveReturnedWith(atk * 1.5);
+ expect(pikachu.getEffectiveStat).toHaveReturnedWith(Math.floor(atk * 1.5));
});
it("lowers the accuracy of the user's physical moves by 20%", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
vi.spyOn(pikachu, "getAccuracyMultiplier");
game.move.select(Moves.TACKLE);
- await game.phaseInterceptor.to(MoveEffectPhase);
+ await game.phaseInterceptor.to("MoveEffectPhase");
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(0.8);
});
it("does not affect non-physical moves", async () => {
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const spatk = pikachu.stats[Stat.SPATK];
- vi.spyOn(pikachu, "getBattleStat");
+ vi.spyOn(pikachu, "getEffectiveStat");
vi.spyOn(pikachu, "getAccuracyMultiplier");
game.move.select(Moves.GIGA_DRAIN);
- await game.phaseInterceptor.to(DamagePhase);
+ await game.phaseInterceptor.to("DamagePhase");
- expect(pikachu.getBattleStat).toHaveReturnedWith(spatk);
+ expect(pikachu.getEffectiveStat).toHaveReturnedWith(spatk);
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
});
@@ -81,7 +79,7 @@ describe("Abilities - Hustle", () => {
game.override.startingLevel(100);
game.override.enemyLevel(30);
- await game.startBattle([Species.PIKACHU]);
+ await game.classicMode.startBattle([Species.PIKACHU]);
const pikachu = game.scene.getPlayerPokemon()!;
const enemyPokemon = game.scene.getEnemyPokemon()!;
@@ -89,7 +87,7 @@ describe("Abilities - Hustle", () => {
vi.spyOn(allMoves[Moves.FISSURE], "calculateBattleAccuracy");
game.move.select(Moves.FISSURE);
- await game.phaseInterceptor.to(DamagePhase);
+ await game.phaseInterceptor.to("DamagePhase");
expect(enemyPokemon.turnData.damageTaken).toBe(enemyPokemon.getMaxHp());
expect(pikachu.getAccuracyMultiplier).toHaveReturnedWith(1);
diff --git a/src/test/abilities/hyper_cutter.test.ts b/src/test/abilities/hyper_cutter.test.ts
index 28fcc2f6085..64e04ac2fd3 100644
--- a/src/test/abilities/hyper_cutter.test.ts
+++ b/src/test/abilities/hyper_cutter.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
@@ -51,7 +51,7 @@ describe("Abilities - Hyper Cutter", () => {
game.move.select(Moves.STRING_SHOT);
await game.toNextTurn();
- expect(enemy.summonData.battleStats[BattleStat.ATK]).toEqual(0);
- [BattleStat.ACC, BattleStat.DEF, BattleStat.EVA, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD].forEach((stat: number) => expect(enemy.summonData.battleStats[stat]).toBeLessThan(0));
+ expect(enemy.getStatStage(Stat.ATK)).toEqual(0);
+ [Stat.ACC, Stat.DEF, Stat.EVA, Stat.SPATK, Stat.SPDEF, Stat.SPD].forEach((stat: number) => expect(enemy.getStatStage(stat)).toBeLessThan(0));
});
});
diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts
new file mode 100644
index 00000000000..2857f80632a
--- /dev/null
+++ b/src/test/abilities/imposter.test.ts
@@ -0,0 +1,101 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+// TODO: Add more tests once Imposter is fully implemented
+describe("Abilities - Imposter", () => {
+ 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.MEW)
+ .enemyLevel(200)
+ .enemyAbility(Abilities.BEAST_BOOST)
+ .enemyPassiveAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(SPLASH_ONLY)
+ .ability(Abilities.IMPOSTER)
+ .moveset(SPLASH_ONLY);
+ });
+
+ it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => {
+ await game.startBattle([
+ Species.DITTO
+ ]);
+
+ game.move.select(Moves.SPLASH);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(player.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId);
+ expect(player.getAbility()).toBe(enemy.getAbility());
+ expect(player.getGender()).toBe(enemy.getGender());
+
+ expect(player.getStat(Stat.HP, false)).not.toBe(enemy.getStat(Stat.HP));
+ for (const s of EFFECTIVE_STATS) {
+ expect(player.getStat(s, false)).toBe(enemy.getStat(s, false));
+ }
+
+ for (const s of BATTLE_STATS) {
+ expect(player.getStatStage(s)).toBe(enemy.getStatStage(s));
+ }
+
+ const playerMoveset = player.getMoveset();
+ const enemyMoveset = player.getMoveset();
+
+ 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();
+
+ 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(new Array(4).fill(Moves.POWER_SPLIT));
+
+ await game.startBattle([
+ Species.DITTO
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2);
+ const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2);
+
+ game.move.select(Moves.TACKLE);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.ATK, false)).toBe(avgAtk);
+ expect(enemy.getStat(Stat.ATK, false)).toBe(avgAtk);
+
+ expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ });
+});
diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts
index 93b663d06da..f90ba6c0e1e 100644
--- a/src/test/abilities/intimidate.test.ts
+++ b/src/test/abilities/intimidate.test.ts
@@ -1,21 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { Status, StatusEffect } from "#app/data/status-effect";
-import { GameModes, getGameMode } from "#app/game-mode";
-import { CommandPhase } from "#app/phases/command-phase";
-import { DamagePhase } from "#app/phases/damage-phase";
-import { EncounterPhase } from "#app/phases/encounter-phase";
-import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
-import { SelectStarterPhase } from "#app/phases/select-starter-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#test/utils/gameManager";
import { Mode } from "#app/ui/ui";
+import { Stat } from "#enums/stat";
+import { getMovePosition } from "#test/utils/gameManagerUtils";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
-import { generateStarter } from "#test/utils/gameManagerUtils";
import { SPLASH_ONLY } from "#test/utils/testUtils";
-import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Abilities - Intimidate", () => {
let phaserGame: Phaser.Game;
@@ -33,16 +25,16 @@ describe("Abilities - Intimidate", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
- game.override.enemySpecies(Species.RATTATA);
- game.override.enemyAbility(Abilities.INTIMIDATE);
- game.override.enemyPassiveAbility(Abilities.HYDRATION);
- game.override.ability(Abilities.INTIMIDATE);
- game.override.startingWave(3);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.battleType("single")
+ .enemySpecies(Species.RATTATA)
+ .enemyAbility(Abilities.INTIMIDATE)
+ .enemyPassiveAbility(Abilities.HYDRATION)
+ .ability(Abilities.INTIMIDATE)
+ .startingWave(3)
+ .enemyMoveset(SPLASH_ONLY);
});
- it("single - wild with switch", async () => {
+ it("should lower ATK stat stage by 1 of enemy Pokemon on entry and player switch", async () => {
await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
game.onNextPrompt(
"CheckSwitchPhase",
@@ -51,28 +43,30 @@ describe("Abilities - Intimidate", () => {
game.setMode(Mode.MESSAGE);
game.endPhase();
},
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
+ () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase")
);
- await game.phaseInterceptor.to(CommandPhase, false);
- expect(game.scene.getParty()[0].species.speciesId).toBe(Species.MIGHTYENA);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
+ await game.phaseInterceptor.to("CommandPhase", false);
+
+ let playerPokemon = game.scene.getPlayerPokemon()!;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(playerPokemon.species.speciesId).toBe(Species.MIGHTYENA);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1);
+
game.doSwitchPokemon(1);
- await game.phaseInterceptor.run(CommandPhase);
- await game.phaseInterceptor.to(CommandPhase);
- expect(game.scene.getParty()[0].species.speciesId).toBe(Species.POOCHYENA);
+ await game.phaseInterceptor.run("CommandPhase");
+ await game.phaseInterceptor.to("CommandPhase");
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(0);
-
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
+ playerPokemon = game.scene.getPlayerPokemon()!;
+ expect(playerPokemon.species.speciesId).toBe(Species.POOCHYENA);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-2);
}, 20000);
- it("single - boss should only trigger once then switch", async () => {
- game.override.startingWave(10);
+ it("should lower ATK stat stage by 1 for every enemy Pokemon in a double battle on entry", async () => {
+ game.override.battleType("double")
+ .startingWave(3);
await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
game.onNextPrompt(
"CheckSwitchPhase",
@@ -81,262 +75,63 @@ describe("Abilities - Intimidate", () => {
game.setMode(Mode.MESSAGE);
game.endPhase();
},
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
+ () => game.isCurrentPhase("CommandPhase") || game.isCurrentPhase("TurnInitPhase")
);
- await game.phaseInterceptor.to(CommandPhase, false);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
- game.doSwitchPokemon(1);
- await game.phaseInterceptor.run(CommandPhase);
- await game.phaseInterceptor.to(CommandPhase);
- expect(game.scene.getParty()[0].species.speciesId).toBe(Species.POOCHYENA);
+ await game.phaseInterceptor.to("CommandPhase", false);
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(0);
+ const playerField = game.scene.getPlayerField()!;
+ const enemyField = game.scene.getEnemyField()!;
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
+ expect(enemyField[0].getStatStage(Stat.ATK)).toBe(-2);
+ expect(enemyField[1].getStatStage(Stat.ATK)).toBe(-2);
+ expect(playerField[0].getStatStage(Stat.ATK)).toBe(-2);
+ expect(playerField[1].getStatStage(Stat.ATK)).toBe(-2);
}, 20000);
- it("single - trainer should only trigger once with switch", async () => {
- game.override.startingWave(5);
- await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
- game.onNextPrompt(
- "CheckSwitchPhase",
- Mode.CONFIRM,
- () => {
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- },
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
- );
- await game.phaseInterceptor.to(CommandPhase, false);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
- game.doSwitchPokemon(1);
- await game.phaseInterceptor.run(CommandPhase);
- await game.phaseInterceptor.to(CommandPhase);
- expect(game.scene.getParty()[0].species.speciesId).toBe(Species.POOCHYENA);
-
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(0);
-
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
- }, 200000);
-
- it("double - trainer should only trigger once per pokemon", async () => {
- game.override.battleType("double");
- game.override.startingWave(5);
- await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
- game.onNextPrompt(
- "CheckSwitchPhase",
- Mode.CONFIRM,
- () => {
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- },
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
- );
- await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
- const battleStatsOpponent2 = game.scene.currentBattle.enemyParty[1].summonData.battleStats;
- expect(battleStatsOpponent2[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon2 = game.scene.getParty()[1].summonData.battleStats;
- expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2);
- }, 20000);
-
- it("double - wild: should only trigger once per pokemon", async () => {
- game.override.battleType("double");
- game.override.startingWave(3);
- await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
- game.onNextPrompt(
- "CheckSwitchPhase",
- Mode.CONFIRM,
- () => {
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- },
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
- );
- await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
- const battleStatsOpponent2 = game.scene.currentBattle.enemyParty[1].summonData.battleStats;
- expect(battleStatsOpponent2[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon2 = game.scene.getParty()[1].summonData.battleStats;
- expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2);
- }, 20000);
-
- it("double - boss: should only trigger once per pokemon", async () => {
- game.override.battleType("double");
- game.override.startingWave(10);
- await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
- game.onNextPrompt(
- "CheckSwitchPhase",
- Mode.CONFIRM,
- () => {
- game.setMode(Mode.MESSAGE);
- game.endPhase();
- },
- () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(TurnInitPhase)
- );
- await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-2);
- const battleStatsOpponent2 = game.scene.currentBattle.enemyParty[1].summonData.battleStats;
- expect(battleStatsOpponent2[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
-
- const battleStatsPokemon2 = game.scene.getParty()[1].summonData.battleStats;
- expect(battleStatsPokemon2[BattleStat.ATK]).toBe(-2);
- }, 20000);
-
- it("single - wild next wave opp triger once, us: none", async () => {
- game.override.startingWave(2);
- game.override.moveset([Moves.AERIAL_ACE]);
- await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
-
- game.move.select(Moves.AERIAL_ACE);
- await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(DamagePhase);
- await game.killPokemon(game.scene.currentBattle.enemyParty[0]);
- expect(game.scene.currentBattle.enemyParty[0].isFainted()).toBe(true);
- await game.toNextWave();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- }, 20000);
-
- it("single - wild next turn - no retrigger on next turn", async () => {
+ it("should not activate again if there is no switch or new entry", async () => {
game.override.startingWave(2);
game.override.moveset([Moves.SPLASH]);
- await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
+ await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]);
- game.move.select(Moves.AERIAL_ACE);
- console.log("===to new turn===");
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1);
+
+ game.move.select(Moves.SPLASH);
await game.toNextTurn();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
+
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1);
}, 20000);
- it("single - trainer should only trigger once and each time he switch", async () => {
- game.override.moveset([Moves.SPLASH]);
- game.override.enemyMoveset([Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH, Moves.VOLT_SWITCH]);
- game.override.startingWave(5);
- await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
+ it("should lower ATK stat stage by 1 for every switch", async () => {
+ game.override.moveset([Moves.SPLASH])
+ .enemyMoveset(new Array(4).fill(Moves.VOLT_SWITCH))
+ .startingWave(5);
+ await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]);
- game.move.select(Moves.AERIAL_ACE);
- console.log("===to new turn===");
- await game.toNextTurn();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ let enemyPokemon = game.scene.getEnemyPokemon()!;
- game.move.select(Moves.AERIAL_ACE);
- console.log("===to new turn===");
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1);
+
+ game.move.select(getMovePosition(game.scene, 0, Moves.SPLASH));
await game.toNextTurn();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-3);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
+
+ enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-2);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+
+ enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-3);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
}, 200000);
-
- it("single - trainer should only trigger once whatever turn we are", async () => {
- game.override.moveset([Moves.SPLASH]);
- game.override.enemyMoveset(SPLASH_ONLY);
- game.override.startingWave(5);
- await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
-
- game.move.select(Moves.AERIAL_ACE);
- console.log("===to new turn===");
- await game.toNextTurn();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
-
- game.move.select(Moves.AERIAL_ACE);
- console.log("===to new turn===");
- await game.toNextTurn();
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-1);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- }, 20000);
-
- it("double - wild vs only 1 on player side", async () => {
- game.override.battleType("double");
- game.override.startingWave(3);
- await game.classicMode.runToSummon([Species.MIGHTYENA]);
- await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- const battleStatsOpponent2 = game.scene.currentBattle.enemyParty[1].summonData.battleStats;
- expect(battleStatsOpponent2[BattleStat.ATK]).toBe(-1);
-
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
- }, 20000);
-
- it("double - wild vs only 1 alive on player side", async () => {
- game.override.battleType("double");
- game.override.startingWave(3);
- await game.runToTitle();
-
- game.onNextPrompt("TitlePhase", Mode.TITLE, () => {
- game.scene.gameMode = getGameMode(GameModes.CLASSIC);
- const starters = generateStarter(game.scene, [Species.MIGHTYENA, Species.POOCHYENA]);
- const selectStarterPhase = new SelectStarterPhase(game.scene);
- game.scene.pushPhase(new EncounterPhase(game.scene, false));
- selectStarterPhase.initBattle(starters);
- game.scene.getParty()[1].hp = 0;
- game.scene.getParty()[1].status = new Status(StatusEffect.FAINT);
- });
-
- await game.phaseInterceptor.run(EncounterPhase);
-
- await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- const battleStatsOpponent2 = game.scene.currentBattle.enemyParty[1].summonData.battleStats;
- expect(battleStatsOpponent2[BattleStat.ATK]).toBe(-1);
-
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(-2);
- }, 20000);
});
diff --git a/src/test/abilities/intrepid_sword.test.ts b/src/test/abilities/intrepid_sword.test.ts
index 18d6c04adbc..7bf0654276c 100644
--- a/src/test/abilities/intrepid_sword.test.ts
+++ b/src/test/abilities/intrepid_sword.test.ts
@@ -1,8 +1,8 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import { CommandPhase } from "#app/phases/command-phase";
import { Abilities } from "#enums/abilities";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -29,14 +29,17 @@ describe("Abilities - Intrepid Sword", () => {
game.override.ability(Abilities.INTREPID_SWORD);
});
- it("INTREPID SWORD on player", async() => {
+ it("should raise ATK stat stage by 1 on entry", async() => {
await game.classicMode.runToSummon([
Species.ZACIAN,
]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
await game.phaseInterceptor.to(CommandPhase, false);
- const battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(1);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(1);
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(1);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
}, 20000);
});
diff --git a/src/test/abilities/moody.test.ts b/src/test/abilities/moody.test.ts
index 9e936e8100a..5c46ea68ec5 100644
--- a/src/test/abilities/moody.test.ts
+++ b/src/test/abilities/moody.test.ts
@@ -1,18 +1,16 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { BATTLE_STATS, EFFECTIVE_STATS } 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 { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Abilities - Moody", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
- const battleStatsArray = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.SPD];
-
beforeAll(() => {
phaserGame = new Phaser.Game({
type: Phaser.HEADLESS,
@@ -30,63 +28,61 @@ describe("Abilities - Moody", () => {
.battleType("single")
.enemySpecies(Species.RATTATA)
.enemyAbility(Abilities.BALL_FETCH)
- .enemyPassiveAbility(Abilities.HYDRATION)
.ability(Abilities.MOODY)
.enemyMoveset(SPLASH_ONLY)
.moveset(SPLASH_ONLY);
});
- it(
- "should increase one BattleStat by 2 stages and decrease a different BattleStat by 1 stage",
+ it("should increase one stat stage by 2 and decrease a different stat stage by 1",
async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const playerPokemon = game.scene.getPlayerPokemon()!;
game.move.select(Moves.SPLASH);
await game.toNextTurn();
// Find the increased and decreased stats, make sure they are different.
- const statChanges = playerPokemon.summonData.battleStats;
- const changedStats = battleStatsArray.filter(bs => statChanges[bs] === 2 || statChanges[bs] === -1);
+ const changedStats = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 2 || playerPokemon.getStatStage(s) === -1);
expect(changedStats).toBeTruthy();
expect(changedStats.length).toBe(2);
expect(changedStats[0] !== changedStats[1]).toBeTruthy();
});
- it(
- "should only increase one BattleStat by 2 stages if all BattleStats are at -6",
+ it("should only increase one stat stage by 2 if all stat stages are at -6",
async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const playerPokemon = game.scene.getPlayerPokemon()!;
- // Set all BattleStats to -6
- battleStatsArray.forEach(bs => playerPokemon.summonData.battleStats[bs] = -6);
+
+ // Set all stat stages to -6
+ vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(-6));
game.move.select(Moves.SPLASH);
await game.toNextTurn();
- // Should increase one BattleStat by 2 (from -6, meaning it will be -4)
- const increasedStat = battleStatsArray.filter(bs => playerPokemon.summonData.battleStats[bs] === -4);
+ // Should increase one stat stage by 2 (from -6, meaning it will be -4)
+ const increasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === -4);
expect(increasedStat).toBeTruthy();
expect(increasedStat.length).toBe(1);
});
- it(
- "should only decrease one BattleStat by 1 stage if all BattleStats are at 6",
+ it("should only decrease one stat stage by 1 stage if all stat stages are at 6",
async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const playerPokemon = game.scene.getPlayerPokemon()!;
- // Set all BattleStats to 6
- battleStatsArray.forEach(bs => playerPokemon.summonData.battleStats[bs] = 6);
+
+ // Set all stat stages to 6
+ vi.spyOn(playerPokemon.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6));
game.move.select(Moves.SPLASH);
await game.toNextTurn();
- // Should decrease one BattleStat by 1 (from 6, meaning it will be 5)
- const decreasedStat = battleStatsArray.filter(bs => playerPokemon.summonData.battleStats[bs] === 5);
+ // Should decrease one stat stage by 1 (from 6, meaning it will be 5)
+ const decreasedStat = EFFECTIVE_STATS.filter(s => playerPokemon.getStatStage(s) === 5);
+
expect(decreasedStat).toBeTruthy();
expect(decreasedStat.length).toBe(1);
});
diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts
index 6a1838c9a98..e713d78f39e 100644
--- a/src/test/abilities/moxie.test.ts
+++ b/src/test/abilities/moxie.test.ts
@@ -1,14 +1,15 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { Stat } from "#app/data/pokemon-stat";
-import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
-import { VictoryPhase } from "#app/phases/victory-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
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 { SPLASH_ONLY } from "../utils/testUtils";
+import { BattlerIndex } from "#app/battle";
+import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
+import { VictoryPhase } from "#app/phases/victory-phase";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
describe("Abilities - Moxie", () => {
let phaserGame: Phaser.Game;
@@ -32,23 +33,47 @@ describe("Abilities - Moxie", () => {
game.override.enemyAbility(Abilities.MOXIE);
game.override.ability(Abilities.MOXIE);
game.override.startingLevel(2000);
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
});
- it("MOXIE", async () => {
+ it("should raise ATK stat stage by 1 when winning a battle", async() => {
const moveToUse = Moves.AERIAL_ACE;
await game.startBattle([
Species.MIGHTYENA,
Species.MIGHTYENA,
]);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[Stat.ATK]).toBe(0);
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0);
game.move.select(moveToUse);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(VictoryPhase);
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.ATK]).toBe(1);
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(1);
+ }, 20000);
+
+ // TODO: Activate this test when MOXIE is corrected to work on faint and not on battle victory
+ it.todo("should raise ATK stat stage by 1 when defeating an ally Pokemon", async() => {
+ game.override.battleType("double");
+ const moveToUse = Moves.AERIAL_ACE;
+ await game.startBattle([
+ Species.MIGHTYENA,
+ Species.MIGHTYENA,
+ ]);
+
+ const [ firstPokemon, secondPokemon ] = game.scene.getPlayerField();
+
+ expect(firstPokemon.getStatStage(Stat.ATK)).toBe(0);
+
+ secondPokemon.hp = 1;
+
+ game.move.select(moveToUse);
+ game.selectTarget(BattlerIndex.PLAYER_2);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(firstPokemon.getStatStage(Stat.ATK)).toBe(1);
}, 20000);
});
diff --git a/src/test/abilities/mycelium_might.test.ts b/src/test/abilities/mycelium_might.test.ts
index 83396f7950f..d8947935880 100644
--- a/src/test/abilities/mycelium_might.test.ts
+++ b/src/test/abilities/mycelium_might.test.ts
@@ -1,14 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { MovePhase } from "#app/phases/move-phase";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { TurnStartPhase } from "#app/phases/turn-start-phase";
+import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
+import { Stat } from "#enums/stat";
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 - Mycelium Might", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
@@ -35,7 +34,7 @@ describe("Abilities - Mycelium Might", () => {
});
/**
- * Bulbapedia References:
+ * References:
* https://bulbapedia.bulbagarden.net/wiki/Mycelium_Might_(Ability)
* https://bulbapedia.bulbagarden.net/wiki/Priority
* https://www.smogon.com/forums/threads/scarlet-violet-battle-mechanics-research.3709545/page-24
@@ -44,62 +43,65 @@ describe("Abilities - Mycelium Might", () => {
it("will move last in its priority bracket and ignore protective abilities", async () => {
await game.startBattle([Species.REGIELEKI]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyPokemon = game.scene.getEnemyPokemon();
+ const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex();
const enemyIndex = enemyPokemon?.getBattlerIndex();
game.move.select(Moves.BABY_DOLL_EYES);
- await game.phaseInterceptor.to(MovePhase, false);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
// The opponent Pokemon (without Mycelium Might) goes first despite having lower speed than the player Pokemon.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
-
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
-
// The player Pokemon (with Mycelium Might) goes last despite having higher speed than the opponent.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
+ expect(speedOrder).toEqual([playerIndex, enemyIndex]);
+ expect(commandOrder).toEqual([enemyIndex, playerIndex]);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemyPokemon?.summonData.battleStats[BattleStat.ATK]).toBe(-1);
+
+ // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced.
+ expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1);
}, 20000);
it("will still go first if a status move that is in a higher priority bracket than the opponent's move is used", async () => {
game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
await game.startBattle([Species.REGIELEKI]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyPokemon = game.scene.getEnemyPokemon();
+ const playerIndex = game.scene.getPlayerPokemon()?.getBattlerIndex();
const enemyIndex = enemyPokemon?.getBattlerIndex();
game.move.select(Moves.BABY_DOLL_EYES);
- await game.phaseInterceptor.to(MovePhase, false);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
// The player Pokemon (with M.M.) goes first because its move is still within a higher priority bracket than its opponent.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
-
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
// The enemy Pokemon goes second because its move is in a lower priority bracket.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
+ expect(speedOrder).toEqual([playerIndex, enemyIndex]);
+ expect(commandOrder).toEqual([playerIndex, enemyIndex]);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemyPokemon?.summonData.battleStats[BattleStat.ATK]).toBe(-1);
+ // Despite the opponent's ability (Clear Body), its ATK stat stage is still reduced.
+ expect(enemyPokemon?.getStatStage(Stat.ATK)).toBe(-1);
}, 20000);
it("will not affect non-status moves", async () => {
await game.startBattle([Species.REGIELEKI]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
+ const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex();
game.move.select(Moves.QUICK_ATTACK);
- await game.phaseInterceptor.to(MovePhase, false);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
// The player Pokemon (with M.M.) goes first because it has a higher speed and did not use a status move.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
-
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
// The enemy Pokemon (without M.M.) goes second because its speed is lower.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
+ // This means that the commandOrder should be identical to the speedOrder
+ expect(speedOrder).toEqual([playerIndex, enemyIndex]);
+ expect(commandOrder).toEqual([playerIndex, enemyIndex]);
}, 20000);
});
diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts
index 1404f597ccf..e3c6c8ec5bb 100644
--- a/src/test/abilities/parental_bond.test.ts
+++ b/src/test/abilities/parental_bond.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { StatusEffect } from "#app/data/status-effect";
import { Type } from "#app/data/type";
import { BattlerTagType } from "#app/enums/battler-tag-type";
@@ -96,7 +96,7 @@ describe("Abilities - Parental Bond", () => {
await game.phaseInterceptor.to(BerryPhase, false);
expect(leadPokemon.turnData.hitCount).toBe(2);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2);
}, TIMEOUT
);
@@ -116,7 +116,7 @@ describe("Abilities - Parental Bond", () => {
game.move.select(Moves.BABY_DOLL_EYES);
await game.phaseInterceptor.to(BerryPhase, false);
- expect(enemyPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
}, TIMEOUT
);
@@ -568,7 +568,7 @@ describe("Abilities - Parental Bond", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(-1);
}, TIMEOUT
);
@@ -590,7 +590,7 @@ describe("Abilities - Parental Bond", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- expect(enemyPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1);
}, TIMEOUT
);
diff --git a/src/test/abilities/sand_veil.test.ts b/src/test/abilities/sand_veil.test.ts
index 2336e2b50de..da9fdcc01ab 100644
--- a/src/test/abilities/sand_veil.test.ts
+++ b/src/test/abilities/sand_veil.test.ts
@@ -1,5 +1,5 @@
-import { BattleStatMultiplierAbAttr, allAbilities } from "#app/data/ability";
-import { BattleStat } from "#app/data/battle-stat";
+import { StatMultiplierAbAttr, allAbilities } from "#app/data/ability";
+import { Stat } from "#enums/stat";
import { WeatherType } from "#app/data/weather";
import { CommandPhase } from "#app/phases/command-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
@@ -49,10 +49,10 @@ describe("Abilities - Sand Veil", () => {
vi.spyOn(leadPokemon[0], "getAbility").mockReturnValue(allAbilities[Abilities.SAND_VEIL]);
- const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(BattleStatMultiplierAbAttr)[0];
- vi.spyOn(sandVeilAttr, "applyBattleStat").mockImplementation(
- (pokemon, passive, simulated, battleStat, statValue, args) => {
- if (battleStat === BattleStat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) {
+ const sandVeilAttr = allAbilities[Abilities.SAND_VEIL].getAttrs(StatMultiplierAbAttr)[0];
+ vi.spyOn(sandVeilAttr, "applyStatStage").mockImplementation(
+ (_pokemon, _passive, _simulated, stat, statValue, _args) => {
+ if (stat === Stat.EVA && game.scene.arena.weather?.weatherType === WeatherType.SANDSTORM) {
statValue.value *= -1; // will make all attacks miss
return true;
}
diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts
index f9c20e85eab..2d70ede3530 100644
--- a/src/test/abilities/sap_sipper.test.ts
+++ b/src/test/abilities/sap_sipper.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { TerrainType } from "#app/data/terrain";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
@@ -9,6 +9,7 @@ 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 { SPLASH_ONLY } from "../utils/testUtils";
// See also: TypeImmunityAbAttr
describe("Abilities - Sap Sipper", () => {
@@ -31,52 +32,55 @@ describe("Abilities - Sap Sipper", () => {
game.override.disableCrits();
});
- it("raise attack 1 level and block effects when activated against a grass attack", async () => {
+ it("raises ATK stat stage by 1 and block effects when activated against a grass attack", async() => {
const moveToUse = Moves.LEAFAGE;
const enemyAbility = Abilities.SAP_SIPPER;
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
game.override.enemySpecies(Species.DUSKULL);
game.override.enemyAbility(enemyAbility);
await game.startBattle();
- const startingOppHp = game.scene.currentBattle.enemyParty[0].hp;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ const initialEnemyHp = enemyPokemon.hp;
game.move.select(moveToUse);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(startingOppHp - game.scene.getEnemyParty()[0].hp).toBe(0);
- expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(initialEnemyHp - enemyPokemon.hp).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
});
- it("raise attack 1 level and block effects when activated against a grass status move", async () => {
+ it("raises ATK stat stage by 1 and block effects when activated against a grass status move", async() => {
const moveToUse = Moves.SPORE;
const enemyAbility = Abilities.SAP_SIPPER;
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
game.move.select(moveToUse);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(game.scene.getEnemyParty()[0].status).toBeUndefined();
- expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(enemyPokemon.status).toBeUndefined();
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
});
it("do not activate against status moves that target the field", async () => {
const moveToUse = Moves.GRASSY_TERRAIN;
const enemyAbility = Abilities.SAP_SIPPER;
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
@@ -88,51 +92,54 @@ describe("Abilities - Sap Sipper", () => {
expect(game.scene.arena.terrain).toBeDefined();
expect(game.scene.arena.terrain!.terrainType).toBe(TerrainType.GRASSY);
- expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.ATK)).toBe(0);
});
it("activate once against multi-hit grass attacks", async () => {
const moveToUse = Moves.BULLET_SEED;
const enemyAbility = Abilities.SAP_SIPPER;
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(enemyAbility);
await game.startBattle();
- const startingOppHp = game.scene.currentBattle.enemyParty[0].hp;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ const initialEnemyHp = enemyPokemon.hp;
game.move.select(moveToUse);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(startingOppHp - game.scene.getEnemyParty()[0].hp).toBe(0);
- expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(initialEnemyHp - enemyPokemon.hp).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
});
it("do not activate against status moves that target the user", async () => {
const moveToUse = Moves.SPIKY_SHIELD;
const ability = Abilities.SAP_SIPPER;
- game.override.moveset([moveToUse]);
+ game.override.moveset([ moveToUse ]);
game.override.ability(ability);
- game.override.enemyMoveset([Moves.SPLASH, Moves.NONE, Moves.NONE, Moves.NONE]);
+ game.override.enemyMoveset(SPLASH_ONLY);
game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(Abilities.NONE);
await game.startBattle();
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
game.move.select(moveToUse);
await game.phaseInterceptor.to(MoveEndPhase);
- expect(game.scene.getParty()[0].getTag(BattlerTagType.SPIKY_SHIELD)).toBeDefined();
+ expect(playerPokemon.getTag(BattlerTagType.SPIKY_SHIELD)).toBeDefined();
await game.phaseInterceptor.to(TurnEndPhase);
- expect(game.scene.getParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0);
expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase");
});
@@ -149,13 +156,14 @@ describe("Abilities - Sap Sipper", () => {
await game.startBattle();
- const startingOppHp = game.scene.currentBattle.enemyParty[0].hp;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ const initialEnemyHp = enemyPokemon.hp;
game.move.select(moveToUse);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(startingOppHp - game.scene.getEnemyParty()[0].hp).toBe(0);
- expect(game.scene.getEnemyParty()[0].summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(initialEnemyHp - enemyPokemon.hp).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(1);
});
});
diff --git a/src/test/abilities/serene_grace.test.ts b/src/test/abilities/serene_grace.test.ts
index 7316b2ea920..e06288b9de9 100644
--- a/src/test/abilities/serene_grace.test.ts
+++ b/src/test/abilities/serene_grace.test.ts
@@ -1,6 +1,6 @@
import { BattlerIndex } from "#app/battle";
import { applyAbAttrs, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability";
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import * as Utils from "#app/utils";
import { Abilities } from "#enums/abilities";
diff --git a/src/test/abilities/sheer_force.test.ts b/src/test/abilities/sheer_force.test.ts
index f73b749dac2..69b47e1eaae 100644
--- a/src/test/abilities/sheer_force.test.ts
+++ b/src/test/abilities/sheer_force.test.ts
@@ -1,6 +1,6 @@
import { BattlerIndex } from "#app/battle";
import { applyAbAttrs, applyPostDefendAbAttrs, applyPreAttackAbAttrs, MoveEffectChanceMultiplierAbAttr, MovePowerBoostAbAttr, PostDefendTypeChangeAbAttr } from "#app/data/ability";
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import * as Utils from "#app/utils";
import { Abilities } from "#enums/abilities";
diff --git a/src/test/abilities/shield_dust.test.ts b/src/test/abilities/shield_dust.test.ts
index 14770c49427..8a0b769827d 100644
--- a/src/test/abilities/shield_dust.test.ts
+++ b/src/test/abilities/shield_dust.test.ts
@@ -1,6 +1,6 @@
import { BattlerIndex } from "#app/battle";
import { applyAbAttrs, applyPreDefendAbAttrs, IgnoreMoveEffectsAbAttr, MoveEffectChanceMultiplierAbAttr } from "#app/data/ability";
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import * as Utils from "#app/utils";
import { Abilities } from "#enums/abilities";
diff --git a/src/test/abilities/simple.test.ts b/src/test/abilities/simple.test.ts
new file mode 100644
index 00000000000..4310c5d45d1
--- /dev/null
+++ b/src/test/abilities/simple.test.ts
@@ -0,0 +1,42 @@
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
+import { Abilities } from "#enums/abilities";
+import { Species } from "#enums/species";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Abilities - Simple", () => {
+ 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.BULBASAUR)
+ .enemyAbility(Abilities.SIMPLE)
+ .ability(Abilities.INTIMIDATE)
+ .enemyMoveset(SPLASH_ONLY);
+ });
+
+ it("should double stat changes when applied", async() => {
+ await game.startBattle([
+ Species.SLOWBRO
+ ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-2);
+ }, 20000);
+});
diff --git a/src/test/abilities/stall.test.ts b/src/test/abilities/stall.test.ts
index d8dbe9d0e06..7baf7c846f0 100644
--- a/src/test/abilities/stall.test.ts
+++ b/src/test/abilities/stall.test.ts
@@ -1,11 +1,10 @@
-import { MovePhase } from "#app/phases/move-phase";
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 { TurnStartPhase } from "#app/phases/turn-start-phase";
describe("Abilities - Stall", () => {
let phaserGame: Phaser.Game;
@@ -32,7 +31,7 @@ describe("Abilities - Stall", () => {
});
/**
- * Bulbapedia References:
+ * References:
* https://bulbapedia.bulbagarden.net/wiki/Stall_(Ability)
* https://bulbapedia.bulbagarden.net/wiki/Priority
**/
@@ -40,55 +39,56 @@ describe("Abilities - Stall", () => {
it("Pokemon with Stall should move last in its priority bracket regardless of speed", async () => {
await game.startBattle([Species.SHUCKLE]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
+ const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex();
game.move.select(Moves.QUICK_ATTACK);
- await game.phaseInterceptor.to(MovePhase, false);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
// The player Pokemon (without Stall) goes first despite having lower speed than the opponent.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
-
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
// The opponent Pokemon (with Stall) goes last despite having higher speed than the player Pokemon.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
+ expect(speedOrder).toEqual([enemyIndex, playerIndex]);
+ expect(commandOrder).toEqual([playerIndex, enemyIndex]);
}, 20000);
it("Pokemon with Stall will go first if a move that is in a higher priority bracket than the opponent's move is used", async () => {
await game.startBattle([Species.SHUCKLE]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
+ const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex();
game.move.select(Moves.TACKLE);
- await game.phaseInterceptor.to(MovePhase, false);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
// The opponent Pokemon (with Stall) goes first because its move is still within a higher priority bracket than its opponent.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
-
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
// The player Pokemon goes second because its move is in a lower priority bracket.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
+ expect(speedOrder).toEqual([enemyIndex, playerIndex]);
+ expect(commandOrder).toEqual([enemyIndex, playerIndex]);
}, 20000);
it("If both Pokemon have stall and use the same move, speed is used to determine who goes first.", async () => {
game.override.ability(Abilities.STALL);
await game.startBattle([Species.SHUCKLE]);
- const leadIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
+ const playerIndex = game.scene.getPlayerPokemon()!.getBattlerIndex();
const enemyIndex = game.scene.getEnemyPokemon()!.getBattlerIndex();
game.move.select(Moves.TACKLE);
- await game.phaseInterceptor.to(MovePhase, false);
- // The opponent Pokemon (with Stall) goes first because it has a higher speed.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(enemyIndex);
+ await game.phaseInterceptor.to(TurnStartPhase, false);
+ const phase = game.scene.getCurrentPhase() as TurnStartPhase;
+ const speedOrder = phase.getSpeedOrder();
+ const commandOrder = phase.getCommandOrder();
- await game.phaseInterceptor.run(MovePhase);
- await game.phaseInterceptor.to(MovePhase, false);
+ // The opponent Pokemon (with Stall) goes first because it has a higher speed.
// The player Pokemon (with Stall) goes second because its speed is lower.
- expect((game.scene.getCurrentPhase() as MovePhase).pokemon.getBattlerIndex()).toBe(leadIndex);
+ expect(speedOrder).toEqual([enemyIndex, playerIndex]);
+ expect(commandOrder).toEqual([enemyIndex, playerIndex]);
}, 20000);
});
diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts
new file mode 100644
index 00000000000..f9cb2935619
--- /dev/null
+++ b/src/test/abilities/tera_shell.test.ts
@@ -0,0 +1,111 @@
+import { Abilities } from "#app/enums/abilities";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import { HitResult } from "#app/field/pokemon.js";
+import GameManager from "#test/utils/gameManager";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+const TIMEOUT = 10 * 1000; // 10 second timeout
+
+describe("Abilities - Tera Shell", () => {
+ 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.TERA_SHELL)
+ .moveset([Moves.SPLASH])
+ .enemySpecies(Species.SNORLAX)
+ .enemyAbility(Abilities.INSOMNIA)
+ .enemyMoveset(Array(4).fill(Moves.MACH_PUNCH))
+ .startingLevel(100)
+ .enemyLevel(100);
+ });
+
+ it(
+ "should change the effectiveness of non-resisted attacks when the source is at full HP",
+ async () => {
+ await game.classicMode.startBattle([Species.SNORLAX]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ vi.spyOn(playerPokemon, "getMoveEffectiveness");
+
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.5);
+
+ await game.toNextTurn();
+
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(2);
+ }, TIMEOUT
+ );
+
+ it(
+ "should not override type immunities",
+ async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK));
+
+ await game.classicMode.startBattle([Species.SNORLAX]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ vi.spyOn(playerPokemon, "getMoveEffectiveness");
+
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0);
+ }, TIMEOUT
+ );
+
+ it(
+ "should not override type multipliers less than 0.5x",
+ async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK));
+
+ await game.classicMode.startBattle([Species.AGGRON]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ vi.spyOn(playerPokemon, "getMoveEffectiveness");
+
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(playerPokemon.getMoveEffectiveness).toHaveLastReturnedWith(0.25);
+ }, TIMEOUT
+ );
+
+ it(
+ "should not affect the effectiveness of fixed-damage moves",
+ async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.DRAGON_RAGE));
+
+ await game.classicMode.startBattle([Species.CHARIZARD]);
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ vi.spyOn(playerPokemon, "apply");
+
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("BerryPhase", false);
+ expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.EFFECTIVE);
+ expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40);
+ }, TIMEOUT
+ );
+});
diff --git a/src/test/abilities/volt_absorb.test.ts b/src/test/abilities/volt_absorb.test.ts
index d9c3fe34c24..7f3e160c7d0 100644
--- a/src/test/abilities/volt_absorb.test.ts
+++ b/src/test/abilities/volt_absorb.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { BattlerTagType } from "#enums/battler-tag-type";
@@ -41,12 +41,14 @@ describe("Abilities - Volt Absorb", () => {
await game.startBattle();
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
game.move.select(moveToUse);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(game.scene.getParty()[0].summonData.battleStats[BattleStat.SPDEF]).toBe(1);
- expect(game.scene.getParty()[0].getTag(BattlerTagType.CHARGED)).toBeDefined();
+ expect(playerPokemon.getStatStage(Stat.SPDEF)).toBe(1);
+ expect(playerPokemon.getTag(BattlerTagType.CHARGED)).toBeDefined();
expect(game.phaseInterceptor.log).not.toContain("ShowAbilityPhase");
});
});
diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts
index 97e2e6456dc..7a1fee6794a 100644
--- a/src/test/abilities/wind_rider.test.ts
+++ b/src/test/abilities/wind_rider.test.ts
@@ -1,9 +1,8 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
@@ -24,94 +23,99 @@ describe("Abilities - Wind Rider", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.battleType("single");
- game.override.enemySpecies(Species.SHIFTRY);
- game.override.enemyAbility(Abilities.WIND_RIDER);
- game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]);
- game.override.enemyMoveset(SPLASH_ONLY);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.SHIFTRY)
+ .enemyAbility(Abilities.WIND_RIDER)
+ .moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM])
+ .enemyMoveset(SPLASH_ONLY);
});
- it("takes no damage from wind moves and its Attack is increased by one stage when hit by one", async () => {
- await game.startBattle([Species.MAGIKARP]);
+ it("takes no damage from wind moves and its ATK stat stage is raised by 1 when hit by one", async () => {
+ await game.classicMode.startBattle([ Species.MAGIKARP ]);
const shiftry = game.scene.getEnemyPokemon()!;
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
game.move.select(Moves.PETAL_BLIZZARD);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
expect(shiftry.isFullHp()).toBe(true);
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(1);
});
- it("Attack is increased by one stage when Tailwind is present on its side", async () => {
- game.override.ability(Abilities.WIND_RIDER);
- game.override.enemySpecies(Species.MAGIKARP);
+ it("ATK stat stage is raised by 1 when Tailwind is present on its side", async () => {
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .ability(Abilities.WIND_RIDER);
- await game.startBattle([Species.SHIFTRY]);
+ await game.classicMode.startBattle([Species.SHIFTRY]);
const shiftry = game.scene.getPlayerPokemon()!;
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
game.move.select(Moves.TAILWIND);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(1);
});
- it("does not increase Attack when Tailwind is present on opposing side", async () => {
- game.override.ability(Abilities.WIND_RIDER);
- game.override.enemySpecies(Species.MAGIKARP);
+ it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => {
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .ability(Abilities.WIND_RIDER);
- await game.startBattle([Species.SHIFTRY]);
+ await game.classicMode.startBattle([Species.SHIFTRY]);
const magikarp = game.scene.getEnemyPokemon()!;
const shiftry = game.scene.getPlayerPokemon()!;
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
+ expect(magikarp.getStatStage(Stat.ATK)).toBe(0);
game.move.select(Moves.TAILWIND);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
- expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(1);
+ expect(magikarp.getStatStage(Stat.ATK)).toBe(0);
});
- it("does not increase Attack when Tailwind is present on opposing side", async () => {
- game.override.enemySpecies(Species.MAGIKARP);
+ it("does not raise ATK stat stage when Tailwind is present on opposing side", async () => {
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .ability(Abilities.WIND_RIDER);
- await game.startBattle([Species.SHIFTRY]);
+ await game.classicMode.startBattle([Species.SHIFTRY]);
const magikarp = game.scene.getEnemyPokemon()!;
const shiftry = game.scene.getPlayerPokemon()!;
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
+ expect(magikarp.getStatStage(Stat.ATK)).toBe(0);
game.move.select(Moves.TAILWIND);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(1);
- expect(magikarp.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(1);
+ expect(magikarp.getStatStage(Stat.ATK)).toBe(0);
});
it("does not interact with Sandstorm", async () => {
game.override.enemySpecies(Species.MAGIKARP);
- await game.startBattle([Species.SHIFTRY]);
+ await game.classicMode.startBattle([Species.SHIFTRY]);
const shiftry = game.scene.getPlayerPokemon()!;
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
expect(shiftry.isFullHp()).toBe(true);
game.move.select(Moves.SANDSTORM);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
- expect(shiftry.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(shiftry.getStatStage(Stat.ATK)).toBe(0);
expect(shiftry.hp).lessThan(shiftry.getMaxHp());
});
});
diff --git a/src/test/abilities/zen_mode.test.ts b/src/test/abilities/zen_mode.test.ts
index 677d998e876..fd378647184 100644
--- a/src/test/abilities/zen_mode.test.ts
+++ b/src/test/abilities/zen_mode.test.ts
@@ -1,6 +1,5 @@
+import { Stat } from "#enums/stat";
import { BattlerIndex } from "#app/battle";
-import { Stat } from "#app/data/pokemon-stat";
-import { Status, StatusEffect } from "#app/data/status-effect";
import { DamagePhase } from "#app/phases/damage-phase";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { MessagePhase } from "#app/phases/message-phase";
@@ -18,6 +17,7 @@ import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
+import { Status, StatusEffect } from "#app/data/status-effect";
const TIMEOUT = 20 * 1000;
diff --git a/src/test/achievements/achievement.test.ts b/src/test/achievements/achievement.test.ts
index 36c20ae2248..24d00a3e77b 100644
--- a/src/test/achievements/achievement.test.ts
+++ b/src/test/achievements/achievement.test.ts
@@ -224,7 +224,7 @@ describe("achvs", () => {
expect(achvs._50_RIBBONS).toBeInstanceOf(RibbonAchv);
expect(achvs._75_RIBBONS).toBeInstanceOf(RibbonAchv);
expect(achvs._100_RIBBONS).toBeInstanceOf(RibbonAchv);
- expect(achvs.TRANSFER_MAX_BATTLE_STAT).toBeInstanceOf(Achv);
+ expect(achvs.TRANSFER_MAX_STAT_STAGE).toBeInstanceOf(Achv);
expect(achvs.MAX_FRIENDSHIP).toBeInstanceOf(Achv);
expect(achvs.MEGA_EVOLVE).toBeInstanceOf(Achv);
expect(achvs.GIGANTAMAX).toBeInstanceOf(Achv);
diff --git a/src/test/battle-scene.test.ts b/src/test/battle-scene.test.ts
index 9e28ec99791..4da75cea197 100644
--- a/src/test/battle-scene.test.ts
+++ b/src/test/battle-scene.test.ts
@@ -1,5 +1,5 @@
import { LoadingScene } from "#app/loading-scene";
-import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
import GameManager from "./utils/gameManager";
describe("BattleScene", () => {
@@ -24,4 +24,12 @@ describe("BattleScene", () => {
// `BattleScene.create()` is called during the `new GameManager()` call
expect(game.scene.scene.remove).toHaveBeenCalledWith(LoadingScene.KEY);
});
+
+ it("should also reset RNG on reset", () => {
+ vi.spyOn(game.scene, "resetSeed");
+
+ game.scene.reset();
+
+ expect(game.scene.resetSeed).toHaveBeenCalled();
+ });
});
diff --git a/src/test/battle-stat.spec.ts b/src/test/battle-stat.spec.ts
deleted file mode 100644
index 16fce962838..00000000000
--- a/src/test/battle-stat.spec.ts
+++ /dev/null
@@ -1,145 +0,0 @@
-import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "#app/data/battle-stat";
-import { describe, expect, it } from "vitest";
-import { arrayOfRange, mockI18next } from "./utils/testUtils";
-
-const TEST_BATTLE_STAT = -99 as unknown as BattleStat;
-const TEST_POKEMON = "Testmon";
-const TEST_STAT = "Teststat";
-
-describe("battle-stat", () => {
- describe("getBattleStatName", () => {
- it("should return the correct name for each BattleStat", () => {
- mockI18next();
-
- expect(getBattleStatName(BattleStat.ATK)).toBe("pokemonInfo:Stat.ATK");
- expect(getBattleStatName(BattleStat.DEF)).toBe("pokemonInfo:Stat.DEF");
- expect(getBattleStatName(BattleStat.SPATK)).toBe(
- "pokemonInfo:Stat.SPATK"
- );
- expect(getBattleStatName(BattleStat.SPDEF)).toBe(
- "pokemonInfo:Stat.SPDEF"
- );
- expect(getBattleStatName(BattleStat.SPD)).toBe("pokemonInfo:Stat.SPD");
- expect(getBattleStatName(BattleStat.ACC)).toBe("pokemonInfo:Stat.ACC");
- expect(getBattleStatName(BattleStat.EVA)).toBe("pokemonInfo:Stat.EVA");
- });
-
- it("should fall back to ??? for an unknown BattleStat", () => {
- expect(getBattleStatName(TEST_BATTLE_STAT)).toBe("???");
- });
- });
-
- describe("getBattleStatLevelChangeDescription", () => {
- it("should return battle:statRose for +1", () => {
- mockI18next();
-
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- 1,
- true
- );
-
- expect(message).toBe("battle:statRose");
- });
-
- it("should return battle:statSharplyRose for +2", () => {
- mockI18next();
-
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- 2,
- true
- );
-
- expect(message).toBe("battle:statSharplyRose");
- });
-
- it("should return battle:statRoseDrastically for +3 to +6", () => {
- mockI18next();
-
- arrayOfRange(3, 6).forEach((n) => {
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- n,
- true
- );
-
- expect(message).toBe("battle:statRoseDrastically");
- });
- });
-
- it("should return battle:statWontGoAnyHigher for 7 or higher", () => {
- mockI18next();
-
- arrayOfRange(7, 10).forEach((n) => {
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- n,
- true
- );
-
- expect(message).toBe("battle:statWontGoAnyHigher");
- });
- });
-
- it("should return battle:statFell for -1", () => {
- mockI18next();
-
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- 1,
- false
- );
-
- expect(message).toBe("battle:statFell");
- });
-
- it("should return battle:statHarshlyFell for -2", () => {
- mockI18next();
-
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- 2,
- false
- );
-
- expect(message).toBe("battle:statHarshlyFell");
- });
-
- it("should return battle:statSeverelyFell for -3 to -6", () => {
- mockI18next();
-
- arrayOfRange(3, 6).forEach((n) => {
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- n,
- false
- );
-
- expect(message).toBe("battle:statSeverelyFell");
- });
- });
-
- it("should return battle:statWontGoAnyLower for -7 or lower", () => {
- mockI18next();
-
- arrayOfRange(7, 10).forEach((n) => {
- const message = getBattleStatLevelChangeDescription(
- TEST_POKEMON,
- TEST_STAT,
- n,
- false
- );
-
- expect(message).toBe("battle:statWontGoAnyLower");
- });
- });
- });
-});
diff --git a/src/test/battle/battle-order.test.ts b/src/test/battle/battle-order.test.ts
index 0129ecad254..e19168962dc 100644
--- a/src/test/battle/battle-order.test.ts
+++ b/src/test/battle/battle-order.test.ts
@@ -1,4 +1,3 @@
-import { Stat } from "#app/data/pokemon-stat";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { SelectTargetPhase } from "#app/phases/select-target-phase";
import { TurnStartPhase } from "#app/phases/turn-start-phase";
@@ -7,8 +6,7 @@ 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 { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
describe("Battle order", () => {
let phaserGame: Phaser.Game;
@@ -37,30 +35,42 @@ describe("Battle order", () => {
await game.startBattle([
Species.BULBASAUR,
]);
- game.scene.getParty()[0].stats[Stat.SPD] = 50;
- game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 150;
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set playerPokemon's speed to 50
+ vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150
game.move.select(Moves.TACKLE);
await game.phaseInterceptor.run(EnemyCommandPhase);
+
+ const playerPokemonIndex = playerPokemon.getBattlerIndex();
+ const enemyPokemonIndex = enemyPokemon.getBattlerIndex();
const phase = game.scene.getCurrentPhase() as TurnStartPhase;
- const order = phase.getOrder();
- expect(order[0]).toBe(2);
- expect(order[1]).toBe(0);
+ const order = phase.getCommandOrder();
+ expect(order[0]).toBe(enemyPokemonIndex);
+ expect(order[1]).toBe(playerPokemonIndex);
}, 20000);
it("Player faster than opponent 150 vs 50", async () => {
await game.startBattle([
Species.BULBASAUR,
]);
- game.scene.getParty()[0].stats[Stat.SPD] = 150;
- game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 50;
+
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ vi.spyOn(playerPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set playerPokemon's speed to 150
+ vi.spyOn(enemyPokemon, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50]); // set enemyPokemon's speed to 50
game.move.select(Moves.TACKLE);
await game.phaseInterceptor.run(EnemyCommandPhase);
+
+ const playerPokemonIndex = playerPokemon.getBattlerIndex();
+ const enemyPokemonIndex = enemyPokemon.getBattlerIndex();
const phase = game.scene.getCurrentPhase() as TurnStartPhase;
- const order = phase.getOrder();
- expect(order[0]).toBe(0);
- expect(order[1]).toBe(2);
+ const order = phase.getCommandOrder();
+ expect(order[0]).toBe(playerPokemonIndex);
+ expect(order[1]).toBe(enemyPokemonIndex);
}, 20000);
it("double - both opponents faster than player 50/50 vs 150/150", async () => {
@@ -69,20 +79,25 @@ describe("Battle order", () => {
Species.BULBASAUR,
Species.BLASTOISE,
]);
- game.scene.getParty()[0].stats[Stat.SPD] = 50;
- game.scene.getParty()[1].stats[Stat.SPD] = 50;
- game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 150;
- game.scene.currentBattle.enemyParty[1].stats[Stat.SPD] = 150;
+
+ const playerPokemon = game.scene.getPlayerField();
+ const enemyPokemon = game.scene.getEnemyField();
+
+ playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 50])); // set both playerPokemons' speed to 50
+ enemyPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150])); // set both enemyPokemons' speed to 150
+ const playerIndices = playerPokemon.map(p => p?.getBattlerIndex());
+ const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex());
game.move.select(Moves.TACKLE);
game.move.select(Moves.TACKLE, 1);
await game.phaseInterceptor.runFrom(SelectTargetPhase).to(TurnStartPhase, false);
+
const phase = game.scene.getCurrentPhase() as TurnStartPhase;
- const order = phase.getOrder();
- expect(order.indexOf(0)).toBeGreaterThan(order.indexOf(2));
- expect(order.indexOf(0)).toBeGreaterThan(order.indexOf(3));
- expect(order.indexOf(1)).toBeGreaterThan(order.indexOf(2));
- expect(order.indexOf(1)).toBeGreaterThan(order.indexOf(3));
+ const order = phase.getCommandOrder();
+ expect(order.slice(0, 2).includes(enemyIndices[0])).toBe(true);
+ expect(order.slice(0, 2).includes(enemyIndices[1])).toBe(true);
+ expect(order.slice(2, 4).includes(playerIndices[0])).toBe(true);
+ expect(order.slice(2, 4).includes(playerIndices[1])).toBe(true);
}, 20000);
it("double - speed tie except 1 - 100/100 vs 100/150", async () => {
@@ -91,19 +106,25 @@ describe("Battle order", () => {
Species.BULBASAUR,
Species.BLASTOISE,
]);
- game.scene.getParty()[0].stats[Stat.SPD] = 100;
- game.scene.getParty()[1].stats[Stat.SPD] = 100;
- game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 100;
- game.scene.currentBattle.enemyParty[1].stats[Stat.SPD] = 150;
+
+ const playerPokemon = game.scene.getPlayerField();
+ const enemyPokemon = game.scene.getEnemyField();
+ playerPokemon.forEach(p => vi.spyOn(p, "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100])); //set both playerPokemons' speed to 100
+ vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set enemyPokemon's speed to 100
+ vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set enemyPokemon's speed to 150
+ const playerIndices = playerPokemon.map(p => p?.getBattlerIndex());
+ const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex());
game.move.select(Moves.TACKLE);
game.move.select(Moves.TACKLE, 1);
await game.phaseInterceptor.runFrom(SelectTargetPhase).to(TurnStartPhase, false);
+
const phase = game.scene.getCurrentPhase() as TurnStartPhase;
- const order = phase.getOrder();
- expect(order.indexOf(3)).toBeLessThan(order.indexOf(0));
- expect(order.indexOf(3)).toBeLessThan(order.indexOf(1));
- expect(order.indexOf(3)).toBeLessThan(order.indexOf(2));
+ const order = phase.getCommandOrder();
+ expect(order[0]).toBe(enemyIndices[1]);
+ expect(order.slice(1, 4).includes(enemyIndices[0])).toBe(true);
+ expect(order.slice(1, 4).includes(playerIndices[0])).toBe(true);
+ expect(order.slice(1, 4).includes(playerIndices[1])).toBe(true);
}, 20000);
it("double - speed tie 100/150 vs 100/150", async () => {
@@ -112,19 +133,25 @@ describe("Battle order", () => {
Species.BULBASAUR,
Species.BLASTOISE,
]);
- game.scene.getParty()[0].stats[Stat.SPD] = 100;
- game.scene.getParty()[1].stats[Stat.SPD] = 150;
- game.scene.currentBattle.enemyParty[0].stats[Stat.SPD] = 100;
- game.scene.currentBattle.enemyParty[1].stats[Stat.SPD] = 150;
+
+ const playerPokemon = game.scene.getPlayerField();
+ const enemyPokemon = game.scene.getEnemyField();
+ vi.spyOn(playerPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one playerPokemon's speed to 100
+ vi.spyOn(playerPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other playerPokemon's speed to 150
+ vi.spyOn(enemyPokemon[0], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 100]); // set one enemyPokemon's speed to 100
+ vi.spyOn(enemyPokemon[1], "stats", "get").mockReturnValue([20, 20, 20, 20, 20, 150]); // set other enemyPokemon's speed to 150
+ const playerIndices = playerPokemon.map(p => p?.getBattlerIndex());
+ const enemyIndices = enemyPokemon.map(p => p?.getBattlerIndex());
game.move.select(Moves.TACKLE);
game.move.select(Moves.TACKLE, 1);
await game.phaseInterceptor.runFrom(SelectTargetPhase).to(TurnStartPhase, false);
+
const phase = game.scene.getCurrentPhase() as TurnStartPhase;
- const order = phase.getOrder();
- expect(order.indexOf(1)).toBeLessThan(order.indexOf(0));
- expect(order.indexOf(1)).toBeLessThan(order.indexOf(2));
- expect(order.indexOf(3)).toBeLessThan(order.indexOf(0));
- expect(order.indexOf(3)).toBeLessThan(order.indexOf(2));
+ const order = phase.getCommandOrder();
+ expect(order.slice(0, 2).includes(playerIndices[1])).toBe(true);
+ expect(order.slice(0, 2).includes(enemyIndices[1])).toBe(true);
+ expect(order.slice(2, 4).includes(playerIndices[0])).toBe(true);
+ expect(order.slice(2, 4).includes(enemyIndices[0])).toBe(true);
}, 20000);
});
diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts
index be89fdeb2af..25dfbc765bd 100644
--- a/src/test/battle/battle.test.ts
+++ b/src/test/battle/battle.test.ts
@@ -1,5 +1,5 @@
import { allSpecies } from "#app/data/pokemon-species";
-import { TempBattleStat } from "#app/data/temp-battle-stat";
+import { Stat } from "#enums/stat";
import { GameModes, getGameMode } from "#app/game-mode";
import { BattleEndPhase } from "#app/phases/battle-end-phase";
import { CommandPhase } from "#app/phases/command-phase";
@@ -320,7 +320,7 @@ describe("Test Battle Phase", () => {
.startingLevel(100)
.moveset([moveToUse])
.enemyMoveset(SPLASH_ONLY)
- .startingHeldItems([{ name: "TEMP_STAT_BOOSTER", type: TempBattleStat.ACC }]);
+ .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]);
await game.startBattle();
game.scene.getPlayerPokemon()!.hp = 1;
diff --git a/src/test/battle/inverse_battle.test.ts b/src/test/battle/inverse_battle.test.ts
new file mode 100644
index 00000000000..be8b04155eb
--- /dev/null
+++ b/src/test/battle/inverse_battle.test.ts
@@ -0,0 +1,203 @@
+import { BattlerIndex } from "#app/battle";
+import { allMoves } from "#app/data/move";
+import { Type } from "#app/data/type";
+import { MoveEndPhase } from "#app/phases/move-end-phase";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Abilities } from "#enums/abilities";
+import { ArenaTagType } from "#enums/arena-tag-type";
+import { Challenges } from "#enums/challenges";
+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";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Inverse Battle", () => {
+ 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.challengeMode.addChallenge(Challenges.INVERSE_BATTLE, 1, 1);
+
+ game.override
+ .battleType("single")
+ .starterSpecies(Species.FEEBAS)
+ .ability(Abilities.BALL_FETCH)
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.BALL_FETCH);
+ });
+
+ it("1. immune types are 2x effective - Thunderbolt against Ground Type", async () => {
+ game.override.enemySpecies(Species.SANDSHREW);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2);
+ }, TIMEOUT);
+
+ it("2. 2x effective types are 0.5x effective - Thunderbolt against Flying Type", async () => {
+ game.override.enemySpecies(Species.PIDGEY);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(0.5);
+ }, TIMEOUT);
+
+ it("3. 0.5x effective types are 2x effective - Thunderbolt against Electric Type", async () => {
+ game.override.enemySpecies(Species.CHIKORITA);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(enemy.getMoveEffectiveness(player, allMoves[Moves.THUNDERBOLT])).toBe(2);
+ }, TIMEOUT);
+
+ it("4. Stealth Rock follows the inverse matchups - Stealth Rock against Charizard deals 1/32 of max HP", async () => {
+ game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, Moves.STEALTH_ROCK, 0);
+ game.override
+ .enemySpecies(Species.CHARIZARD)
+ .enemyLevel(100);
+
+ await game.challengeMode.startBattle();
+
+ const charizard = game.scene.getEnemyPokemon()!;
+
+ const maxHp = charizard.getMaxHp();
+ const damage_prediction = Math.max(Math.round(charizard.getMaxHp() / 32), 1);
+ console.log("Damage calcuation before round: " + charizard.getMaxHp() / 32);
+ const currentHp = charizard.hp;
+ const expectedHP = maxHp - damage_prediction;
+
+ console.log("Charizard's max HP: " + maxHp, "Damage: " + damage_prediction, "Current HP: " + currentHp, "Expected HP: " + expectedHP);
+ expect(currentHp).toBeGreaterThan(maxHp * 31 / 32 - 1);
+ }, TIMEOUT);
+
+ it("5. Freeze Dry is 2x effective against Water Type like other Ice type Move - Freeze Dry against Squirtle", async () => {
+ game.override.enemySpecies(Species.SQUIRTLE);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FREEZE_DRY])).toBe(2);
+ }, TIMEOUT);
+
+ it("6. Water Absorb should heal against water moves - Water Absorb against Water gun", async () => {
+ game.override
+ .moveset([Moves.WATER_GUN])
+ .enemyAbility(Abilities.WATER_ABSORB);
+
+ await game.challengeMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ enemy.hp = enemy.getMaxHp() - 1;
+ game.move.select(Moves.WATER_GUN);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to(MoveEndPhase);
+
+ expect(enemy.hp).toBe(enemy.getMaxHp());
+ }, TIMEOUT);
+
+ it("7. Fire type does not get burned - Will-O-Wisp against Charmander", async () => {
+ game.override
+ .moveset([Moves.WILL_O_WISP])
+ .enemySpecies(Species.CHARMANDER);
+
+ await game.challengeMode.startBattle();
+
+ 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.phaseInterceptor.to(MoveEndPhase);
+
+ expect(enemy.status?.effect).not.toBe(StatusEffect.BURN);
+ }, TIMEOUT);
+
+ it("8. Electric type does not get paralyzed - Nuzzle against Pikachu", async () => {
+ game.override
+ .moveset([Moves.NUZZLE])
+ .enemySpecies(Species.PIKACHU)
+ .enemyLevel(50);
+
+ await game.challengeMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.NUZZLE);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+
+ await game.phaseInterceptor.to(MoveEndPhase);
+
+ expect(enemy.status?.effect).not.toBe(StatusEffect.PARALYSIS);
+ }, TIMEOUT);
+
+
+ it("10. Anticipation should trigger on 2x effective moves - Anticipation against Thunderbolt", async () => {
+ game.override
+ .moveset([Moves.THUNDERBOLT])
+ .enemySpecies(Species.SANDSHREW)
+ .enemyAbility(Abilities.ANTICIPATION);
+
+ await game.challengeMode.startBattle();
+
+ expect(game.scene.getEnemyPokemon()?.summonData.abilitiesApplied[0]).toBe(Abilities.ANTICIPATION);
+ }, TIMEOUT);
+
+ it("11. Conversion 2 should change the type to the resistive type - Conversion 2 against Dragonite", async () => {
+ game.override
+ .moveset([Moves.CONVERSION_2])
+ .enemyMoveset([Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW, Moves.DRAGON_CLAW]);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+
+ game.move.select(Moves.CONVERSION_2);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getTypes()[0]).toBe(Type.DRAGON);
+ }, TIMEOUT);
+
+ it("12. Flying Press should be 0.25x effective against Grass + Dark Type - Flying Press against Meowscarada", async () => {
+ game.override
+ .moveset([Moves.FLYING_PRESS])
+ .enemySpecies(Species.MEOWSCARADA);
+
+ await game.challengeMode.startBattle();
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(enemy.getMoveEffectiveness(player, allMoves[Moves.FLYING_PRESS])).toBe(0.25);
+ }, TIMEOUT);
+});
diff --git a/src/test/battlerTags/octolock.test.ts b/src/test/battlerTags/octolock.test.ts
index fa491589f09..7b1f9264370 100644
--- a/src/test/battlerTags/octolock.test.ts
+++ b/src/test/battlerTags/octolock.test.ts
@@ -1,16 +1,16 @@
import BattleScene from "#app/battle-scene";
-import { BattleStat } from "#app/data/battle-stat";
-import { BattlerTag, BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags";
-import { BattlerTagType } from "#app/enums/battler-tag-type";
-import Pokemon from "#app/field/pokemon";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
import { describe, expect, it, vi } from "vitest";
+import Pokemon from "#app/field/pokemon";
+import { BattlerTag, BattlerTagLapseType, OctolockTag, TrappedTag } from "#app/data/battler-tags";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { Stat } from "#enums/stat";
vi.mock("#app/battle-scene.js");
describe("BattlerTag - OctolockTag", () => {
describe("lapse behavior", () => {
- it("unshifts a StatChangePhase with expected stat changes", { timeout: 10000 }, async () => {
+ it("unshifts a StatStageChangePhase with expected stat stage changes", { timeout: 10000 }, async () => {
const mockPokemon = {
scene: new BattleScene(),
getBattlerIndex: () => 0,
@@ -19,9 +19,9 @@ describe("BattlerTag - OctolockTag", () => {
const subject = new OctolockTag(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(-1);
- expect((phase as StatChangePhase)["stats"]).toEqual([BattleStat.DEF, BattleStat.SPDEF]);
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(-1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual([ Stat.DEF, Stat.SPDEF ]);
});
subject.lapse(mockPokemon, BattlerTagLapseType.TURN_END);
diff --git a/src/test/battlerTags/stockpiling.test.ts b/src/test/battlerTags/stockpiling.test.ts
index fef1e938c09..e568016dfef 100644
--- a/src/test/battlerTags/stockpiling.test.ts
+++ b/src/test/battlerTags/stockpiling.test.ts
@@ -1,10 +1,10 @@
import BattleScene from "#app/battle-scene";
-import { BattleStat } from "#app/data/battle-stat";
-import { StockpilingTag } from "#app/data/battler-tags";
-import Pokemon, { PokemonSummonData } from "#app/field/pokemon";
-import * as messages from "#app/messages";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
import { beforeEach, describe, expect, it, vi } from "vitest";
+import Pokemon, { PokemonSummonData } from "#app/field/pokemon";
+import { StockpilingTag } from "#app/data/battler-tags";
+import { Stat } from "#enums/stat";
+import * as messages from "#app/messages";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
beforeEach(() => {
vi.spyOn(messages, "getPokemonNameWithAffix").mockImplementation(() => "");
@@ -12,7 +12,7 @@ beforeEach(() => {
describe("BattlerTag - StockpilingTag", () => {
describe("onAdd", () => {
- it("unshifts a StatChangePhase with expected stat changes on add", { timeout: 10000 }, async () => {
+ it("unshifts a StatStageChangePhase with expected stat stage changes on add", { timeout: 10000 }, async () => {
const mockPokemon = {
scene: vi.mocked(new BattleScene()) as BattleScene,
getBattlerIndex: () => 0,
@@ -23,11 +23,11 @@ describe("BattlerTag - StockpilingTag", () => {
const subject = new StockpilingTag(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ]));
- (phase as StatChangePhase)["onChange"]!(mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]);
+ (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [Stat.DEF, Stat.SPDEF], [1, 1]);
});
subject.onAdd(mockPokemon);
@@ -35,7 +35,7 @@ describe("BattlerTag - StockpilingTag", () => {
expect(mockPokemon.scene.unshiftPhase).toBeCalledTimes(1);
});
- it("unshifts a StatChangePhase with expected stat changes on add (one stat maxed)", { timeout: 10000 }, async () => {
+ it("unshifts a StatStageChangePhase with expected stat changes on add (one stat maxed)", { timeout: 10000 }, async () => {
const mockPokemon = {
scene: new BattleScene(),
summonData: new PokemonSummonData(),
@@ -44,17 +44,17 @@ describe("BattlerTag - StockpilingTag", () => {
vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {});
- mockPokemon.summonData.battleStats[BattleStat.DEF] = 6;
- mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 5;
+ mockPokemon.summonData.statStages[Stat.DEF - 1] = 6;
+ mockPokemon.summonData.statStages[Stat.SPD - 1] = 5;
const subject = new StockpilingTag(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.DEF, Stat.SPDEF]));
- (phase as StatChangePhase)["onChange"]!(mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]);
+ (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [1, 1]);
});
subject.onAdd(mockPokemon);
@@ -64,7 +64,7 @@ describe("BattlerTag - StockpilingTag", () => {
});
describe("onOverlap", () => {
- it("unshifts a StatChangePhase with expected stat changes on overlap", { timeout: 10000 }, async () => {
+ it("unshifts a StatStageChangePhase with expected stat changes on overlap", { timeout: 10000 }, async () => {
const mockPokemon = {
scene: new BattleScene(),
getBattlerIndex: () => 0,
@@ -75,11 +75,11 @@ describe("BattlerTag - StockpilingTag", () => {
const subject = new StockpilingTag(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementation(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ]));
- (phase as StatChangePhase)["onChange"]!(mockPokemon, [BattleStat.DEF, BattleStat.SPDEF], [1, 1]);
+ (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.DEF, Stat.SPDEF ], [1, 1]);
});
subject.onOverlap(mockPokemon);
@@ -98,39 +98,39 @@ describe("BattlerTag - StockpilingTag", () => {
vi.spyOn(mockPokemon.scene, "queueMessage").mockImplementation(() => {});
- mockPokemon.summonData.battleStats[BattleStat.DEF] = 5;
- mockPokemon.summonData.battleStats[BattleStat.SPDEF] = 4;
+ mockPokemon.summonData.statStages[Stat.DEF - 1] = 5;
+ mockPokemon.summonData.statStages[Stat.SPD - 1] = 4;
const subject = new StockpilingTag(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ]));
// def doesn't change
- (phase as StatChangePhase)["onChange"]!(mockPokemon, [BattleStat.SPDEF], [1]);
+ (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [1]);
});
subject.onAdd(mockPokemon);
expect(subject.stockpiledCount).toBe(1);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ]));
// def doesn't change
- (phase as StatChangePhase)["onChange"]!(mockPokemon, [BattleStat.SPDEF], [1]);
+ (phase as StatStageChangePhase)["onChange"]!(mockPokemon, [ Stat.SPDEF ], [1]);
});
subject.onOverlap(mockPokemon);
expect(subject.stockpiledCount).toBe(2);
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(1);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.DEF, BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(1);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([ Stat.DEF, Stat.SPDEF ]));
// neither stat changes, stack count should still increase
});
@@ -138,20 +138,20 @@ describe("BattlerTag - StockpilingTag", () => {
subject.onOverlap(mockPokemon);
expect(subject.stockpiledCount).toBe(3);
- vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => {
+ vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(_phase => {
throw new Error("Should not be called a fourth time");
});
// fourth stack should not be applied
subject.onOverlap(mockPokemon);
expect(subject.stockpiledCount).toBe(3);
- expect(subject.statChangeCounts).toMatchObject({ [BattleStat.DEF]: 0, [BattleStat.SPDEF]: 2 });
+ expect(subject.statChangeCounts).toMatchObject({ [ Stat.DEF ]: 0, [Stat.SPDEF]: 2 });
// removing tag should reverse stat changes
vi.spyOn(mockPokemon.scene, "unshiftPhase").mockImplementationOnce(phase => {
- expect(phase).toBeInstanceOf(StatChangePhase);
- expect((phase as StatChangePhase)["levels"]).toEqual(-2);
- expect((phase as StatChangePhase)["stats"]).toEqual(expect.arrayContaining([BattleStat.SPDEF]));
+ expect(phase).toBeInstanceOf(StatStageChangePhase);
+ expect((phase as StatStageChangePhase)["stages"]).toEqual(-2);
+ expect((phase as StatStageChangePhase)["stats"]).toEqual(expect.arrayContaining([Stat.SPDEF]));
});
subject.onRemove(mockPokemon);
diff --git a/src/test/boss-pokemon.test.ts b/src/test/boss-pokemon.test.ts
new file mode 100644
index 00000000000..c6fc276551f
--- /dev/null
+++ b/src/test/boss-pokemon.test.ts
@@ -0,0 +1,215 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import GameManager from "./utils/gameManager";
+import { Species } from "#app/enums/species";
+import { getPokemonSpecies } from "#app/data/pokemon-species";
+import { SPLASH_ONLY } from "./utils/testUtils";
+import { Abilities } from "#app/enums/abilities";
+import { Moves } from "#app/enums/moves";
+import { EFFECTIVE_STATS } from "#app/enums/stat";
+import { EnemyPokemon } from "#app/field/pokemon";
+import { toDmgValue } from "#app/utils";
+
+describe("Boss Pokemon / Shields", () => {
+ const TIMEOUT = 20 * 1000;
+
+ 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")
+ .disableTrainerWaves()
+ .disableCrits()
+ .enemySpecies(Species.RATTATA)
+ .enemyMoveset(SPLASH_ONLY)
+ .enemyHeldItems([])
+ .startingLevel(1000)
+ .moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH])
+ .ability(Abilities.NO_GUARD);
+ });
+
+ it("Pokemon should get shields based on their Species and level and the current wave", async () => {
+ let level = 50;
+ let wave = 5;
+
+ // On normal waves, no shields...
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(0);
+ // ... expect (sub)-legendary and mythical Pokemon who always get shields
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.MEW))).toBe(2);
+ // Pokemon with 670+ BST get an extra shield
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.MEWTWO))).toBe(3);
+
+ // Every 10 waves will always be a boss Pokemon with shield(s)
+ wave = 50;
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(2);
+ // Every extra 250 waves adds a shield
+ wave += 250;
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(3);
+ wave += 750;
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(6);
+
+ // Pokemon above level 100 get an extra shield
+ level = 100;
+ expect(game.scene.getEncounterBossSegments(wave, level, getPokemonSpecies(Species.RATTATA))).toBe(7);
+ }, TIMEOUT);
+
+ it("should reduce the number of shields if we are in a double battle", async () => {
+ game.override
+ .battleType("double")
+ .startingWave(150); // Floor 150 > 2 shields / 3 health segments
+
+ await game.classicMode.startBattle([ Species.MEWTWO ]);
+
+ const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
+ const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
+ expect(boss1.isBoss()).toBe(true);
+ expect(boss1.bossSegments).toBe(2);
+ expect(boss2.isBoss()).toBe(true);
+ expect(boss2.bossSegments).toBe(2);
+ }, TIMEOUT);
+
+ it("shields should stop overflow damage and give stat stage boosts when broken", async () => {
+ game.override.startingWave(150); // Floor 150 > 2 shields / 3 health segments
+
+ await game.classicMode.startBattle([ Species.MEWTWO ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ const segmentHp = enemyPokemon.getMaxHp() / enemyPokemon.bossSegments;
+ expect(enemyPokemon.isBoss()).toBe(true);
+ expect(enemyPokemon.bossSegments).toBe(3);
+ expect(getTotalStatStageBoosts(enemyPokemon)).toBe(0);
+
+ game.move.select(Moves.SUPER_FANG); // Enough to break the first shield
+ await game.toNextTurn();
+
+ // Broke 1st of 2 shields, health at 2/3rd
+ expect(enemyPokemon.bossSegmentIndex).toBe(1);
+ expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(segmentHp));
+ // Breaking the shield gives a +1 boost to ATK, DEF, SP ATK, SP DEF or SPD
+ expect(getTotalStatStageBoosts(enemyPokemon)).toBe(1);
+
+ game.move.select(Moves.FALSE_SWIPE); // Enough to break last shield but not kill
+ await game.toNextTurn();
+
+ expect(enemyPokemon.bossSegmentIndex).toBe(0);
+ expect(enemyPokemon.hp).toBe(enemyPokemon.getMaxHp() - toDmgValue(2 * segmentHp));
+ // Breaking the last shield gives a +2 boost to ATK, DEF, SP ATK, SP DEF or SPD
+ expect(getTotalStatStageBoosts(enemyPokemon)).toBe(3);
+
+ }, TIMEOUT);
+
+ it("breaking multiple shields at once requires extra damage", async () => {
+ game.override
+ .battleType("double")
+ .enemyHealthSegments(5);
+
+ await game.classicMode.startBattle([ Species.MEWTWO ]);
+
+ // In this test we want to break through 3 shields at once
+ const brokenShields = 3;
+
+ const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
+ const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments;
+ const requiredDamageBoss1 = boss1SegmentHp * (1 + Math.pow(2, brokenShields));
+ expect(boss1.isBoss()).toBe(true);
+ expect(boss1.bossSegments).toBe(5);
+ expect(boss1.bossSegmentIndex).toBe(4);
+
+ // Not enough damage to break through all shields
+ boss1.damageAndUpdate(Math.floor(requiredDamageBoss1 - 5));
+ expect(boss1.bossSegmentIndex).toBe(1);
+ expect(boss1.hp).toBe(boss1.getMaxHp() - toDmgValue(boss1SegmentHp * 3));
+
+ const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
+ const boss2SegmentHp = boss2.getMaxHp() / boss2.bossSegments;
+ const requiredDamageBoss2 = boss2SegmentHp * (1 + Math.pow(2, brokenShields));
+
+ expect(boss2.isBoss()).toBe(true);
+ expect(boss2.bossSegments).toBe(5);
+
+ // Enough damage to break through all shields
+ boss2.damageAndUpdate(Math.ceil(requiredDamageBoss2));
+ expect(boss2.bossSegmentIndex).toBe(0);
+ expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * 4));
+
+ }, TIMEOUT);
+
+ it("the number of stat stage boosts is consistent when several shields are broken at once", async () => {
+ const shieldsToBreak = 4;
+
+ game.override
+ .battleType("double")
+ .enemyHealthSegments(shieldsToBreak + 1);
+
+ await game.classicMode.startBattle([ Species.MEWTWO ]);
+
+ const boss1: EnemyPokemon = game.scene.getEnemyParty()[0]!;
+ const boss1SegmentHp = boss1.getMaxHp() / boss1.bossSegments;
+ const singleShieldDamage = Math.ceil(boss1SegmentHp);
+ expect(boss1.isBoss()).toBe(true);
+ expect(boss1.bossSegments).toBe(shieldsToBreak + 1);
+ expect(boss1.bossSegmentIndex).toBe(shieldsToBreak);
+ expect(getTotalStatStageBoosts(boss1)).toBe(0);
+
+
+ let totalStatStages = 0;
+
+ // Break the shields one by one
+ for (let i = 1; i <= shieldsToBreak; i++) {
+ boss1.damageAndUpdate(singleShieldDamage);
+ expect(boss1.bossSegmentIndex).toBe(shieldsToBreak - i);
+ expect(boss1.hp).toBe(boss1.getMaxHp() - toDmgValue(boss1SegmentHp * i));
+ // Do nothing and go to next turn so that the StatStageChangePhase gets applied
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+ // All broken shields give +1 stat boost, except the last two that gives +2
+ totalStatStages += i >= shieldsToBreak -1? 2 : 1;
+ expect(getTotalStatStageBoosts(boss1)).toBe(totalStatStages);
+ }
+
+ const boss2: EnemyPokemon = game.scene.getEnemyParty()[1]!;
+ const boss2SegmentHp = boss2.getMaxHp() / boss2.bossSegments;
+ const requiredDamage = boss2SegmentHp * (1 + Math.pow(2, shieldsToBreak - 1));
+
+ expect(boss2.isBoss()).toBe(true);
+ expect(boss2.bossSegments).toBe(shieldsToBreak + 1);
+ expect(boss2.bossSegmentIndex).toBe(shieldsToBreak);
+ expect(getTotalStatStageBoosts(boss2)).toBe(0);
+
+ // Enough damage to break all shields at once
+ boss2.damageAndUpdate(Math.ceil(requiredDamage));
+ expect(boss2.bossSegmentIndex).toBe(0);
+ expect(boss2.hp).toBe(boss2.getMaxHp() - toDmgValue(boss2SegmentHp * shieldsToBreak));
+ // Do nothing and go to next turn so that the StatStageChangePhase gets applied
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+ expect(getTotalStatStageBoosts(boss2)).toBe(totalStatStages);
+
+ }, TIMEOUT);
+
+ /**
+ * Gets the sum of the effective stat stage boosts for the given Pokemon
+ * @param enemyPokemon the pokemon to get stats from
+ * @returns the total stats boosts
+ */
+ function getTotalStatStageBoosts(enemyPokemon: EnemyPokemon): number {
+ let boosts = 0;
+ for (const s of EFFECTIVE_STATS) {
+ boosts += enemyPokemon.getStatStage(s);
+ }
+ return boosts;
+ }
+});
+
diff --git a/src/test/eggs/egg.test.ts b/src/test/eggs/egg.test.ts
index 28f1b7f0a6c..4f00e843b47 100644
--- a/src/test/eggs/egg.test.ts
+++ b/src/test/eggs/egg.test.ts
@@ -12,6 +12,7 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vite
describe("Egg Generation Tests", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
+ const EGG_HATCH_COUNT: integer = 1000;
beforeAll(() => {
phaserGame = new Phaser.Game({
@@ -47,14 +48,21 @@ describe("Egg Generation Tests", () => {
expect(result).toBe(expectedSpecies);
});
- it("should hatch an Arceus. Set from legendary gacha", async () => {
+ it("should hatch an Arceus around half the time. Set from legendary gacha", async () => {
const scene = game.scene;
const timestamp = new Date(2024, 6, 10, 15, 0, 0, 0).getTime();
const expectedSpecies = Species.ARCEUS;
+ let gachaSpeciesCount = 0;
- const result = new Egg({ scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.MASTER }).generatePlayerPokemon(scene).species.speciesId;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ const result = new Egg({ scene, timestamp, sourceType: EggSourceType.GACHA_LEGENDARY, tier: EggTier.MASTER }).generatePlayerPokemon(scene).species.speciesId;
+ if (result === expectedSpecies) {
+ gachaSpeciesCount++;
+ }
+ }
- expect(result).toBe(expectedSpecies);
+ expect(gachaSpeciesCount).toBeGreaterThan(0.4 * EGG_HATCH_COUNT);
+ expect(gachaSpeciesCount).toBeLessThan(0.6 * EGG_HATCH_COUNT);
});
it("should hatch an Arceus. Set from species", () => {
const scene = game.scene;
@@ -156,7 +164,7 @@ describe("Egg Generation Tests", () => {
const scene = game.scene;
const eggMoveIndex = new Egg({ scene }).eggMoveIndex;
- const result = eggMoveIndex && eggMoveIndex >= 0 && eggMoveIndex <= 3;
+ const result = !Utils.isNullOrUndefined(eggMoveIndex) && eggMoveIndex >= 0 && eggMoveIndex <= 3;
expect(result).toBe(true);
});
@@ -309,4 +317,63 @@ describe("Egg Generation Tests", () => {
expect(egg.variantTier).toBe(VariantTier.EPIC);
});
+
+ it("should generate egg moves, species, shinyness, and ability unpredictably for the egg gacha", () => {
+ const scene = game.scene;
+ scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ scene.resetSeed();
+
+ const firstEgg = new Egg({scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON});
+ const firstHatch = firstEgg.generatePlayerPokemon(scene);
+ let diffEggMove = false;
+ let diffSpecies = false;
+ let diffShiny = false;
+ let diffAbility = false;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ scene.gameData.unlockPity[EggTier.COMMON] = 0;
+ scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ scene.resetSeed(); // Make sure that eggs are unpredictable even if using same seed
+
+ const newEgg = new Egg({scene, sourceType: EggSourceType.GACHA_SHINY, tier: EggTier.COMMON});
+ const newHatch = newEgg.generatePlayerPokemon(scene);
+ diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex);
+ diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId);
+ diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny);
+ diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex);
+ }
+
+ expect(diffEggMove).toBe(true);
+ expect(diffSpecies).toBe(true);
+ expect(diffShiny).toBe(true);
+ expect(diffAbility).toBe(true);
+ });
+
+ it("should generate egg moves, shinyness, and ability unpredictably for species eggs", () => {
+ const scene = game.scene;
+ scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ scene.resetSeed();
+
+ const firstEgg = new Egg({scene, species: Species.BULBASAUR});
+ const firstHatch = firstEgg.generatePlayerPokemon(scene);
+ let diffEggMove = false;
+ let diffSpecies = false;
+ let diffShiny = false;
+ let diffAbility = false;
+ for (let i = 0; i < EGG_HATCH_COUNT; i++) {
+ scene.setSeed("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
+ scene.resetSeed(); // Make sure that eggs are unpredictable even if using same seed
+
+ const newEgg = new Egg({scene, species: Species.BULBASAUR});
+ const newHatch = newEgg.generatePlayerPokemon(scene);
+ diffEggMove = diffEggMove || (newEgg.eggMoveIndex !== firstEgg.eggMoveIndex);
+ diffSpecies = diffSpecies || (newHatch.species.speciesId !== firstHatch.species.speciesId);
+ diffShiny = diffShiny || (newHatch.shiny !== firstHatch.shiny);
+ diffAbility = diffAbility || (newHatch.abilityIndex !== firstHatch.abilityIndex);
+ }
+
+ expect(diffEggMove).toBe(true);
+ expect(diffSpecies).toBe(false);
+ expect(diffShiny).toBe(true);
+ expect(diffAbility).toBe(true);
+ });
});
diff --git a/src/test/endless_boss.test.ts b/src/test/endless_boss.test.ts
index e983be245b6..8a564695e42 100644
--- a/src/test/endless_boss.test.ts
+++ b/src/test/endless_boss.test.ts
@@ -32,7 +32,7 @@ describe("Endless Boss", () => {
it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Endless`, async () => {
game.override.startingWave(EndlessBossWave.Minor);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.ENDLESS);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS);
expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -44,7 +44,7 @@ describe("Endless Boss", () => {
it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Endless`, async () => {
game.override.startingWave(EndlessBossWave.Major);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.ENDLESS);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS);
expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -56,7 +56,7 @@ describe("Endless Boss", () => {
it(`should spawn a minor boss every ${EndlessBossWave.Minor} waves in END biome in Spliced Endless`, async () => {
game.override.startingWave(EndlessBossWave.Minor);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.SPLICED_ENDLESS);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS);
expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Minor);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -68,7 +68,7 @@ describe("Endless Boss", () => {
it(`should spawn a major boss every ${EndlessBossWave.Major} waves in END biome in Spliced Endless`, async () => {
game.override.startingWave(EndlessBossWave.Major);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.SPLICED_ENDLESS);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.SPLICED_ENDLESS);
expect(game.scene.currentBattle.waveIndex).toBe(EndlessBossWave.Major);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -80,7 +80,7 @@ describe("Endless Boss", () => {
it(`should NOT spawn major or minor boss outside wave ${EndlessBossWave.Minor}s in END biome`, async () => {
game.override.startingWave(EndlessBossWave.Minor - 1);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.ENDLESS);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.ENDLESS);
expect(game.scene.currentBattle.waveIndex).not.toBe(EndlessBossWave.Minor);
expect(game.scene.getEnemyPokemon()!.species.speciesId).not.toBe(Species.ETERNATUS);
diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts
index 41088c17bcb..9f0806b8e24 100644
--- a/src/test/evolution.test.ts
+++ b/src/test/evolution.test.ts
@@ -1,9 +1,12 @@
import { pokemonEvolutions, SpeciesFormEvolution, SpeciesWildEvolutionDelay } from "#app/data/pokemon-evolutions";
import { Abilities } from "#app/enums/abilities";
+import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
+import * as Utils from "#app/utils";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "./utils/testUtils";
describe("Evolution", () => {
let phaserGame: Phaser.Game;
@@ -76,12 +79,15 @@ describe("Evolution", () => {
const nincada = game.scene.getPlayerPokemon()!;
nincada.abilityIndex = 2;
+ nincada.metBiome = -1;
nincada.evolve(pokemonEvolutions[Species.NINCADA][0], nincada.getSpeciesForm());
const ninjask = game.scene.getParty()[0];
const shedinja = game.scene.getParty()[1];
expect(ninjask.abilityIndex).toBe(2);
expect(shedinja.abilityIndex).toBe(1);
+ // Regression test for https://github.com/pagefaultgames/pokerogue/issues/3842
+ expect(shedinja.metBiome).toBe(-1);
}, TIMEOUT);
it("should set wild delay to NONE by default", () => {
@@ -89,4 +95,85 @@ describe("Evolution", () => {
expect(speciesFormEvo.wildDelay).toBe(SpeciesWildEvolutionDelay.NONE);
});
+
+ it("should increase both HP and max HP when evolving", async () => {
+ game.override.moveset([Moves.SURF])
+ .enemySpecies(Species.GOLEM)
+ .enemyMoveset(SPLASH_ONLY)
+ .startingWave(21)
+ .startingLevel(16)
+ .enemyLevel(50);
+
+ await game.startBattle([Species.TOTODILE]);
+
+ const totodile = game.scene.getPlayerPokemon()!;
+ const hpBefore = totodile.hp;
+
+ expect(totodile.hp).toBe(totodile.getMaxHp());
+
+ const golem = game.scene.getEnemyPokemon()!;
+ golem.hp = 1;
+
+ expect(golem.hp).toBe(1);
+
+ game.move.select(Moves.SURF);
+ await game.phaseInterceptor.to("EndEvolutionPhase");
+
+ expect(totodile.hp).toBe(totodile.getMaxHp());
+ expect(totodile.hp).toBeGreaterThan(hpBefore);
+ }, TIMEOUT);
+
+ it("should not fully heal HP when evolving", async () => {
+ game.override.moveset([Moves.SURF])
+ .enemySpecies(Species.GOLEM)
+ .enemyMoveset(SPLASH_ONLY)
+ .startingWave(21)
+ .startingLevel(13)
+ .enemyLevel(30);
+
+ await game.startBattle([Species.CYNDAQUIL]);
+
+ const cyndaquil = game.scene.getPlayerPokemon()!;
+ cyndaquil.hp = Math.floor(cyndaquil.getMaxHp() / 2);
+ const hpBefore = cyndaquil.hp;
+ const maxHpBefore = cyndaquil.getMaxHp();
+
+ expect(cyndaquil.hp).toBe(Math.floor(cyndaquil.getMaxHp() / 2));
+
+ const golem = game.scene.getEnemyPokemon()!;
+ golem.hp = 1;
+
+ expect(golem.hp).toBe(1);
+
+ game.move.select(Moves.SURF);
+ await game.phaseInterceptor.to("EndEvolutionPhase");
+
+ expect(cyndaquil.getMaxHp()).toBeGreaterThan(maxHpBefore);
+ expect(cyndaquil.hp).toBeGreaterThan(hpBefore);
+ expect(cyndaquil.hp).toBeLessThan(cyndaquil.getMaxHp());
+ }, TIMEOUT);
+
+ it("should handle rng-based split evolution", async () => {
+ /* this test checks to make sure that tandemaus will
+ * evolve into a 3 family maushold 25% of the time
+ * and a 4 family maushold the other 75% of the time
+ * This is done by using the getEvolution method in pokemon.ts
+ * getEvolution will give back the form that the pokemon can evolve into
+ * It does this by checking the pokemon conditions in pokemon-forms.ts
+ * For tandemaus, the conditions are random due to a randSeedInt(4)
+ * If the value is 0, it's a 3 family maushold, whereas if the value is
+ * 1, 2 or 3, it's a 4 family maushold
+ */
+ await game.startBattle([Species.TANDEMAUS]); // starts us off with a tandemaus
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+ playerPokemon.level = 25; // tandemaus evolves at level 25
+ vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); // setting the random generator to be 0 to force a three family maushold
+ const threeForm = playerPokemon.getEvolution()!;
+ expect(threeForm.evoFormKey).toBe("three"); // as per pokemon-forms, the evoFormKey for 3 family mausholds is "three"
+ for (let f = 1; f < 4; f++) {
+ vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds
+ const fourForm = playerPokemon.getEvolution()!;
+ expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null
+ }
+ }, TIMEOUT);
});
diff --git a/src/test/evolutions/evolutions.test.ts b/src/test/evolutions/evolutions.test.ts
deleted file mode 100644
index 2028764115c..00000000000
--- a/src/test/evolutions/evolutions.test.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-import * as Utils from "#app/utils";
-import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
-import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
-
-describe("Evolution tests", () => {
- let phaserGame: Phaser.Game;
- let game: GameManager;
-
- beforeAll(() => {
- phaserGame = new Phaser.Game({
- type: Phaser.HEADLESS,
- });
- });
-
- afterEach(() => {
- game.phaseInterceptor.restoreOg();
- });
-
- beforeEach(() => {
- game = new GameManager(phaserGame);
- });
-
- it("tandemaus evolution form test", async () => {
- /* this test checks to make sure that tandemaus will
- * evolve into a 3 family maushold 25% of the time
- * and a 4 family maushold the other 75% of the time
- * This is done by using the getEvolution method in pokemon.ts
- * getEvolution will give back the form that the pokemon can evolve into
- * It does this by checking the pokemon conditions in pokemon-forms.ts
- * For tandemaus, the conditions are random due to a randSeedInt(4)
- * If the value is 0, it's a 3 family maushold, whereas if the value is
- * 1, 2 or 3, it's a 4 family maushold
- */
- await game.startBattle([Species.TANDEMAUS]); // starts us off with a tandemaus
- const playerPokemon = game.scene.getPlayerPokemon()!;
- playerPokemon.level = 25; // tandemaus evolves at level 25
- vi.spyOn(Utils, "randSeedInt").mockReturnValue(0); // setting the random generator to be 0 to force a three family maushold
- const threeForm = playerPokemon.getEvolution()!;
- expect(threeForm.evoFormKey).toBe("three"); // as per pokemon-forms, the evoFormKey for 3 family mausholds is "three"
- for (let f = 1; f < 4; f++) {
- vi.spyOn(Utils, "randSeedInt").mockReturnValue(f); // setting the random generator to 1, 2 and 3 to force 4 family mausholds
- const fourForm = playerPokemon.getEvolution()!;
- expect(fourForm.evoFormKey).toBe(null); // meanwhile, according to the pokemon-forms, the evoFormKey for a 4 family maushold is null
- }
- }, 5000);
-});
diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts
index 0f59572619b..5d006998a0b 100644
--- a/src/test/final_boss.test.ts
+++ b/src/test/final_boss.test.ts
@@ -1,8 +1,13 @@
+import { StatusEffect } from "#app/data/status-effect";
+import { Abilities } from "#app/enums/abilities";
import { Biome } from "#app/enums/biome";
+import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
import { GameModes } from "#app/game-mode";
+import { TurnHeldItemTransferModifier } from "#app/modifier/modifier";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
import GameManager from "./utils/gameManager";
+import { SPLASH_ONLY } from "./utils/testUtils";
const FinalWave = {
Classic: 200,
@@ -20,7 +25,13 @@ describe("Final Boss", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.startingWave(FinalWave.Classic).startingBiome(Biome.END).disableCrits();
+ game.override
+ .startingWave(FinalWave.Classic)
+ .startingBiome(Biome.END)
+ .disableCrits()
+ .enemyMoveset(SPLASH_ONLY)
+ .moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ])
+ .startingLevel(10000);
});
afterEach(() => {
@@ -28,7 +39,7 @@ describe("Final Boss", () => {
});
it("should spawn Eternatus on wave 200 in END biome", async () => {
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC);
expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -37,7 +48,7 @@ describe("Final Boss", () => {
it("should NOT spawn Eternatus before wave 200 in END biome", async () => {
game.override.startingWave(FinalWave.Classic - 1);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC);
expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic);
expect(game.scene.arena.biomeType).toBe(Biome.END);
@@ -46,7 +57,7 @@ describe("Final Boss", () => {
it("should NOT spawn Eternatus outside of END biome", async () => {
game.override.startingBiome(Biome.FOREST);
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC);
expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic);
expect(game.scene.arena.biomeType).not.toBe(Biome.END);
@@ -54,12 +65,81 @@ describe("Final Boss", () => {
});
it("should not have passive enabled on Eternatus", async () => {
- await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC);
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC);
- const eternatus = game.scene.getEnemyPokemon();
- expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS);
- expect(eternatus?.hasPassive()).toBe(false);
+ const eternatus = game.scene.getEnemyPokemon()!;
+ expect(eternatus.species.speciesId).toBe(Species.ETERNATUS);
+ expect(eternatus.hasPassive()).toBe(false);
+ });
+
+ it("should change form on direct hit down to last boss fragment", async () => {
+ await game.runToFinalBossEncounter([Species.KYUREM], GameModes.CLASSIC);
+ await game.phaseInterceptor.to("CommandPhase");
+
+ // Eternatus phase 1
+ const eternatus = game.scene.getEnemyPokemon()!;
+ const phase1Hp = eternatus.getMaxHp();
+ expect(eternatus.species.speciesId).toBe(Species.ETERNATUS);
+ expect(eternatus.formIndex).toBe(0);
+ expect(eternatus.bossSegments).toBe(4);
+ expect(eternatus.bossSegmentIndex).toBe(3);
+
+ game.move.select(Moves.DRAGON_PULSE);
+ await game.toNextTurn();
+
+ // Eternatus phase 2: changed form, healed and restored its shields
+ expect(eternatus.species.speciesId).toBe(Species.ETERNATUS);
+ expect(eternatus.hp).toBeGreaterThan(phase1Hp);
+ expect(eternatus.hp).toBe(eternatus.getMaxHp());
+ expect(eternatus.formIndex).toBe(1);
+ expect(eternatus.bossSegments).toBe(5);
+ expect(eternatus.bossSegmentIndex).toBe(4);
+ const miniBlackHole = eternatus.getHeldItems().find(m => m instanceof TurnHeldItemTransferModifier);
+ expect(miniBlackHole).toBeDefined();
+ expect(miniBlackHole?.stackCount).toBe(1);
+ });
+
+ it("should change form on status damage down to last boss fragment", async () => {
+ game.override.ability(Abilities.NO_GUARD);
+
+ await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC);
+ await game.phaseInterceptor.to("CommandPhase");
+
+ // Eternatus phase 1
+ const eternatus = game.scene.getEnemyPokemon()!;
+ const phase1Hp = eternatus.getMaxHp();
+ expect(eternatus.species.speciesId).toBe(Species.ETERNATUS);
+ expect(eternatus.formIndex).toBe(0);
+ expect(eternatus.bossSegments).toBe(4);
+ expect(eternatus.bossSegmentIndex).toBe(3);
+
+ game.move.select(Moves.WILL_O_WISP);
+ await game.toNextTurn();
+ expect(eternatus.status?.effect).toBe(StatusEffect.BURN);
+
+ const tickDamage = phase1Hp - eternatus.hp;
+ const lastShieldHp = Math.ceil(phase1Hp / eternatus.bossSegments);
+ // Stall until the burn is one hit away from breaking the last shield
+ while (eternatus.hp - tickDamage > lastShieldHp) {
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+ }
+
+ expect(eternatus.bossSegmentIndex).toBe(1);
+
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+
+ // Eternatus phase 2: changed form, healed and restored its shields
+ expect(eternatus.hp).toBeGreaterThan(phase1Hp);
+ expect(eternatus.hp).toBe(eternatus.getMaxHp());
+ expect(eternatus.status).toBeFalsy();
+ expect(eternatus.formIndex).toBe(1);
+ expect(eternatus.bossSegments).toBe(5);
+ expect(eternatus.bossSegmentIndex).toBe(4);
+ const miniBlackHole = eternatus.getHeldItems().find(m => m instanceof TurnHeldItemTransferModifier);
+ expect(miniBlackHole).toBeDefined();
+ expect(miniBlackHole?.stackCount).toBe(1);
});
- it.todo("should change form on direct hit down to last boss fragment", () => {});
});
diff --git a/src/test/items/dire_hit.test.ts b/src/test/items/dire_hit.test.ts
new file mode 100644
index 00000000000..02f7c0d06a4
--- /dev/null
+++ b/src/test/items/dire_hit.test.ts
@@ -0,0 +1,98 @@
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import GameManager from "#test/utils/gameManager";
+import Phase from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+import { BattleEndPhase } from "#app/phases/battle-end-phase";
+import { TempCritBoosterModifier } from "#app/modifier/modifier";
+import { Mode } from "#app/ui/ui";
+import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
+import { Button } from "#app/enums/buttons";
+import { CommandPhase } from "#app/phases/command-phase";
+import { NewBattlePhase } from "#app/phases/new-battle-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
+
+describe("Items - Dire Hit", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ beforeAll(() => {
+ phaserGame = new Phase.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .enemyMoveset(SPLASH_ONLY)
+ .moveset([ Moves.POUND ])
+ .startingHeldItems([{ name: "DIRE_HIT" }])
+ .battleType("single")
+ .disableCrits();
+
+ }, 20000);
+
+ it("should raise CRIT stage by 1", async () => {
+ await game.startBattle([
+ Species.GASTLY
+ ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemyPokemon, "getCritStage");
+
+ game.move.select(Moves.POUND);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(enemyPokemon.getCritStage).toHaveReturnedWith(1);
+ }, 20000);
+
+ it("should renew how many battles are left of existing DIRE_HIT when picking up new DIRE_HIT", async() => {
+ game.override.itemRewards([{ name: "DIRE_HIT" }]);
+
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ game.move.select(Moves.SPLASH);
+
+ await game.doKillOpponents();
+
+ await game.phaseInterceptor.to(BattleEndPhase);
+
+ const modifier = game.scene.findModifier(m => m instanceof TempCritBoosterModifier) as TempCritBoosterModifier;
+ expect(modifier.getBattlesLeft()).toBe(4);
+
+ // Forced DIRE_HIT to spawn in the first slot with override
+ game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => {
+ const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler;
+ // Traverse to first modifier slot
+ handler.setCursor(0);
+ handler.setRowCursor(ShopCursorTarget.REWARDS);
+ handler.processInput(Button.ACTION);
+ }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), true);
+
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ // Making sure only one booster is in the modifier list even after picking up another
+ let count = 0;
+ for (const m of game.scene.modifiers) {
+ if (m instanceof TempCritBoosterModifier) {
+ count++;
+ expect((m as TempCritBoosterModifier).getBattlesLeft()).toBe(5);
+ }
+ }
+ expect(count).toBe(1);
+ }, 20000);
+});
diff --git a/src/test/items/eviolite.test.ts b/src/test/items/eviolite.test.ts
index e491784acec..83b00583893 100644
--- a/src/test/items/eviolite.test.ts
+++ b/src/test/items/eviolite.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { EvolutionStatBoosterModifier } from "#app/modifier/modifier";
import { modifierTypes } from "#app/modifier/modifier-type";
import i18next from "#app/plugins/i18n";
@@ -37,29 +37,29 @@ describe("Items - Eviolite", () => {
const partyMember = game.scene.getParty()[0];
- // Checking consoe log to make sure Eviolite is applied when getBattleStat (with the appropriate stat) is called
- partyMember.getBattleStat(Stat.DEF);
+ // Checking console log to make sure Eviolite is applied when getEffectiveStat (with the appropriate stat) is called
+ partyMember.getEffectiveStat(Stat.DEF);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
console.log("");
- partyMember.getBattleStat(Stat.SPDEF);
+ partyMember.getEffectiveStat(Stat.SPDEF);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.ATK);
+ partyMember.getEffectiveStat(Stat.ATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPATK);
+ partyMember.getEffectiveStat(Stat.SPATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPD);
+ partyMember.getEffectiveStat(Stat.SPD);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:ModifierType.EVIOLITE.name"), "");
});
diff --git a/src/test/items/leek.test.ts b/src/test/items/leek.test.ts
index 7505b6374a0..af20516ef83 100644
--- a/src/test/items/leek.test.ts
+++ b/src/test/items/leek.test.ts
@@ -1,7 +1,4 @@
-import { BattlerIndex } from "#app/battle";
-import { CritBoosterModifier } from "#app/modifier/modifier";
-import { modifierTypes } from "#app/modifier/modifier-type";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
import * as Utils from "#app/utils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
@@ -26,91 +23,64 @@ describe("Items - Leek", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.enemySpecies(Species.MAGIKARP);
- game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]);
- game.override.disableCrits();
-
- game.override.battleType("single");
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH])
+ .startingHeldItems([{ name: "LEEK" }])
+ .moveset([ Moves.TACKLE ])
+ .disableCrits()
+ .battleType("single");
});
- it("LEEK activates in battle correctly", async () => {
- game.override.startingHeldItems([{ name: "LEEK" }]);
- game.override.moveset([Moves.POUND]);
- const consoleSpy = vi.spyOn(console, "log");
+ it("should raise CRIT stage by 2 when held by FARFETCHD", async () => {
await game.startBattle([
Species.FARFETCHD
]);
- game.move.select(Moves.POUND);
+ const enemyMember = game.scene.getEnemyPokemon()!;
- await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ vi.spyOn(enemyMember, "getCritStage");
- await game.phaseInterceptor.to(MoveEffectPhase);
+ game.move.select(Moves.TACKLE);
- expect(consoleSpy).toHaveBeenCalledWith("Applied", "Leek", "");
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(enemyMember.getCritStage).toHaveReturnedWith(2);
}, 20000);
- it("LEEK held by FARFETCHD", async () => {
- await game.startBattle([
- Species.FARFETCHD
- ]);
-
- const partyMember = game.scene.getPlayerPokemon()!;
-
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
-
- expect(critLevel.value).toBe(0);
-
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
-
- expect(critLevel.value).toBe(2);
- }, 20000);
-
- it("LEEK held by GALAR_FARFETCHD", async () => {
+ it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => {
await game.startBattle([
Species.GALAR_FARFETCHD
]);
- const partyMember = game.scene.getPlayerPokemon()!;
+ const enemyMember = game.scene.getEnemyPokemon()!;
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ vi.spyOn(enemyMember, "getCritStage");
- expect(critLevel.value).toBe(0);
+ game.move.select(Moves.TACKLE);
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ await game.phaseInterceptor.to(TurnEndPhase);
- expect(critLevel.value).toBe(2);
+ expect(enemyMember.getCritStage).toHaveReturnedWith(2);
}, 20000);
- it("LEEK held by SIRFETCHD", async () => {
+ it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => {
await game.startBattle([
Species.SIRFETCHD
]);
- const partyMember = game.scene.getPlayerPokemon()!;
+ const enemyMember = game.scene.getEnemyPokemon()!;
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ vi.spyOn(enemyMember, "getCritStage");
- expect(critLevel.value).toBe(0);
+ game.move.select(Moves.TACKLE);
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ await game.phaseInterceptor.to(TurnEndPhase);
- expect(critLevel.value).toBe(2);
+ expect(enemyMember.getCritStage).toHaveReturnedWith(2);
}, 20000);
- it("LEEK held by fused FARFETCHD line (base)", async () => {
+ it("should raise CRIT stage by 2 when held by FARFETCHD line fused with Pokemon", async () => {
// Randomly choose from the Farfetch'd line
const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD];
@@ -119,9 +89,7 @@ describe("Items - Leek", () => {
Species.PIKACHU,
]);
- const party = game.scene.getParty();
- const partyMember = party[0];
- const ally = party[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -132,20 +100,18 @@ describe("Items - Leek", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ const enemyMember = game.scene.getEnemyPokemon()!;
- expect(critLevel.value).toBe(0);
+ vi.spyOn(enemyMember, "getCritStage");
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ game.move.select(Moves.TACKLE);
- expect(critLevel.value).toBe(2);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(enemyMember.getCritStage).toHaveReturnedWith(2);
}, 20000);
- it("LEEK held by fused FARFETCHD line (part)", async () => {
+ it("should raise CRIT stage by 2 when held by Pokemon fused with FARFETCHD line", async () => {
// Randomly choose from the Farfetch'd line
const species = [Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD];
@@ -154,9 +120,7 @@ describe("Items - Leek", () => {
species[Utils.randInt(species.length)]
]);
- const party = game.scene.getParty();
- const partyMember = party[0];
- const ally = party[1];
+ const [ partyMember, ally ] = game.scene.getParty();
// Fuse party members (taken from PlayerPokemon.fuse(...) function)
partyMember.fusionSpecies = ally.species;
@@ -167,36 +131,31 @@ describe("Items - Leek", () => {
partyMember.fusionGender = ally.gender;
partyMember.fusionLuck = ally.luck;
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
- expect(critLevel.value).toBe(0);
+ const enemyMember = game.scene.getEnemyPokemon()!;
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ vi.spyOn(enemyMember, "getCritStage");
- expect(critLevel.value).toBe(2);
+ game.move.select(Moves.TACKLE);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(enemyMember.getCritStage).toHaveReturnedWith(2);
}, 20000);
- it("LEEK not held by FARFETCHD line", async () => {
+ it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => {
await game.startBattle([
Species.PIKACHU
]);
- const partyMember = game.scene.getPlayerPokemon()!;
+ const enemyMember = game.scene.getEnemyPokemon()!;
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ vi.spyOn(enemyMember, "getCritStage");
- expect(critLevel.value).toBe(0);
+ game.move.select(Moves.TACKLE);
- // Giving Leek to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.LEEK().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
+ await game.phaseInterceptor.to(TurnEndPhase);
- expect(critLevel.value).toBe(0);
+ expect(enemyMember.getCritStage).toHaveReturnedWith(0);
}, 20000);
});
diff --git a/src/test/items/light_ball.test.ts b/src/test/items/light_ball.test.ts
index cf4f5c9e22f..673348e7b7a 100644
--- a/src/test/items/light_ball.test.ts
+++ b/src/test/items/light_ball.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { SpeciesStatBoosterModifier } from "#app/modifier/modifier";
import { modifierTypes } from "#app/modifier/modifier-type";
import i18next from "#app/plugins/i18n";
@@ -37,29 +37,29 @@ describe("Items - Light Ball", () => {
const partyMember = game.scene.getParty()[0];
- // Checking consoe log to make sure Light Ball is applied when getBattleStat (with the appropriate stat) is called
- partyMember.getBattleStat(Stat.DEF);
+ // Checking console log to make sure Light Ball is applied when getEffectiveStat (with the appropriate stat) is called
+ partyMember.getEffectiveStat(Stat.DEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), "");
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
console.log("");
- partyMember.getBattleStat(Stat.SPDEF);
+ partyMember.getEffectiveStat(Stat.SPDEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.ATK);
+ partyMember.getEffectiveStat(Stat.ATK);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPATK);
+ partyMember.getEffectiveStat(Stat.SPATK);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPD);
+ partyMember.getEffectiveStat(Stat.SPD);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.LIGHT_BALL.name"), "");
});
diff --git a/src/test/items/metal_powder.test.ts b/src/test/items/metal_powder.test.ts
index a3a4936532f..0206fd1f471 100644
--- a/src/test/items/metal_powder.test.ts
+++ b/src/test/items/metal_powder.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { SpeciesStatBoosterModifier } from "#app/modifier/modifier";
import { modifierTypes } from "#app/modifier/modifier-type";
import i18next from "#app/plugins/i18n";
@@ -37,29 +37,29 @@ describe("Items - Metal Powder", () => {
const partyMember = game.scene.getParty()[0];
- // Checking consoe log to make sure Metal Powder is applied when getBattleStat (with the appropriate stat) is called
- partyMember.getBattleStat(Stat.DEF);
+ // Checking console log to make sure Metal Powder is applied when getEffectiveStat (with the appropriate stat) is called
+ partyMember.getEffectiveStat(Stat.DEF);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), "");
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
console.log("");
- partyMember.getBattleStat(Stat.SPDEF);
+ partyMember.getEffectiveStat(Stat.SPDEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.ATK);
+ partyMember.getEffectiveStat(Stat.ATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPATK);
+ partyMember.getEffectiveStat(Stat.SPATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPD);
+ partyMember.getEffectiveStat(Stat.SPD);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.METAL_POWDER.name"), "");
});
diff --git a/src/test/items/quick_powder.test.ts b/src/test/items/quick_powder.test.ts
index 53521ba78f1..344b772feb4 100644
--- a/src/test/items/quick_powder.test.ts
+++ b/src/test/items/quick_powder.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { SpeciesStatBoosterModifier } from "#app/modifier/modifier";
import { modifierTypes } from "#app/modifier/modifier-type";
import i18next from "#app/plugins/i18n";
@@ -37,29 +37,29 @@ describe("Items - Quick Powder", () => {
const partyMember = game.scene.getParty()[0];
- // Checking consoe log to make sure Quick Powder is applied when getBattleStat (with the appropriate stat) is called
- partyMember.getBattleStat(Stat.DEF);
+ // Checking console log to make sure Quick Powder is applied when getEffectiveStat (with the appropriate stat) is called
+ partyMember.getEffectiveStat(Stat.DEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), "");
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
console.log("");
- partyMember.getBattleStat(Stat.SPDEF);
+ partyMember.getEffectiveStat(Stat.SPDEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.ATK);
+ partyMember.getEffectiveStat(Stat.ATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPATK);
+ partyMember.getEffectiveStat(Stat.SPATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPD);
+ partyMember.getEffectiveStat(Stat.SPD);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.QUICK_POWDER.name"), "");
});
diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts
index 85673218762..c8629093ab5 100644
--- a/src/test/items/scope_lens.test.ts
+++ b/src/test/items/scope_lens.test.ts
@@ -1,13 +1,10 @@
-import { BattlerIndex } from "#app/battle";
-import { CritBoosterModifier } from "#app/modifier/modifier";
-import { modifierTypes } from "#app/modifier/modifier-type";
-import { MoveEffectPhase } from "#app/phases/move-effect-phase";
-import * as Utils from "#app/utils";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import GameManager from "#test/utils/gameManager";
import Phase from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
describe("Items - Scope Lens", () => {
let phaserGame: Phaser.Game;
@@ -26,47 +23,29 @@ describe("Items - Scope Lens", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.override.enemySpecies(Species.MAGIKARP);
- game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]);
- game.override.disableCrits();
+ game.override
+ .enemySpecies(Species.MAGIKARP)
+ .enemyMoveset(SPLASH_ONLY)
+ .moveset([ Moves.POUND ])
+ .startingHeldItems([{ name: "SCOPE_LENS" }])
+ .battleType("single")
+ .disableCrits();
- game.override.battleType("single");
}, 20000);
- it("SCOPE_LENS activates in battle correctly", async () => {
- game.override.startingHeldItems([{ name: "SCOPE_LENS" }]);
- game.override.moveset([Moves.POUND]);
- const consoleSpy = vi.spyOn(console, "log");
+ it("should raise CRIT stage by 1", async () => {
await game.startBattle([
Species.GASTLY
]);
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ vi.spyOn(enemyPokemon, "getCritStage");
+
game.move.select(Moves.POUND);
- await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to(TurnEndPhase);
- await game.phaseInterceptor.to(MoveEffectPhase);
-
- expect(consoleSpy).toHaveBeenCalledWith("Applied", "Scope Lens", "");
- }, 20000);
-
- it("SCOPE_LENS held by random pokemon", async () => {
- await game.startBattle([
- Species.GASTLY
- ]);
-
- const partyMember = game.scene.getPlayerPokemon()!;
-
- // Making sure modifier is not applied without holding item
- const critLevel = new Utils.IntegerHolder(0);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
-
- expect(critLevel.value).toBe(0);
-
- // Giving Scope Lens to party member and testing if it applies
- partyMember.scene.addModifier(modifierTypes.SCOPE_LENS().newModifier(partyMember), true);
- partyMember.scene.applyModifiers(CritBoosterModifier, true, partyMember, critLevel);
-
- expect(critLevel.value).toBe(1);
+ expect(enemyPokemon.getCritStage).toHaveReturnedWith(1);
}, 20000);
});
diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/src/test/items/temp_stat_stage_booster.test.ts
new file mode 100644
index 00000000000..c81703220db
--- /dev/null
+++ b/src/test/items/temp_stat_stage_booster.test.ts
@@ -0,0 +1,175 @@
+import { BATTLE_STATS, Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
+import { Species } from "#enums/species";
+import Phase from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { Moves } from "#app/enums/moves";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { SPLASH_ONLY } from "../utils/testUtils";
+import { Abilities } from "#app/enums/abilities";
+import { TempStatStageBoosterModifier } from "#app/modifier/modifier";
+import { Mode } from "#app/ui/ui";
+import { Button } from "#app/enums/buttons";
+import { CommandPhase } from "#app/phases/command-phase";
+import { NewBattlePhase } from "#app/phases/new-battle-phase";
+import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { BattleEndPhase } from "#app/phases/battle-end-phase";
+import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
+import { ShopCursorTarget } from "#app/enums/shop-cursor-target";
+
+
+describe("Items - Temporary Stat Stage Boosters", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ beforeAll(() => {
+ phaserGame = new Phase.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.SHUCKLE)
+ .enemyMoveset(SPLASH_ONLY)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM ])
+ .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]);
+ });
+
+ it("should provide a x1.3 stat stage multiplier", async() => {
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ const partyMember = game.scene.getPlayerPokemon()!;
+
+ vi.spyOn(partyMember, "getStatStageMultiplier");
+
+ game.move.select(Moves.TACKLE);
+
+ await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnEndPhase);
+
+ expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.3);
+ }, 20000);
+
+ it("should increase existing ACC stat stage by 1 for X_ACCURACY only", async() => {
+ game.override
+ .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }])
+ .ability(Abilities.SIMPLE);
+
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ const partyMember = game.scene.getPlayerPokemon()!;
+
+ vi.spyOn(partyMember, "getAccuracyMultiplier");
+
+ // Raise ACC by +2 stat stages
+ game.move.select(Moves.HONE_CLAWS);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ game.move.select(Moves.TACKLE);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ // ACC at +3 stat stages yields a x2 multiplier
+ expect(partyMember.getAccuracyMultiplier).toHaveReturnedWith(2);
+ }, 20000);
+
+
+ it("should increase existing stat stage multiplier by 3/10 for the rest of the boosters", async() => {
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ const partyMember = game.scene.getPlayerPokemon()!;
+
+ vi.spyOn(partyMember, "getStatStageMultiplier");
+
+ // Raise ATK by +1 stat stage
+ game.move.select(Moves.HONE_CLAWS);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ game.move.select(Moves.TACKLE);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ // ATK at +1 stat stage yields a x1.5 multiplier, add 0.3 from X_ATTACK
+ expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(1.8);
+ }, 20000);
+
+ it("should not increase past maximum stat stage multiplier", async() => {
+ game.override.startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }, { name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]);
+
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ const partyMember = game.scene.getPlayerPokemon()!;
+
+ vi.spyOn(partyMember, "getStatStageMultiplier");
+ vi.spyOn(partyMember, "getAccuracyMultiplier");
+
+ // Set all stat stages to 6
+ vi.spyOn(partyMember.summonData, "statStages", "get").mockReturnValue(new Array(BATTLE_STATS.length).fill(6));
+
+ game.move.select(Moves.TACKLE);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(partyMember.getAccuracyMultiplier).toHaveReturnedWith(3);
+ expect(partyMember.getStatStageMultiplier).toHaveReturnedWith(4);
+ }, 20000);
+
+ it("should renew how many battles are left of existing booster when picking up new booster of same type", async() => {
+ game.override
+ .startingLevel(200)
+ .itemRewards([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]);
+
+ await game.startBattle([
+ Species.PIKACHU
+ ]);
+
+ game.move.select(Moves.SPLASH);
+
+ await game.doKillOpponents();
+
+ await game.phaseInterceptor.to(BattleEndPhase);
+
+ const modifier = game.scene.findModifier(m => m instanceof TempStatStageBoosterModifier) as TempStatStageBoosterModifier;
+ expect(modifier.getBattlesLeft()).toBe(4);
+
+ // Forced X_ATTACK to spawn in the first slot with override
+ game.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => {
+ const handler = game.scene.ui.getHandler() as ModifierSelectUiHandler;
+ // Traverse to first modifier slot
+ handler.setCursor(0);
+ handler.setRowCursor(ShopCursorTarget.REWARDS);
+ handler.processInput(Button.ACTION);
+ }, () => game.isCurrentPhase(CommandPhase) || game.isCurrentPhase(NewBattlePhase), true);
+
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ // Making sure only one booster is in the modifier list even after picking up another
+ let count = 0;
+ for (const m of game.scene.modifiers) {
+ if (m instanceof TempStatStageBoosterModifier) {
+ count++;
+ expect((m as TempStatStageBoosterModifier).getBattlesLeft()).toBe(5);
+ }
+ }
+ expect(count).toBe(1);
+ }, 20000);
+});
diff --git a/src/test/items/thick_club.test.ts b/src/test/items/thick_club.test.ts
index 347921446e6..bcb6b371264 100644
--- a/src/test/items/thick_club.test.ts
+++ b/src/test/items/thick_club.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { SpeciesStatBoosterModifier } from "#app/modifier/modifier";
import { modifierTypes } from "#app/modifier/modifier-type";
import i18next from "#app/plugins/i18n";
@@ -37,29 +37,29 @@ describe("Items - Thick Club", () => {
const partyMember = game.scene.getParty()[0];
- // Checking consoe log to make sure Thick Club is applied when getBattleStat (with the appropriate stat) is called
- partyMember.getBattleStat(Stat.DEF);
+ // Checking console log to make sure Thick Club is applied when getEffectiveStat (with the appropriate stat) is called
+ partyMember.getEffectiveStat(Stat.DEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), "");
// Printing dummy console messages along the way so subsequent checks don't pass because of the first
console.log("");
- partyMember.getBattleStat(Stat.SPDEF);
+ partyMember.getEffectiveStat(Stat.SPDEF);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.ATK);
+ partyMember.getEffectiveStat(Stat.ATK);
expect(consoleSpy).toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPATK);
+ partyMember.getEffectiveStat(Stat.SPATK);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), "");
console.log("");
- partyMember.getBattleStat(Stat.SPD);
+ partyMember.getEffectiveStat(Stat.SPD);
expect(consoleSpy).not.toHaveBeenLastCalledWith("Applied", i18next.t("modifierType:SpeciesBoosterItem.THICK_CLUB.name"), "");
});
diff --git a/src/test/localization/battle-stat.test.ts b/src/test/localization/battle-stat.test.ts
deleted file mode 100644
index b5ba698c4b6..00000000000
--- a/src/test/localization/battle-stat.test.ts
+++ /dev/null
@@ -1,217 +0,0 @@
-import { BattleStat, getBattleStatLevelChangeDescription, getBattleStatName } from "#app/data/battle-stat";
-import deBattleStat from "#app/locales/de/battle.json";
-import dePokemonInfo from "#app/locales/de/pokemon-info.json";
-import enBattleStat from "#app/locales/en/battle.json";
-import enPokemonInfo from "#app/locales/en/pokemon-info.json";
-import esBattleStat from "#app/locales/es/battle.json";
-import esPokemonInfo from "#app/locales/es/pokemon-info.json";
-import frBattleStat from "#app/locales/fr/battle.json";
-import frPokemonInfo from "#app/locales/fr/pokemon-info.json";
-import itBattleStat from "#app/locales/it/battle.json";
-import itPokemonInfo from "#app/locales/it/pokemon-info.json";
-import koBattleStat from "#app/locales/ko/battle.json";
-import koPokemonInfo from "#app/locales/ko/pokemon-info.json";
-import ptBrBattleStat from "#app/locales/pt_BR/battle.json";
-import ptBrPokemonInfo from "#app/locales/pt_BR/pokemon-info.json";
-import zhCnBattleStat from "#app/locales/zh_CN/battle.json";
-import zhCnPokemonInfo from "#app/locales/zh_CN/pokemon-info.json";
-import zhTwBattleStat from "#app/locales/zh_TW/battle.json";
-import zhTwPokemonInfo from "#app/locales/zh_TW/pokemon-info.json";
-import i18next, { initI18n } from "#app/plugins/i18n";
-import { KoreanPostpositionProcessor } from "i18next-korean-postposition-processor";
-import { beforeAll, describe, expect, it } from "vitest";
-
-interface BattleStatTestUnit {
- stat: BattleStat,
- key: string
-}
-
-interface BattleStatLevelTestUnit {
- levels: integer,
- up: boolean,
- key: string
- changedStats: integer
-}
-
-function testBattleStatName(stat: BattleStat, expectMessage: string) {
- if (!expectMessage) {
- return;
- } // not translated yet!
- const message = getBattleStatName(stat);
- console.log(`message ${message}, expected ${expectMessage}`);
- expect(message).toBe(expectMessage);
-}
-
-function testBattleStatLevelChangeDescription(levels: integer, up: boolean, expectMessage: string, changedStats: integer) {
- if (!expectMessage) {
- return;
- } // not translated yet!
- const message = getBattleStatLevelChangeDescription("{{pokemonNameWithAffix}}", "{{stats}}", levels, up, changedStats);
- console.log(`message ${message}, expected ${expectMessage}`);
- expect(message).toBe(expectMessage);
-}
-
-describe("Test for BattleStat Localization", () => {
- const battleStatUnits: BattleStatTestUnit[] = [];
- const battleStatLevelUnits: BattleStatLevelTestUnit[] = [];
-
- beforeAll(() => {
- initI18n();
-
- battleStatUnits.push({stat: BattleStat.ATK, key: "Stat.ATK"});
- battleStatUnits.push({stat: BattleStat.DEF, key: "Stat.DEF"});
- battleStatUnits.push({stat: BattleStat.SPATK, key: "Stat.SPATK"});
- battleStatUnits.push({stat: BattleStat.SPDEF, key: "Stat.SPDEF"});
- battleStatUnits.push({stat: BattleStat.SPD, key: "Stat.SPD"});
- battleStatUnits.push({stat: BattleStat.ACC, key: "Stat.ACC"});
- battleStatUnits.push({stat: BattleStat.EVA, key: "Stat.EVA"});
-
- battleStatLevelUnits.push({levels: 1, up: true, key: "statRose_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 2, up: true, key: "statSharplyRose_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 3, up: true, key: "statRoseDrastically_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 4, up: true, key: "statRoseDrastically_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 5, up: true, key: "statRoseDrastically_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 6, up: true, key: "statRoseDrastically_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 7, up: true, key: "statWontGoAnyHigher_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 1, up: false, key: "statFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 2, up: false, key: "statHarshlyFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 3, up: false, key: "statSeverelyFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 4, up: false, key: "statSeverelyFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 5, up: false, key: "statSeverelyFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 6, up: false, key: "statSeverelyFell_one", changedStats: 1});
- battleStatLevelUnits.push({levels: 7, up: false, key: "statWontGoAnyLower_one", changedStats: 1});
- });
-
- it("Test getBattleStatName() in English", async () => {
- i18next.changeLanguage("en");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, enPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in English", async () => {
- i18next.changeLanguage("en");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, enBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in Español", async () => {
- i18next.changeLanguage("es");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, esPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in Español", async () => {
- i18next.changeLanguage("es");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, esBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in Italiano", async () => {
- i18next.changeLanguage("it");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, itPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in Italiano", async () => {
- i18next.changeLanguage("it");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, itBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in Français", async () => {
- i18next.changeLanguage("fr");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, frPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in Français", async () => {
- i18next.changeLanguage("fr");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, frBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in Deutsch", async () => {
- i18next.changeLanguage("de");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, dePokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in Deutsch", async () => {
- i18next.changeLanguage("de");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, deBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in Português (BR)", async () => {
- i18next.changeLanguage("pt-BR");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, ptBrPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in Português (BR)", async () => {
- i18next.changeLanguage("pt-BR");
- battleStatLevelUnits.forEach(unit => {
- testBattleStatLevelChangeDescription(unit.levels, unit.up, ptBrBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in 简体中文", async () => {
- i18next.changeLanguage("zh-CN");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, zhCnPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in 简体中文", async () => {
- i18next.changeLanguage("zh-CN");
- battleStatLevelUnits.forEach(unit => {
- // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix.
- unit.key = unit.key.replace("one", "other");
- testBattleStatLevelChangeDescription(unit.levels, unit.up, zhCnBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in 繁體中文", async () => {
- i18next.changeLanguage("zh-TW");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, zhTwPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in 繁體中文", async () => {
- i18next.changeLanguage("zh-TW");
- battleStatLevelUnits.forEach(unit => {
- // In i18next, the pluralization rules are language-specific, and Chinese only supports the _other suffix.
- unit.key = unit.key.replace("one", "other");
- testBattleStatLevelChangeDescription(unit.levels, unit.up, zhTwBattleStat[unit.key], unit.changedStats);
- });
- });
-
- it("Test getBattleStatName() in 한국어", async () => {
- await i18next.changeLanguage("ko");
- battleStatUnits.forEach(unit => {
- testBattleStatName(unit.stat, koPokemonInfo[unit.key.split(".")[0]][unit.key.split(".")[1]]);
- });
- });
-
- it("Test getBattleStatLevelChangeDescription() in 한국어", async () => {
- i18next.changeLanguage("ko", () => {
- battleStatLevelUnits.forEach(unit => {
- const processor = new KoreanPostpositionProcessor();
- const message = processor.process(koBattleStat[unit.key]);
- testBattleStatLevelChangeDescription(unit.levels, unit.up, message, unit.changedStats);
- });
- });
- });
-});
diff --git a/src/test/utils/misc.test.ts b/src/test/misc.test.ts
similarity index 90%
rename from src/test/utils/misc.test.ts
rename to src/test/misc.test.ts
index d7c10144ead..1052a282a64 100644
--- a/src/test/utils/misc.test.ts
+++ b/src/test/misc.test.ts
@@ -30,7 +30,7 @@ describe("Test misc", () => {
return response.json();
}).then(data => {
spy(); // Call the spy function
- expect(data).toEqual({"username":"greenlamp", "lastSessionSlot":0});
+ expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 });
});
expect(spy).toHaveBeenCalled();
});
@@ -43,7 +43,7 @@ describe("Test misc", () => {
return response.json();
}).then(data => {
spy(); // Call the spy function
- expect(data).toEqual({"username":"greenlamp", "lastSessionSlot":0});
+ expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 });
});
expect(spy).toHaveBeenCalled();
});
@@ -54,7 +54,7 @@ describe("Test misc", () => {
expect(response.ok).toBe(true);
expect(response.status).toBe(200);
- expect(data).toEqual({"username":"greenlamp", "lastSessionSlot":0});
+ expect(data).toEqual({ "username": "greenlamp", "lastSessionSlot": 0 });
});
it("test apifetch mock sync", async () => {
diff --git a/src/test/moves/alluring_voice.test.ts b/src/test/moves/alluring_voice.test.ts
new file mode 100644
index 00000000000..9807d1bce85
--- /dev/null
+++ b/src/test/moves/alluring_voice.test.ts
@@ -0,0 +1,54 @@
+import { BattlerIndex } from "#app/battle";
+import { Abilities } from "#app/enums/abilities";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { BerryPhase } from "#app/phases/berry-phase";
+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";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Moves - Alluring Voice", () => {
+ 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()
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.ICE_SCALES)
+ .enemyMoveset(Array(4).fill(Moves.HOWL))
+ .startingLevel(10)
+ .enemyLevel(10)
+ .starterSpecies(Species.FEEBAS)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.ALLURING_VOICE]);
+
+ });
+
+ it("should confuse the opponent if their stat stages were raised", async () => {
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.ALLURING_VOICE);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to(BerryPhase);
+
+ expect(enemy.getTag(BattlerTagType.CONFUSED)?.tagType).toBe("CONFUSED");
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/baton_pass.test.ts b/src/test/moves/baton_pass.test.ts
index 602da9e37f8..1a4edafdd36 100644
--- a/src/test/moves/baton_pass.test.ts
+++ b/src/test/moves/baton_pass.test.ts
@@ -1,13 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { PostSummonPhase } from "#app/phases/post-summon-phase";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { BattlerIndex } from "#app/battle";
import GameManager from "#app/test/utils/gameManager";
+import { Abilities } from "#enums/abilities";
+import { BattlerTagType } from "#enums/battler-tag-type";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
-import { SPLASH_ONLY } from "../utils/testUtils";
-
describe("Moves - Baton Pass", () => {
let phaserGame: Phaser.Game;
@@ -27,35 +27,35 @@ describe("Moves - Baton Pass", () => {
game = new GameManager(phaserGame);
game.override
.battleType("single")
- .enemySpecies(Species.DUGTRIO)
- .startingLevel(1)
- .startingWave(97)
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.BALL_FETCH)
.moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH])
+ .ability(Abilities.BALL_FETCH)
.enemyMoveset(SPLASH_ONLY)
.disableCrits();
});
- it("passes stat stage buffs when player uses it", async () => {
+ it("transfers all stat stages when player uses it", async() => {
// arrange
- await game.startBattle([
- Species.RAICHU,
- Species.SHUCKLE
- ]);
+ await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]);
// round 1 - buff
game.move.select(Moves.NASTY_PLOT);
await game.toNextTurn();
- expect(game.scene.getPlayerPokemon()!.summonData.battleStats[BattleStat.SPATK]).toEqual(2);
+
+ let playerPokemon = game.scene.getPlayerPokemon()!;
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toEqual(2);
// round 2 - baton pass
game.move.select(Moves.BATON_PASS);
game.doSelectPartyPokemon(1);
- await game.phaseInterceptor.to(TurnEndPhase);
+ await game.phaseInterceptor.to("TurnEndPhase");
// assert
- const playerPkm = game.scene.getPlayerPokemon()!;
- expect(playerPkm.species.speciesId).toEqual(Species.SHUCKLE);
- expect(playerPkm.summonData.battleStats[BattleStat.SPATK]).toEqual(2);
+ playerPokemon = game.scene.getPlayerPokemon()!;
+ expect(playerPokemon.species.speciesId).toEqual(Species.SHUCKLE);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toEqual(2);
}, 20000);
it("passes stat stage buffs when AI uses it", async () => {
@@ -63,10 +63,7 @@ describe("Moves - Baton Pass", () => {
game.override
.startingWave(5)
.enemyMoveset(new Array(4).fill([Moves.NASTY_PLOT]));
- await game.startBattle([
- Species.RAICHU,
- Species.SHUCKLE
- ]);
+ await game.classicMode.startBattle([Species.RAICHU, Species.SHUCKLE]);
// round 1 - ai buffs
game.move.select(Moves.SPLASH);
@@ -76,11 +73,11 @@ describe("Moves - Baton Pass", () => {
game.scene.getEnemyPokemon()!.hp = 100;
game.override.enemyMoveset(new Array(4).fill(Moves.BATON_PASS));
game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(PostSummonPhase, false);
+ await game.phaseInterceptor.to("PostSummonPhase", false);
// assert
// check buffs are still there
- expect(game.scene.getEnemyPokemon()!.summonData.battleStats[BattleStat.SPATK]).toEqual(2);
+ expect(game.scene.getEnemyPokemon()!.getStatStage(Stat.SPATK)).toEqual(2);
// confirm that a switch actually happened. can't use species because I
// can't find a way to override trainer parties with more than 1 pokemon species
expect(game.scene.getEnemyPokemon()!.hp).not.toEqual(100);
@@ -91,4 +88,20 @@ describe("Moves - Baton Pass", () => {
"PostSummonPhase"
]);
}, 20000);
+
+ it("doesn't transfer effects that aren't transferrable", async() => {
+ game.override.enemyMoveset(Array(4).fill(Moves.SALT_CURE));
+ await game.classicMode.startBattle([Species.PIKACHU, Species.FEEBAS]);
+
+ const [player1, player2] = game.scene.getParty();
+
+ game.move.select(Moves.BATON_PASS);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("MoveEndPhase");
+ expect(player1.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeTruthy();
+ game.doSelectPartyPokemon(1);
+ await game.toNextTurn();
+
+ expect(player2.findTag((t) => t.tagType === BattlerTagType.SALT_CURED)).toBeUndefined();
+ }, 20000);
});
diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts
index e4956c6e83a..7024deb3f18 100644
--- a/src/test/moves/belly_drum.test.ts
+++ b/src/test/moves/belly_drum.test.ts
@@ -1,8 +1,8 @@
-import { BattleStat } from "#app/data/battle-stat";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { toDmgValue } from "#app/utils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
@@ -43,8 +43,8 @@ describe("Moves - BELLY DRUM", () => {
// Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Belly_Drum_(move)
- test("Belly Drum raises the user's Attack to its max, at the cost of 1/2 of its maximum HP",
- async () => {
+ test("raises the user's ATK stat stage to its max, at the cost of 1/2 of its maximum HP",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
@@ -54,48 +54,48 @@ describe("Moves - BELLY DRUM", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
}, TIMEOUT
);
- test("Belly Drum will still take effect if an uninvolved stat is at max",
- async () => {
+ test("will still take effect if an uninvolved stat stage is at max",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO);
- // Here - BattleStat.ATK -> -3 and BattleStat.SPATK -> 6
- leadPokemon.summonData.battleStats[BattleStat.ATK] = -3;
- leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
+ // Here - Stat.ATK -> -3 and Stat.SPATK -> 6
+ leadPokemon.setStatStage(Stat.ATK, -3);
+ leadPokemon.setStatStage(Stat.SPATK, 6);
game.move.select(Moves.BELLY_DRUM);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6);
}, TIMEOUT
);
- test("Belly Drum fails if the pokemon's attack stat is at its maximum",
- async () => {
+ test("fails if the pokemon's ATK stat stage is at its maximum",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
+ leadPokemon.setStatStage(Stat.ATK, 6);
game.move.select(Moves.BELLY_DRUM);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
}, TIMEOUT
);
- test("Belly Drum fails if the user's health is less than 1/2",
- async () => {
+ test("fails if the user's health is less than 1/2",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
@@ -106,7 +106,7 @@ describe("Moves - BELLY DRUM", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0);
}, TIMEOUT
);
});
diff --git a/src/test/moves/burning_jealousy.test.ts b/src/test/moves/burning_jealousy.test.ts
new file mode 100644
index 00000000000..2cb6a0bc52a
--- /dev/null
+++ b/src/test/moves/burning_jealousy.test.ts
@@ -0,0 +1,103 @@
+import { BattlerIndex } from "#app/battle";
+import { allMoves } from "#app/data/move";
+import { Abilities } from "#app/enums/abilities";
+import { StatusEffect } from "#app/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, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Moves - Burning Jealousy", () => {
+ 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()
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.ICE_SCALES)
+ .enemyMoveset(Array(4).fill(Moves.HOWL))
+ .startingLevel(10)
+ .enemyLevel(10)
+ .starterSpecies(Species.FEEBAS)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.BURNING_JEALOUSY, Moves.GROWL]);
+
+ });
+
+ it("should burn the opponent if their stat stages were raised", async () => {
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.BURNING_JEALOUSY);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(enemy.status?.effect).toBe(StatusEffect.BURN);
+ }, TIMEOUT);
+
+ it("should still burn the opponent if their stat stages were both raised and lowered in the same turn", async () => {
+ game.override
+ .starterSpecies(0)
+ .battleType("double");
+ await game.classicMode.startBattle([Species.FEEBAS, Species.ABRA]);
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.BURNING_JEALOUSY);
+ game.move.select(Moves.GROWL, 1);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER_2, BattlerIndex.PLAYER, BattlerIndex.ENEMY_2]);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(enemy.status?.effect).toBe(StatusEffect.BURN);
+ }, TIMEOUT);
+
+ it("should ignore stat stages raised by IMPOSTER", async () => {
+ game.override
+ .enemySpecies(Species.DITTO)
+ .enemyAbility(Abilities.IMPOSTER)
+ .enemyMoveset(SPLASH_ONLY);
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.BURNING_JEALOUSY);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(enemy.status?.effect).toBeUndefined();
+ }, TIMEOUT);
+
+ it.skip("should ignore weakness policy", async () => { // TODO: Make this test if WP is implemented
+ await game.classicMode.startBattle();
+ }, TIMEOUT);
+
+ it("should be boosted by Sheer Force even if opponent didn't raise stat stages", async () => {
+ game.override
+ .ability(Abilities.SHEER_FORCE)
+ .enemyMoveset(SPLASH_ONLY);
+ vi.spyOn(allMoves[Moves.BURNING_JEALOUSY], "calculateBattlePower");
+ await game.classicMode.startBattle();
+
+ game.move.select(Moves.BURNING_JEALOUSY);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(allMoves[Moves.BURNING_JEALOUSY].calculateBattlePower).toHaveReturnedWith(allMoves[Moves.BURNING_JEALOUSY].power * 5461 / 4096);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/ceaseless_edge.test.ts b/src/test/moves/ceaseless_edge.test.ts
index 34ecf8f39f6..8511b3179c6 100644
--- a/src/test/moves/ceaseless_edge.test.ts
+++ b/src/test/moves/ceaseless_edge.test.ts
@@ -110,7 +110,7 @@ describe("Moves - Ceaseless Edge", () => {
const hpBeforeSpikes = game.scene.currentBattle.enemyParty[1].hp;
// Check HP of pokemon that WILL BE switched in (index 1)
- game.forceOpponentToSwitch();
+ game.forceEnemyToSwitch();
game.move.select(Moves.SPLASH);
await game.phaseInterceptor.to(TurnEndPhase, false);
expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(hpBeforeSpikes);
diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts
index 9ea6da91595..9bd3bc2379e 100644
--- a/src/test/moves/clangorous_soul.test.ts
+++ b/src/test/moves/clangorous_soul.test.ts
@@ -1,12 +1,11 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#test/utils/gameManager";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
-import { toDmgValue } from "#app/utils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
+import { Stat } from "#enums/stat";
import { SPLASH_ONLY } from "#test/utils/testUtils";
-import Phaser from "phaser";
-import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
const TIMEOUT = 20 * 1000;
/** HP Cost of Move */
@@ -14,7 +13,7 @@ const RATIO = 3;
/** Amount of extra HP lost */
const PREDAMAGE = 15;
-describe("Moves - CLANGOROUS_SOUL", () => {
+describe("Moves - Clangorous Soul", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
@@ -40,91 +39,91 @@ describe("Moves - CLANGOROUS_SOUL", () => {
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move)
- test("Clangorous Soul raises the user's Attack, Defense, Special Attack, Special Defense and Speed by one stage each, at the cost of 1/3 of its maximum HP",
- async () => {
+ it("raises the user's ATK, DEF, SPATK, SPDEF, and SPD stat stages by 1 each at the cost of 1/3 of its maximum HP",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO);
+ const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
game.move.select(Moves.CLANGOROUS_SOUL);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(1);
- expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(1);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.DEF)).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1);
}, TIMEOUT
);
- test("Clangorous Soul will still take effect if one or more of the involved stats are not at max",
- async () => {
+ it("will still take effect if one or more of the involved stat stages are not at max",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO);
+ const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
- //Here - BattleStat.SPD -> 0 and BattleStat.SPDEF -> 4
- leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.DEF] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 4;
+ //Here - Stat.SPD -> 0 and Stat.SPDEF -> 4
+ leadPokemon.setStatStage(Stat.ATK, 6);
+ leadPokemon.setStatStage(Stat.DEF, 6);
+ leadPokemon.setStatStage(Stat.SPATK, 6);
+ leadPokemon.setStatStage(Stat.SPDEF, 4);
game.move.select(Moves.CLANGOROUS_SOUL);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(5);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(1);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(5);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(1);
}, TIMEOUT
);
- test("Clangorous Soul fails if all stats involved are at max",
- async () => {
+ it("fails if all stat stages involved are at max",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.DEF] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPDEF] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPD] = 6;
+ leadPokemon.setStatStage(Stat.ATK, 6);
+ leadPokemon.setStatStage(Stat.DEF, 6);
+ leadPokemon.setStatStage(Stat.SPATK, 6);
+ leadPokemon.setStatStage(Stat.SPDEF, 6);
+ leadPokemon.setStatStage(Stat.SPD, 6);
game.move.select(Moves.CLANGOROUS_SOUL);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.DEF)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6);
}, TIMEOUT
);
- test("Clangorous Soul fails if the user's health is less than 1/3",
- async () => {
+ it("fails if the user's health is less than 1/3",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO);
+ const hpLost = Math.floor(leadPokemon.getMaxHp() / RATIO);
leadPokemon.hp = hpLost - PREDAMAGE;
game.move.select(Moves.CLANGOROUS_SOUL);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.SPDEF)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0);
}, TIMEOUT
);
});
diff --git a/src/test/moves/crafty_shield.test.ts b/src/test/moves/crafty_shield.test.ts
index a341a50b0b9..e73a1fd256d 100644
--- a/src/test/moves/crafty_shield.test.ts
+++ b/src/test/moves/crafty_shield.test.ts
@@ -1,13 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { BattlerTagType } from "#app/enums/battler-tag-type";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { CommandPhase } from "#app/phases/command-phase";
-import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
-import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
import GameManager from "../utils/gameManager";
+import { Species } from "#enums/species";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { BattlerTagType } from "#app/enums/battler-tag-type";
+import { BerryPhase } from "#app/phases/berry-phase";
+import { CommandPhase } from "#app/phases/command-phase";
const TIMEOUT = 20 * 1000;
@@ -55,7 +55,7 @@ describe("Moves - Crafty Shield", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- leadPokemon.forEach(p => expect(p.summonData.battleStats[BattleStat.ATK]).toBe(0));
+ leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0));
}, TIMEOUT
);
@@ -117,8 +117,8 @@ describe("Moves - Crafty Shield", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- expect(leadPokemon[0].summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(leadPokemon[1].summonData.battleStats[BattleStat.ATK]).toBe(2);
+ expect(leadPokemon[0].getStatStage(Stat.ATK)).toBe(0);
+ expect(leadPokemon[1].getStatStage(Stat.ATK)).toBe(2);
}
);
});
diff --git a/src/test/moves/double_team.test.ts b/src/test/moves/double_team.test.ts
index c45c8bd8516..fa224c8df9e 100644
--- a/src/test/moves/double_team.test.ts
+++ b/src/test/moves/double_team.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { Abilities } from "#app/enums/abilities";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
@@ -32,20 +32,20 @@ describe("Moves - Double Team", () => {
game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
});
- it("increases the user's evasion by one stage.", async () => {
+ it("raises the user's EVA stat stage by 1", async () => {
await game.startBattle([Species.MAGIKARP]);
const ally = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
vi.spyOn(enemy, "getAccuracyMultiplier");
- expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(0);
+ expect(ally.getStatStage(Stat.EVA)).toBe(0);
game.move.select(Moves.DOUBLE_TEAM);
await game.phaseInterceptor.to(TurnEndPhase);
await game.toNextTurn();
- expect(ally.summonData.battleStats[BattleStat.EVA]).toBe(1);
+ expect(ally.getStatStage(Stat.EVA)).toBe(1);
expect(enemy.getAccuracyMultiplier).toHaveReturnedWith(.75);
});
});
diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts
index 223635575ab..5da6e082ce5 100644
--- a/src/test/moves/dragon_rage.test.ts
+++ b/src/test/moves/dragon_rage.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { Type } from "#app/data/type";
import { Species } from "#app/enums/species";
import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon";
@@ -63,9 +63,8 @@ describe("Moves - Dragon Rage", () => {
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
it("ignores resistances", async () => {
@@ -74,20 +73,18 @@ describe("Moves - Dragon Rage", () => {
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
- it("ignores stat changes", async () => {
+ it("ignores SPATK stat stages", async () => {
game.override.disableCrits();
- partyPokemon.summonData.battleStats[BattleStat.SPATK] = 2;
+ partyPokemon.setStatStage(Stat.SPATK, 2);
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
it("ignores stab", async () => {
@@ -96,9 +93,8 @@ describe("Moves - Dragon Rage", () => {
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
it("ignores criticals", async () => {
@@ -106,20 +102,18 @@ describe("Moves - Dragon Rage", () => {
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
- it("ignores damage modification from abilities such as ice scales", async () => {
+ it("ignores damage modification from abilities, for example ICE_SCALES", async () => {
game.override.disableCrits();
game.override.enemyAbility(Abilities.ICE_SCALES);
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
it("ignores multi hit", async () => {
@@ -128,8 +122,7 @@ describe("Moves - Dragon Rage", () => {
game.move.select(Moves.DRAGON_RAGE);
await game.phaseInterceptor.to(TurnEndPhase);
- const damageDealt = enemyPokemon.getMaxHp() - enemyPokemon.hp;
- expect(damageDealt).toBe(dragonRageDamage);
+ expect(enemyPokemon.getInverseHp()).toBe(dragonRageDamage);
});
});
diff --git a/src/test/moves/fake_out.test.ts b/src/test/moves/fake_out.test.ts
new file mode 100644
index 00000000000..ac09917daea
--- /dev/null
+++ b/src/test/moves/fake_out.test.ts
@@ -0,0 +1,82 @@
+import GameManager from "#app/test/utils/gameManager";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Moves - Fake 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")
+ .enemySpecies(Species.CORVIKNIGHT)
+ .starterSpecies(Species.FEEBAS)
+ .moveset([Moves.FAKE_OUT, Moves.SPLASH])
+ .enemyMoveset(SPLASH_ONLY)
+ .disableCrits();
+ });
+
+ it("can only be used on the first turn a pokemon is sent out", async() => {
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.FAKE_OUT);
+ await game.toNextTurn();
+
+ expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
+ const postTurnOneHp = enemy.hp;
+
+ game.move.select(Moves.FAKE_OUT);
+ await game.toNextTurn();
+
+ expect(enemy.hp).toBe(postTurnOneHp);
+
+ game.move.select(Moves.SPLASH);
+ await game.doKillOpponents();
+ await game.toNextWave();
+
+ const newEnemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.FAKE_OUT);
+ await game.toNextTurn();
+
+ expect(newEnemy.hp).toBe(newEnemy.getMaxHp());
+ }, 20000);
+
+ it("can be used again if recalled and sent back out", async() => {
+ game.override.startingWave(4);
+ await game.classicMode.startBattle();
+
+ const enemy1 = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.FAKE_OUT);
+ await game.phaseInterceptor.to("MoveEndPhase");
+
+ expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
+
+ await game.doKillOpponents();
+ await game.toNextWave();
+
+ game.move.select(Moves.FAKE_OUT);
+ await game.toNextTurn();
+
+ const enemy2 = game.scene.getEnemyPokemon()!;
+
+ expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp());
+ }, 20000);
+});
diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts
index b2ff9e25dba..a639a86c5c1 100644
--- a/src/test/moves/fillet_away.test.ts
+++ b/src/test/moves/fillet_away.test.ts
@@ -1,8 +1,8 @@
-import { BattleStat } from "#app/data/battle-stat";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { toDmgValue } from "#app/utils";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
+import { Stat } from "#enums/stat";
import GameManager from "#test/utils/gameManager";
import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
@@ -40,8 +40,8 @@ describe("Moves - FILLET AWAY", () => {
//Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move)
- test("Fillet Away raises the user's Attack, Special Attack, and Speed by two stages each, at the cost of 1/2 of its maximum HP",
- async () => {
+ test("raises the user's ATK, SPATK, and SPD stat stages by 2 each, at the cost of 1/2 of its maximum HP",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
@@ -51,55 +51,55 @@ describe("Moves - FILLET AWAY", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(2);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(2);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(2);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(2);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2);
}, TIMEOUT
);
- test("Fillet Away will still take effect if one or more of the involved stats are not at max",
- async () => {
+ test("still takes effect if one or more of the involved stat stages are not at max",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
const hpLost = toDmgValue(leadPokemon.getMaxHp() / RATIO);
- //Here - BattleStat.SPD -> 0 and BattleStat.SPATK -> 3
- leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPATK] = 3;
+ //Here - Stat.SPD -> 0 and Stat.SPATK -> 3
+ leadPokemon.setStatStage(Stat.ATK, 6);
+ leadPokemon.setStatStage(Stat.SPATK, 3);
game.move.select(Moves.FILLET_AWAY);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp() - hpLost);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(5);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(2);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(5);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(2);
}, TIMEOUT
);
- test("Fillet Away fails if all stats involved are at max",
- async () => {
+ test("fails if all stat stages involved are at max",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
- leadPokemon.summonData.battleStats[BattleStat.ATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPATK] = 6;
- leadPokemon.summonData.battleStats[BattleStat.SPD] = 6;
+ leadPokemon.setStatStage(Stat.ATK, 6);
+ leadPokemon.setStatStage(Stat.SPATK, 6);
+ leadPokemon.setStatStage(Stat.SPD, 6);
game.move.select(Moves.FILLET_AWAY);
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(leadPokemon.getMaxHp());
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(6);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(6);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(6);
}, TIMEOUT
);
- test("Fillet Away fails if the user's health is less than 1/2",
- async () => {
+ test("fails if the user's health is less than 1/2",
+ async() => {
await game.startBattle([Species.MAGIKARP]);
const leadPokemon = game.scene.getPlayerPokemon()!;
@@ -110,9 +110,9 @@ describe("Moves - FILLET AWAY", () => {
await game.phaseInterceptor.to(TurnEndPhase);
expect(leadPokemon.hp).toBe(hpLost - PREDAMAGE);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(0);
- expect(leadPokemon.summonData.battleStats[BattleStat.SPD]).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.SPATK)).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.SPD)).toBe(0);
}, TIMEOUT
);
});
diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts
index 51122b269b8..34612d1fb18 100644
--- a/src/test/moves/fissure.test.ts
+++ b/src/test/moves/fissure.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { Species } from "#app/enums/species";
import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon";
import { DamagePhase } from "#app/phases/damage-phase";
@@ -52,7 +52,7 @@ describe("Moves - Fissure", () => {
game.scene.clearEnemyHeldItemModifiers();
});
- it("ignores damage modification from abilities such as fur coat", async () => {
+ it("ignores damage modification from abilities, for example FUR_COAT", async () => {
game.override.ability(Abilities.NO_GUARD);
game.override.enemyAbility(Abilities.FUR_COAT);
@@ -62,10 +62,10 @@ describe("Moves - Fissure", () => {
expect(enemyPokemon.isFainted()).toBe(true);
});
- it("ignores accuracy stat", async () => {
+ it("ignores user's ACC stat stage", async () => {
vi.spyOn(partyPokemon, "getAccuracyMultiplier");
- enemyPokemon.summonData.battleStats[BattleStat.ACC] = -6;
+ partyPokemon.setStatStage(Stat.ACC, -6);
game.move.select(Moves.FISSURE);
@@ -75,10 +75,10 @@ describe("Moves - Fissure", () => {
expect(partyPokemon.getAccuracyMultiplier).toHaveReturnedWith(1);
});
- it("ignores evasion stat", async () => {
+ it("ignores target's EVA stat stage", async () => {
vi.spyOn(partyPokemon, "getAccuracyMultiplier");
- enemyPokemon.summonData.battleStats[BattleStat.EVA] = 6;
+ enemyPokemon.setStatStage(Stat.EVA, 6);
game.move.select(Moves.FISSURE);
diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts
index b3e50219aec..ffe8ae995d3 100644
--- a/src/test/moves/flower_shield.test.ts
+++ b/src/test/moves/flower_shield.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { SemiInvulnerableTag } from "#app/data/battler-tags";
import { Type } from "#app/data/type";
import { Biome } from "#app/enums/biome";
@@ -34,24 +34,24 @@ describe("Moves - Flower Shield", () => {
game.override.enemyMoveset(SPLASH_ONLY);
});
- it("increases defense of all Grass-type Pokemon on the field by one stage - single battle", async () => {
+ it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - single battle", async () => {
game.override.enemySpecies(Species.CHERRIM);
await game.startBattle([Species.MAGIKARP]);
const cherrim = game.scene.getEnemyPokemon()!;
const magikarp = game.scene.getPlayerPokemon()!;
- expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0);
+ expect(magikarp.getStatStage(Stat.DEF)).toBe(0);
+ expect(cherrim.getStatStage(Stat.DEF)).toBe(0);
game.move.select(Moves.FLOWER_SHIELD);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(magikarp.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1);
+ expect(magikarp.getStatStage(Stat.DEF)).toBe(0);
+ expect(cherrim.getStatStage(Stat.DEF)).toBe(1);
});
- it("increases defense of all Grass-type Pokemon on the field by one stage - double battle", async () => {
+ it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - double battle", async () => {
game.override.enemySpecies(Species.MAGIKARP).startingBiome(Biome.GRASS).battleType("double");
await game.startBattle([Species.CHERRIM, Species.MAGIKARP]);
@@ -60,21 +60,21 @@ describe("Moves - Flower Shield", () => {
const grassPokemons = field.filter(p => p.getTypes().includes(Type.GRASS));
const nonGrassPokemons = field.filter(pokemon => !grassPokemons.includes(pokemon));
- grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0));
- nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0));
+ grassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(0));
+ nonGrassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(0));
game.move.select(Moves.FLOWER_SHIELD);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to(TurnEndPhase);
- grassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(1));
- nonGrassPokemons.forEach(p => expect(p.summonData.battleStats[BattleStat.DEF]).toBe(0));
+ grassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(1));
+ nonGrassPokemons.forEach(p => expect(p.getStatStage(Stat.DEF)).toBe(0));
});
/**
* See semi-vulnerable state tags. {@linkcode SemiInvulnerableTag}
*/
- it("does not increase defense of a pokemon in semi-vulnerable state", async () => {
+ it("does not raise DEF stat stage for a Pokemon in semi-vulnerable state", async () => {
game.override.enemySpecies(Species.PARAS);
game.override.enemyMoveset([Moves.DIG, Moves.DIG, Moves.DIG, Moves.DIG]);
game.override.enemyLevel(50);
@@ -83,32 +83,32 @@ describe("Moves - Flower Shield", () => {
const paras = game.scene.getEnemyPokemon()!;
const cherrim = game.scene.getPlayerPokemon()!;
- expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(0);
+ expect(paras.getStatStage(Stat.DEF)).toBe(0);
+ expect(cherrim.getStatStage(Stat.DEF)).toBe(0);
expect(paras.getTag(SemiInvulnerableTag)).toBeUndefined;
game.move.select(Moves.FLOWER_SHIELD);
await game.phaseInterceptor.to(TurnEndPhase);
expect(paras.getTag(SemiInvulnerableTag)).toBeDefined();
- expect(paras.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(cherrim.summonData.battleStats[BattleStat.DEF]).toBe(1);
+ expect(paras.getStatStage(Stat.DEF)).toBe(0);
+ expect(cherrim.getStatStage(Stat.DEF)).toBe(1);
});
- it("does nothing if there are no Grass-type pokemon on the field", async () => {
+ it("does nothing if there are no Grass-type Pokemon on the field", async () => {
game.override.enemySpecies(Species.MAGIKARP);
await game.startBattle([Species.MAGIKARP]);
const enemy = game.scene.getEnemyPokemon()!;
const ally = game.scene.getPlayerPokemon()!;
- expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(0);
+ expect(ally.getStatStage(Stat.DEF)).toBe(0);
game.move.select(Moves.FLOWER_SHIELD);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(enemy.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(ally.summonData.battleStats[BattleStat.DEF]).toBe(0);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(0);
+ expect(ally.getStatStage(Stat.DEF)).toBe(0);
});
});
diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts
index 99399623a1c..249647f0294 100644
--- a/src/test/moves/focus_punch.test.ts
+++ b/src/test/moves/focus_punch.test.ts
@@ -123,7 +123,7 @@ describe("Moves - Focus Punch", () => {
await game.startBattle([Species.CHARIZARD]);
- game.forceOpponentToSwitch();
+ game.forceEnemyToSwitch();
game.move.select(Moves.FOCUS_PUNCH);
await game.phaseInterceptor.to(TurnStartPhase);
diff --git a/src/test/moves/follow_me.test.ts b/src/test/moves/follow_me.test.ts
index d7ef199df3e..7d0c4fdb546 100644
--- a/src/test/moves/follow_me.test.ts
+++ b/src/test/moves/follow_me.test.ts
@@ -1,5 +1,5 @@
+import { Stat } from "#enums/stat";
import { BattlerIndex } from "#app/battle";
-import { Stat } from "#app/data/pokemon-stat";
import { Abilities } from "#app/enums/abilities";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
@@ -28,48 +28,55 @@ describe("Moves - Follow Me", () => {
game = new GameManager(phaserGame);
game.override.battleType("double");
game.override.starterSpecies(Species.AMOONGUSS);
+ game.override.ability(Abilities.BALL_FETCH);
game.override.enemySpecies(Species.SNORLAX);
game.override.startingLevel(100);
game.override.enemyLevel(100);
game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.enemyMoveset([Moves.TACKLE, Moves.FOLLOW_ME, Moves.SPLASH]);
});
test(
"move should redirect enemy attacks to the user",
async () => {
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const playerPokemon = game.scene.getPlayerField();
- const playerStartingHp = playerPokemon.map(p => p.hp);
-
game.move.select(Moves.FOLLOW_ME);
game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY);
+
+ // Force both enemies to target the player Pokemon that did not use Follow Me
+ await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2);
+ await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2);
+
await game.phaseInterceptor.to(TurnEndPhase, false);
- expect(playerPokemon[0].hp).toBeLessThan(playerStartingHp[0]);
- expect(playerPokemon[1].hp).toBe(playerStartingHp[1]);
+ expect(playerPokemon[0].hp).toBeLessThan(playerPokemon[0].getMaxHp());
+ expect(playerPokemon[1].hp).toBe(playerPokemon[1].getMaxHp());
}, TIMEOUT
);
test(
"move should redirect enemy attacks to the first ally that uses it",
async () => {
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const playerPokemon = game.scene.getPlayerField();
- const playerStartingHp = playerPokemon.map(p => p.hp);
-
game.move.select(Moves.FOLLOW_ME);
game.move.select(Moves.FOLLOW_ME, 1);
+
+ // Each player is targeted by an enemy
+ await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER);
+ await game.forceEnemyMove(Moves.TACKLE, BattlerIndex.PLAYER_2);
+
await game.phaseInterceptor.to(TurnEndPhase, false);
- playerPokemon.sort((a, b) => a.getBattleStat(Stat.SPD) - b.getBattleStat(Stat.SPD));
+ playerPokemon.sort((a, b) => a.getEffectiveStat(Stat.SPD) - b.getEffectiveStat(Stat.SPD));
- expect(playerPokemon[1].hp).toBeLessThan(playerStartingHp[1]);
- expect(playerPokemon[0].hp).toBe(playerStartingHp[0]);
+ expect(playerPokemon[1].hp).toBeLessThan(playerPokemon[1].getMaxHp());
+ expect(playerPokemon[0].hp).toBe(playerPokemon[0].getMaxHp());
}, TIMEOUT
);
@@ -78,21 +85,23 @@ describe("Moves - Follow Me", () => {
async () => {
game.override.ability(Abilities.STALWART);
game.override.moveset([Moves.QUICK_ATTACK]);
- game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME]);
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const enemyPokemon = game.scene.getEnemyField();
- const enemyStartingHp = enemyPokemon.map(p => p.hp);
-
game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY);
game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2);
+
+ // Target doesn't need to be specified if the move is self-targeted
+ await game.forceEnemyMove(Moves.FOLLOW_ME);
+ await game.forceEnemyMove(Moves.SPLASH);
+
await game.phaseInterceptor.to(TurnEndPhase, false);
// If redirection was bypassed, both enemies should be damaged
- expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]);
- expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]);
+ expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
+ expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp());
}, TIMEOUT
);
@@ -100,21 +109,22 @@ describe("Moves - Follow Me", () => {
"move effect should be bypassed by Snipe Shot",
async () => {
game.override.moveset([Moves.SNIPE_SHOT]);
- game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME]);
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const enemyPokemon = game.scene.getEnemyField();
- const enemyStartingHp = enemyPokemon.map(p => p.hp);
-
game.move.select(Moves.SNIPE_SHOT, 0, BattlerIndex.ENEMY);
game.move.select(Moves.SNIPE_SHOT, 1, BattlerIndex.ENEMY_2);
+
+ await game.forceEnemyMove(Moves.FOLLOW_ME);
+ await game.forceEnemyMove(Moves.SPLASH);
+
await game.phaseInterceptor.to(TurnEndPhase, false);
// If redirection was bypassed, both enemies should be damaged
- expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]);
- expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]);
+ expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
+ expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[1].getMaxHp());
}, TIMEOUT
);
});
diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts
new file mode 100644
index 00000000000..445a432a812
--- /dev/null
+++ b/src/test/moves/freeze_dry.test.ts
@@ -0,0 +1,107 @@
+import { BattlerIndex } from "#app/battle";
+import { Abilities } from "#app/enums/abilities";
+import { Moves } from "#app/enums/moves";
+import { Species } from "#app/enums/species";
+import GameManager from "#test/utils/gameManager";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+describe("Moves - Freeze-Dry", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+ const TIMEOUT = 20 * 1000;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(SPLASH_ONLY)
+ .starterSpecies(Species.FEEBAS)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.FREEZE_DRY]);
+ });
+
+ it("should deal 2x damage to pure water types", async () => {
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2);
+ }, TIMEOUT);
+
+ it("should deal 4x damage to water/flying types", async () => {
+ game.override.enemySpecies(Species.WINGULL);
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4);
+ }, TIMEOUT);
+
+ it("should deal 1x damage to water/fire types", async () => {
+ game.override.enemySpecies(Species.VOLCANION);
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(1);
+ }, TIMEOUT);
+
+ // enable if this is ever fixed (lol)
+ it.todo("should deal 2x damage to water types under Normalize", async () => {
+ game.override.ability(Abilities.NORMALIZE);
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEffectPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2);
+ }, TIMEOUT);
+
+ // enable once Electrify is implemented (and the interaction is fixed, as above)
+ it.todo("should deal 2x damage to water types under Electrify", async () => {
+ game.override.enemyMoveset(Array(4).fill(Moves.ELECTRIFY));
+ await game.classicMode.startBattle();
+
+ const enemy = game.scene.getEnemyPokemon()!;
+ vi.spyOn(enemy, "getMoveEffectiveness");
+
+ game.move.select(Moves.FREEZE_DRY);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/freezy_frost.test.ts b/src/test/moves/freezy_frost.test.ts
index 00d7104d373..ae42d5b6dc6 100644
--- a/src/test/moves/freezy_frost.test.ts
+++ b/src/test/moves/freezy_frost.test.ts
@@ -1,82 +1,61 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { allMoves } from "#app/data/move";
-import { MoveEndPhase } from "#app/phases/move-end-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import { allMoves } from "#app/data/move";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Freezy Frost", () => {
- describe("integration tests", () => {
- let phaserGame: Phaser.Game;
- let game: GameManager;
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
- beforeAll(() => {
- phaserGame = new Phaser.Game({ type: Phaser.HEADLESS });
- });
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({ type: Phaser.HEADLESS });
+ });
- afterEach(() => {
- game.phaseInterceptor.restoreOg();
- });
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
- beforeEach(() => {
- game = new GameManager(phaserGame);
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
- game.override.battleType("single");
+ game.override.battleType("single");
- game.override.enemySpecies(Species.RATTATA);
- game.override.enemyLevel(100);
- game.override.enemyMoveset(SPLASH_ONLY);
- game.override.enemyAbility(Abilities.NONE);
+ game.override.enemySpecies(Species.RATTATA);
+ game.override.enemyLevel(100);
+ game.override.enemyMoveset(SPLASH_ONLY);
+ game.override.enemyAbility(Abilities.NONE);
- game.override.startingLevel(100);
- game.override.moveset([Moves.FREEZY_FROST, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]);
- vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100);
- game.override.ability(Abilities.NONE);
- });
+ game.override.startingLevel(100);
+ game.override.moveset([Moves.FREEZY_FROST, Moves.SWORDS_DANCE, Moves.CHARM, Moves.SPLASH]);
+ vi.spyOn(allMoves[Moves.FREEZY_FROST], "accuracy", "get").mockReturnValue(100);
+ game.override.ability(Abilities.NONE);
+ });
- it("Uses Swords Dance to raise own ATK by 2, Charm to lower enemy ATK by 2, player uses Freezy Frost to clear all stat changes", { timeout: 10000 }, async () => {
- await game.startBattle([Species.RATTATA]);
- const user = game.scene.getPlayerPokemon()!;
- const enemy = game.scene.getEnemyPokemon()!;
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(enemy.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ it("should clear all stat stage changes", { timeout: 10000 }, async () => {
+ await game.startBattle([Species.RATTATA]);
+ const user = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
- game.move.select(Moves.SWORDS_DANCE);
- await game.phaseInterceptor.to(TurnInitPhase);
+ expect(user.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
- game.move.select(Moves.CHARM);
- await game.phaseInterceptor.to(TurnInitPhase);
- const userAtkBefore = user.summonData.battleStats[BattleStat.ATK];
- const enemyAtkBefore = enemy.summonData.battleStats[BattleStat.ATK];
- expect(userAtkBefore).toBe(2);
- expect(enemyAtkBefore).toBe(-2);
+ game.move.select(Moves.SWORDS_DANCE);
+ await game.phaseInterceptor.to(TurnInitPhase);
- game.move.select(Moves.FREEZY_FROST);
- await game.phaseInterceptor.to(TurnInitPhase);
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(enemy.summonData.battleStats[BattleStat.ATK]).toBe(0);
- });
+ game.move.select(Moves.CHARM);
+ await game.phaseInterceptor.to(TurnInitPhase);
+ expect(user.getStatStage(Stat.ATK)).toBe(2);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(-2);
- it("Uses Swords Dance to raise own ATK by 2, Charm to lower enemy ATK by 2, enemy uses Freezy Frost to clear all stat changes", { timeout: 10000 }, async () => {
- game.override.enemyMoveset([Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST, Moves.FREEZY_FROST]);
- await game.startBattle([Species.SHUCKLE]); // Shuckle for slower Swords Dance on first turn so Freezy Frost doesn't affect it.
- const user = game.scene.getPlayerPokemon()!;
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
-
- game.move.select(Moves.SWORDS_DANCE);
- await game.phaseInterceptor.to(TurnInitPhase);
-
- const userAtkBefore = user.summonData.battleStats[BattleStat.ATK];
- expect(userAtkBefore).toBe(2);
-
- game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(MoveEndPhase);
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
- });
+ game.move.select(Moves.FREEZY_FROST);
+ await game.phaseInterceptor.to(TurnInitPhase);
+ expect(user.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
});
});
diff --git a/src/test/moves/fusion_flare.test.ts b/src/test/moves/fusion_flare.test.ts
index 471f6a2ac7b..0a8f6f9115d 100644
--- a/src/test/moves/fusion_flare.test.ts
+++ b/src/test/moves/fusion_flare.test.ts
@@ -27,7 +27,7 @@ describe("Moves - Fusion Flare", () => {
game.override.moveset([fusionFlare]);
game.override.startingLevel(1);
- game.override.enemySpecies(Species.RESHIRAM);
+ game.override.enemySpecies(Species.RATTATA);
game.override.enemyMoveset([Moves.REST, Moves.REST, Moves.REST, Moves.REST]);
game.override.battleType("single");
diff --git a/src/test/moves/fusion_flare_bolt.test.ts b/src/test/moves/fusion_flare_bolt.test.ts
index ebef5148778..a8372fcaaab 100644
--- a/src/test/moves/fusion_flare_bolt.test.ts
+++ b/src/test/moves/fusion_flare_bolt.test.ts
@@ -1,6 +1,6 @@
+import { Stat } from "#enums/stat";
import { BattlerIndex } from "#app/battle";
import { allMoves } from "#app/data/move";
-import { Stat } from "#app/data/pokemon-stat";
import { DamagePhase } from "#app/phases/damage-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase";
diff --git a/src/test/moves/gigaton_hammer.test.ts b/src/test/moves/gigaton_hammer.test.ts
new file mode 100644
index 00000000000..9379e9d98b2
--- /dev/null
+++ b/src/test/moves/gigaton_hammer.test.ts
@@ -0,0 +1,80 @@
+import { BattlerIndex } from "#app/battle.js";
+import GameManager from "#app/test/utils/gameManager";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Moves - Gigaton Hammer", () => {
+ 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.MAGIKARP)
+ .starterSpecies(Species.FEEBAS)
+ .moveset([Moves.GIGATON_HAMMER])
+ .startingLevel(10)
+ .enemyLevel(100)
+ .enemyMoveset(SPLASH_ONLY)
+ .disableCrits();
+ });
+
+ it("can't be used two turns in a row", async() => {
+ await game.classicMode.startBattle();
+
+ const enemy1 = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.GIGATON_HAMMER);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEndPhase");
+
+ expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
+
+ await game.doKillOpponents();
+ await game.toNextWave();
+
+ game.move.select(Moves.GIGATON_HAMMER);
+ await game.toNextTurn();
+
+ const enemy2 = game.scene.getEnemyPokemon()!;
+
+ expect(enemy2.hp).toBe(enemy2.getMaxHp());
+ }, 20000);
+
+ it("can be used again if recalled and sent back out", async() => {
+ game.override.startingWave(4);
+ await game.classicMode.startBattle();
+
+ const enemy1 = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.GIGATON_HAMMER);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.phaseInterceptor.to("MoveEndPhase");
+
+ expect(enemy1.hp).toBeLessThan(enemy1.getMaxHp());
+
+ await game.doKillOpponents();
+ await game.toNextWave();
+
+ game.move.select(Moves.GIGATON_HAMMER);
+ await game.toNextTurn();
+
+ const enemy2 = game.scene.getEnemyPokemon()!;
+
+ expect(enemy2.hp).toBeLessThan(enemy2.getMaxHp());
+ }, 20000);
+});
diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts
index dfbf5406351..defe5e26f41 100644
--- a/src/test/moves/growth.test.ts
+++ b/src/test/moves/growth.test.ts
@@ -1,14 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { Stat } from "#app/data/pokemon-stat";
-import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
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 { SPLASH_ONLY } from "../utils/testUtils";
+import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Growth", () => {
let phaserGame: Phaser.Game;
@@ -26,31 +25,25 @@ describe("Moves - Growth", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- const moveToUse = Moves.GROWTH;
game.override.battleType("single");
- game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(Abilities.MOXIE);
game.override.ability(Abilities.INSOMNIA);
- game.override.startingLevel(2000);
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.moveset([ Moves.GROWTH ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
});
- it("GROWTH", async () => {
- const moveToUse = Moves.GROWTH;
+ it("should raise SPATK stat stage by 1", async() => {
await game.startBattle([
- Species.MIGHTYENA,
- Species.MIGHTYENA,
+ Species.MIGHTYENA
]);
- let battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[Stat.SPATK]).toBe(0);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ const playerPokemon = game.scene.getPlayerPokemon()!;
- game.move.select(moveToUse);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(0);
+
+ game.move.select(Moves.GROWTH);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase);
- battleStatsPokemon = game.scene.getParty()[0].summonData.battleStats;
- expect(battleStatsPokemon[BattleStat.SPATK]).toBe(1);
+
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(1);
}, 20000);
});
diff --git a/src/test/moves/guard_split.test.ts b/src/test/moves/guard_split.test.ts
new file mode 100644
index 00000000000..f95d09f726c
--- /dev/null
+++ b/src/test/moves/guard_split.test.ts
@@ -0,0 +1,82 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Moves - Guard Split", () => {
+ 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")
+ .enemyAbility(Abilities.NONE)
+ .enemySpecies(Species.MEW)
+ .enemyLevel(200)
+ .moveset([ Moves.GUARD_SPLIT ])
+ .ability(Abilities.NONE);
+ });
+
+ it("should average the user's DEF and SPDEF stats with those of the target", async () => {
+ game.override.enemyMoveset(SPLASH_ONLY);
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgDef = Math.floor((player.getStat(Stat.DEF, false) + enemy.getStat(Stat.DEF, false)) / 2);
+ const avgSpDef = Math.floor((player.getStat(Stat.SPDEF, false) + enemy.getStat(Stat.SPDEF, false)) / 2);
+
+ game.move.select(Moves.GUARD_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.DEF, false)).toBe(avgDef);
+ expect(enemy.getStat(Stat.DEF, false)).toBe(avgDef);
+
+ expect(player.getStat(Stat.SPDEF, false)).toBe(avgSpDef);
+ expect(enemy.getStat(Stat.SPDEF, false)).toBe(avgSpDef);
+ }, 20000);
+
+ it("should be idempotent", async () => {
+ game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT));
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgDef = Math.floor((player.getStat(Stat.DEF, false) + enemy.getStat(Stat.DEF, false)) / 2);
+ const avgSpDef = Math.floor((player.getStat(Stat.SPDEF, false) + enemy.getStat(Stat.SPDEF, false)) / 2);
+
+ game.move.select(Moves.GUARD_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ game.move.select(Moves.GUARD_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.DEF, false)).toBe(avgDef);
+ expect(enemy.getStat(Stat.DEF, false)).toBe(avgDef);
+
+ expect(player.getStat(Stat.SPDEF, false)).toBe(avgSpDef);
+ expect(enemy.getStat(Stat.SPDEF, false)).toBe(avgSpDef);
+ }, 20000);
+});
diff --git a/src/test/moves/guard_swap.test.ts b/src/test/moves/guard_swap.test.ts
new file mode 100644
index 00000000000..407d475de09
--- /dev/null
+++ b/src/test/moves/guard_swap.test.ts
@@ -0,0 +1,63 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { MoveEndPhase } from "#app/phases/move-end-phase";
+
+describe("Moves - Guard Swap", () => {
+ 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")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH))
+ .enemySpecies(Species.MEW)
+ .enemyLevel(200)
+ .moveset([ Moves.GUARD_SWAP ])
+ .ability(Abilities.NONE);
+ });
+
+ it("should swap the user's DEF AND SPDEF stat stages with the target's", async () => {
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ // Should start with no stat stages
+ const player = game.scene.getPlayerPokemon()!;
+ // After Shell Smash, should have +2 in ATK and SPATK, -1 in DEF and SPDEF
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.GUARD_SWAP);
+
+ await game.phaseInterceptor.to(MoveEndPhase);
+
+ expect(player.getStatStage(Stat.DEF)).toBe(0);
+ expect(player.getStatStage(Stat.SPDEF)).toBe(0);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(-1);
+ expect(enemy.getStatStage(Stat.SPDEF)).toBe(-1);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStatStage(Stat.DEF)).toBe(-1);
+ expect(player.getStatStage(Stat.SPDEF)).toBe(-1);
+ expect(enemy.getStatStage(Stat.DEF)).toBe(0);
+ expect(enemy.getStatStage(Stat.SPDEF)).toBe(0);
+ }, 20000);
+});
diff --git a/src/test/moves/haze.test.ts b/src/test/moves/haze.test.ts
index 8a32a40cb32..42081ce74e8 100644
--- a/src/test/moves/haze.test.ts
+++ b/src/test/moves/haze.test.ts
@@ -1,13 +1,12 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { MoveEndPhase } from "#app/phases/move-end-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Haze", () => {
describe("integration tests", () => {
@@ -37,44 +36,28 @@ describe("Moves - Haze", () => {
game.override.ability(Abilities.NONE);
});
- it("Uses Swords Dance to raise own ATK by 2, Charm to lower enemy ATK by 2, player uses Haze to clear all stat changes", { timeout: 10000 }, async () => {
+ it("should reset all stat changes of all Pokemon on field", { timeout: 10000 }, async () => {
await game.startBattle([Species.RATTATA]);
const user = game.scene.getPlayerPokemon()!;
const enemy = game.scene.getEnemyPokemon()!;
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(enemy.summonData.battleStats[BattleStat.ATK]).toBe(0);
+
+ expect(user.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
game.move.select(Moves.SWORDS_DANCE);
await game.phaseInterceptor.to(TurnInitPhase);
game.move.select(Moves.CHARM);
await game.phaseInterceptor.to(TurnInitPhase);
- const userAtkBefore = user.summonData.battleStats[BattleStat.ATK];
- const enemyAtkBefore = enemy.summonData.battleStats[BattleStat.ATK];
- expect(userAtkBefore).toBe(2);
- expect(enemyAtkBefore).toBe(-2);
+
+ expect(user.getStatStage(Stat.ATK)).toBe(2);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(-2);
game.move.select(Moves.HAZE);
await game.phaseInterceptor.to(TurnInitPhase);
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
- expect(enemy.summonData.battleStats[BattleStat.ATK]).toBe(0);
- });
- it("Uses Swords Dance to raise own ATK by 2, Charm to lower enemy ATK by 2, enemy uses Haze to clear all stat changes", { timeout: 10000 }, async () => {
- game.override.enemyMoveset([Moves.HAZE, Moves.HAZE, Moves.HAZE, Moves.HAZE]);
- await game.startBattle([Species.SHUCKLE]); // Shuckle for slower Swords Dance on first turn so Haze doesn't affect it.
- const user = game.scene.getPlayerPokemon()!;
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
-
- game.move.select(Moves.SWORDS_DANCE);
- await game.phaseInterceptor.to(TurnInitPhase);
-
- const userAtkBefore = user.summonData.battleStats[BattleStat.ATK];
- expect(userAtkBefore).toBe(2);
-
- game.move.select(Moves.SPLASH);
- await game.phaseInterceptor.to(MoveEndPhase);
- expect(user.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(user.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
});
});
});
diff --git a/src/test/moves/lash_out.test.ts b/src/test/moves/lash_out.test.ts
new file mode 100644
index 00000000000..74d9fcd66c0
--- /dev/null
+++ b/src/test/moves/lash_out.test.ts
@@ -0,0 +1,52 @@
+import { BattlerIndex } from "#app/battle";
+import { allMoves } from "#app/data/move";
+import { Abilities } from "#app/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, vi } from "vitest";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Moves - Lash 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")
+ .disableCrits()
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.FUR_COAT)
+ .enemyMoveset(Array(4).fill(Moves.GROWL))
+ .startingLevel(10)
+ .enemyLevel(10)
+ .starterSpecies(Species.FEEBAS)
+ .ability(Abilities.BALL_FETCH)
+ .moveset([Moves.LASH_OUT]);
+
+ });
+
+ it("should deal double damage if the user's stat stages were lowered this turn", async () => {
+ vi.spyOn(allMoves[Moves.LASH_OUT], "calculateBattlePower");
+ await game.classicMode.startBattle();
+
+ game.move.select(Moves.LASH_OUT);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.phaseInterceptor.to("BerryPhase");
+
+ expect(allMoves[Moves.LASH_OUT].calculateBattlePower).toHaveReturnedWith(150);
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts
index 0af7763f175..e41472d7561 100644
--- a/src/test/moves/make_it_rain.test.ts
+++ b/src/test/moves/make_it_rain.test.ts
@@ -1,13 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { MoveEndPhase } from "#app/phases/move-end-phase";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
+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 { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import { MoveEndPhase } from "#app/phases/move-end-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
const TIMEOUT = 20 * 1000;
@@ -36,17 +36,17 @@ describe("Moves - Make It Rain", () => {
game.override.enemyLevel(100);
});
- it("should only reduce Sp. Atk. once in a double battle", async () => {
+ it("should only lower SPATK stat stage by 1 once in a double battle", async () => {
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
- const playerPokemon = game.scene.getPlayerField();
+ const playerPokemon = game.scene.getPlayerPokemon()!;
game.move.select(Moves.MAKE_IT_RAIN);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to(MoveEndPhase);
- expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1);
}, TIMEOUT);
it("should apply effects even if the target faints", async () => {
@@ -60,10 +60,10 @@ describe("Moves - Make It Rain", () => {
game.move.select(Moves.MAKE_IT_RAIN);
- await game.phaseInterceptor.to(StatChangePhase);
+ await game.phaseInterceptor.to(StatStageChangePhase);
expect(enemyPokemon.isFainted()).toBe(true);
- expect(playerPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1);
}, TIMEOUT);
it("should reduce Sp. Atk. once after KOing two enemies", async () => {
@@ -71,22 +71,22 @@ describe("Moves - Make It Rain", () => {
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
- const playerPokemon = game.scene.getPlayerField();
+ const playerPokemon = game.scene.getPlayerPokemon()!;
const enemyPokemon = game.scene.getEnemyField();
game.move.select(Moves.MAKE_IT_RAIN);
game.move.select(Moves.SPLASH, 1);
- await game.phaseInterceptor.to(StatChangePhase);
+ await game.phaseInterceptor.to(StatStageChangePhase);
enemyPokemon.forEach(p => expect(p.isFainted()).toBe(true));
- expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1);
}, TIMEOUT);
- it("should reduce Sp. Atk if it only hits the second target", async () => {
+ it("should lower SPATK stat stage by 1 if it only hits the second target", async () => {
await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]);
- const playerPokemon = game.scene.getPlayerField();
+ const playerPokemon = game.scene.getPlayerPokemon()!;
game.move.select(Moves.MAKE_IT_RAIN);
game.move.select(Moves.SPLASH, 1);
@@ -96,6 +96,6 @@ describe("Moves - Make It Rain", () => {
await game.phaseInterceptor.to(MoveEndPhase);
- expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1);
}, TIMEOUT);
});
diff --git a/src/test/moves/mat_block.test.ts b/src/test/moves/mat_block.test.ts
index 29a97806242..4a95985eb92 100644
--- a/src/test/moves/mat_block.test.ts
+++ b/src/test/moves/mat_block.test.ts
@@ -1,13 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { CommandPhase } from "#app/phases/command-phase";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
-import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
-import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
import GameManager from "../utils/gameManager";
+import { Species } from "#enums/species";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { BerryPhase } from "#app/phases/berry-phase";
+import { CommandPhase } from "#app/phases/command-phase";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
const TIMEOUT = 20 * 1000;
@@ -76,7 +76,7 @@ describe("Moves - Mat Block", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- leadPokemon.forEach(p => expect(p.summonData.battleStats[BattleStat.ATK]).toBe(-2));
+ leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(-2));
}, TIMEOUT
);
diff --git a/src/test/moves/miracle_eye.test.ts b/src/test/moves/miracle_eye.test.ts
index f47e4ce0c16..d6b21a5dc2f 100644
--- a/src/test/moves/miracle_eye.test.ts
+++ b/src/test/moves/miracle_eye.test.ts
@@ -33,18 +33,18 @@ describe("Moves - Miracle Eye", () => {
});
it("should allow Psychic moves to hit Dark types", async () => {
- await game.startBattle();
+ await game.classicMode.startBattle();
const enemy = game.scene.getEnemyPokemon()!;
game.move.select(Moves.CONFUSION);
- await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.toNextTurn();
expect(enemy.hp).toBe(enemy.getMaxHp());
game.move.select(Moves.MIRACLE_EYE);
await game.toNextTurn();
game.move.select(Moves.CONFUSION);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.phaseInterceptor.to(MoveEffectPhase);
expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts
index 389e4a4c4cf..c86906ea240 100644
--- a/src/test/moves/octolock.test.ts
+++ b/src/test/moves/octolock.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { TrappedTag } from "#app/data/battler-tags";
import { CommandPhase } from "#app/phases/command-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase";
@@ -12,68 +12,106 @@ import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Moves - Octolock", () => {
- describe("integration tests", () => {
- let phaserGame: Phaser.Game;
- let game: GameManager;
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
- beforeAll(() => {
- phaserGame = new Phaser.Game({
- type: Phaser.HEADLESS,
- });
- });
-
- afterEach(() => {
- game.phaseInterceptor.restoreOg();
- });
-
- beforeEach(() => {
- game = new GameManager(phaserGame);
-
- game.override.battleType("single");
-
- game.override.enemySpecies(Species.RATTATA);
- game.override.enemyMoveset(SPLASH_ONLY);
- game.override.enemyAbility(Abilities.BALL_FETCH);
-
- game.override.startingLevel(2000);
- game.override.moveset([Moves.OCTOLOCK, Moves.SPLASH]);
- game.override.ability(Abilities.BALL_FETCH);
- });
-
- it("Reduces DEf and SPDEF by 1 each turn", { timeout: 10000 }, async () => {
- await game.startBattle([Species.GRAPPLOCT]);
-
- const enemyPokemon = game.scene.getEnemyField();
-
- // use Octolock and advance to init phase of next turn to check for stat changes
- game.move.select(Moves.OCTOLOCK);
- await game.phaseInterceptor.to(TurnInitPhase);
-
- expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-1);
- expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-1);
-
- // take a second turn to make sure stat changes occur again
- await game.phaseInterceptor.to(CommandPhase);
- game.move.select(Moves.SPLASH);
-
- await game.phaseInterceptor.to(TurnInitPhase);
- expect(enemyPokemon[0].summonData.battleStats[BattleStat.DEF]).toBe(-2);
- expect(enemyPokemon[0].summonData.battleStats[BattleStat.SPDEF]).toBe(-2);
- });
-
- it("Traps the target pokemon", { timeout: 10000 }, async () => {
- await game.startBattle([Species.GRAPPLOCT]);
-
- const enemyPokemon = game.scene.getEnemyField();
-
- // before Octolock - enemy should not be trapped
- expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeUndefined();
-
- game.move.select(Moves.OCTOLOCK);
-
- // after Octolock - enemy should be trapped
- await game.phaseInterceptor.to(MoveEndPhase);
- expect(enemyPokemon[0].findTag(t => t instanceof TrappedTag)).toBeDefined();
+ 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(SPLASH_ONLY)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .startingLevel(2000)
+ .moveset([ Moves.OCTOLOCK, Moves.SPLASH ])
+ .ability(Abilities.BALL_FETCH);
+ });
+
+ it("lowers DEF and SPDEF stat stages of the target Pokemon by 1 each turn", { timeout: 10000 }, async () => {
+ await game.classicMode.startBattle([ Species.GRAPPLOCT ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ // use Octolock and advance to init phase of next turn to check for stat changes
+ game.move.select(Moves.OCTOLOCK);
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1);
+ expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1);
+
+ // take a second turn to make sure stat changes occur again
+ await game.phaseInterceptor.to(CommandPhase);
+ game.move.select(Moves.SPLASH);
+
+ await game.phaseInterceptor.to(TurnInitPhase);
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-2);
+ expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-2);
+ });
+
+ it("if target pokemon has BIG_PECKS, should only lower SPDEF stat stage by 1", { timeout: 10000 }, async () => {
+ game.override.enemyAbility(Abilities.BIG_PECKS);
+ await game.classicMode.startBattle([ Species.GRAPPLOCT ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ // use Octolock and advance to init phase of next turn to check for stat changes
+ game.move.select(Moves.OCTOLOCK);
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(-1);
+ });
+
+ it("if target pokemon has WHITE_SMOKE, should not reduce any stat stages", { timeout: 10000 }, async () => {
+ game.override.enemyAbility(Abilities.WHITE_SMOKE);
+ await game.classicMode.startBattle([ Species.GRAPPLOCT ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ // use Octolock and advance to init phase of next turn to check for stat changes
+ game.move.select(Moves.OCTOLOCK);
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0);
+ });
+
+ it("if target pokemon has CLEAR_BODY, should not reduce any stat stages", { timeout: 10000 }, async () => {
+ game.override.enemyAbility(Abilities.CLEAR_BODY);
+ await game.classicMode.startBattle([ Species.GRAPPLOCT ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ // use Octolock and advance to init phase of next turn to check for stat changes
+ game.move.select(Moves.OCTOLOCK);
+ await game.phaseInterceptor.to(TurnInitPhase);
+
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPDEF)).toBe(0);
+ });
+
+ it("traps the target pokemon", { timeout: 10000 }, async () => {
+ await game.classicMode.startBattle([ Species.GRAPPLOCT ]);
+
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ // before Octolock - enemy should not be trapped
+ expect(enemyPokemon.findTag(t => t instanceof TrappedTag)).toBeUndefined();
+
+ game.move.select(Moves.OCTOLOCK);
+
+ // after Octolock - enemy should be trapped
+ await game.phaseInterceptor.to(MoveEndPhase);
+ expect(enemyPokemon.findTag(t => t instanceof TrappedTag)).toBeDefined();
+ });
});
diff --git a/src/test/moves/parting_shot.test.ts b/src/test/moves/parting_shot.test.ts
index 7c2ca3f334c..d9535ca6482 100644
--- a/src/test/moves/parting_shot.test.ts
+++ b/src/test/moves/parting_shot.test.ts
@@ -1,14 +1,14 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { FaintPhase } from "#app/phases/faint-phase";
-import { MessagePhase } from "#app/phases/message-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, test } from "vitest";
import GameManager from "../utils/gameManager";
+import { Stat } from "#enums/stat";
+import { BerryPhase } from "#app/phases/berry-phase";
+import { FaintPhase } from "#app/phases/faint-phase";
+import { MessagePhase } from "#app/phases/message-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
import { SPLASH_ONLY } from "../utils/testUtils";
const TIMEOUT = 20 * 1000;
@@ -51,9 +51,8 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -72,9 +71,8 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -108,16 +106,15 @@ describe("Moves - Parting Shot", () => {
const enemyPokemon = game.scene.getEnemyPokemon()!;
expect(enemyPokemon).toBeDefined();
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-6);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-6);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-6);
// now parting shot should fail
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-6);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-6);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-6);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-6);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -137,9 +134,8 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -158,9 +154,8 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -176,9 +171,8 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = enemyPokemon.summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(-1);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(-1);
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(-1);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(-1);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MURKROW);
}, TIMEOUT
);
@@ -199,9 +193,9 @@ describe("Moves - Parting Shot", () => {
game.move.select(Moves.PARTING_SHOT);
await game.phaseInterceptor.to(BerryPhase, false);
- const battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.ATK]).toBe(0);
- expect(battleStatsOpponent[BattleStat.SPATK]).toBe(0);
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ expect(enemyPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(0);
expect(game.scene.getPlayerField()[0].species.speciesId).toBe(Species.MEOWTH);
}, TIMEOUT
);
diff --git a/src/test/moves/power_split.test.ts b/src/test/moves/power_split.test.ts
new file mode 100644
index 00000000000..a532a90a54d
--- /dev/null
+++ b/src/test/moves/power_split.test.ts
@@ -0,0 +1,82 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Moves - Power Split", () => {
+ 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")
+ .enemyAbility(Abilities.NONE)
+ .enemySpecies(Species.MEW)
+ .enemyLevel(200)
+ .moveset([ Moves.POWER_SPLIT ])
+ .ability(Abilities.NONE);
+ });
+
+ it("should average the user's ATK and SPATK stats with those of the target", async () => {
+ game.override.enemyMoveset(SPLASH_ONLY);
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2);
+ const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2);
+
+ game.move.select(Moves.POWER_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.ATK, false)).toBe(avgAtk);
+ expect(enemy.getStat(Stat.ATK, false)).toBe(avgAtk);
+
+ expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ }, 20000);
+
+ it("should be idempotent", async () => {
+ game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT));
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2);
+ const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2);
+
+ game.move.select(Moves.POWER_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ game.move.select(Moves.POWER_SPLIT);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.ATK, false)).toBe(avgAtk);
+ expect(enemy.getStat(Stat.ATK, false)).toBe(avgAtk);
+
+ expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ }, 20000);
+});
diff --git a/src/test/moves/power_swap.test.ts b/src/test/moves/power_swap.test.ts
new file mode 100644
index 00000000000..f1efeaa3af3
--- /dev/null
+++ b/src/test/moves/power_swap.test.ts
@@ -0,0 +1,62 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { MoveEndPhase } from "#app/phases/move-end-phase";
+
+describe("Moves - Power Swap", () => {
+ 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")
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH))
+ .enemySpecies(Species.MEW)
+ .enemyLevel(200)
+ .moveset([ Moves.POWER_SWAP ])
+ .ability(Abilities.NONE);
+ });
+
+ it("should swap the user's ATK AND SPATK stat stages with the target's", async () => {
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ // Should start with no stat stages
+ const player = game.scene.getPlayerPokemon()!;
+ // After Shell Smash, should have +2 in ATK and SPATK, -1 in DEF and SPDEF
+ const enemy = game.scene.getEnemyPokemon()!;
+ game.move.select(Moves.POWER_SWAP);
+
+ await game.phaseInterceptor.to(MoveEndPhase);
+
+ expect(player.getStatStage(Stat.ATK)).toBe(0);
+ expect(player.getStatStage(Stat.SPATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(2);
+ expect(enemy.getStatStage(Stat.SPATK)).toBe(2);
+
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStatStage(Stat.ATK)).toBe(2);
+ expect(player.getStatStage(Stat.SPATK)).toBe(2);
+ expect(enemy.getStatStage(Stat.ATK)).toBe(0);
+ expect(enemy.getStatStage(Stat.SPATK)).toBe(0);
+ }, 20000);
+});
diff --git a/src/test/moves/protect.test.ts b/src/test/moves/protect.test.ts
index 3fd51f4bc93..d792f586a37 100644
--- a/src/test/moves/protect.test.ts
+++ b/src/test/moves/protect.test.ts
@@ -1,13 +1,13 @@
-import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag";
-import { BattleStat } from "#app/data/battle-stat";
-import { allMoves } from "#app/data/move";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
-import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest";
import GameManager from "../utils/gameManager";
+import { Species } from "#enums/species";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { allMoves } from "#app/data/move";
+import { ArenaTagSide, ArenaTrapTag } from "#app/data/arena-tag";
+import { BerryPhase } from "#app/phases/berry-phase";
const TIMEOUT = 20 * 1000;
@@ -87,7 +87,7 @@ describe("Moves - Protect", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- expect(leadPokemon.summonData.battleStats[BattleStat.ATK]).toBe(0);
+ expect(leadPokemon.getStatStage(Stat.ATK)).toBe(0);
}, TIMEOUT
);
diff --git a/src/test/moves/quick_guard.test.ts b/src/test/moves/quick_guard.test.ts
index 26d9a74e9fd..25f98f8fa61 100644
--- a/src/test/moves/quick_guard.test.ts
+++ b/src/test/moves/quick_guard.test.ts
@@ -1,12 +1,12 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { CommandPhase } from "#app/phases/command-phase";
-import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
-import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
import GameManager from "../utils/gameManager";
+import { Species } from "#enums/species";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { BerryPhase } from "#app/phases/berry-phase";
+import { CommandPhase } from "#app/phases/command-phase";
const TIMEOUT = 20 * 1000;
@@ -76,7 +76,7 @@ describe("Moves - Quick Guard", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- leadPokemon.forEach(p => expect(p.summonData.battleStats[BattleStat.ATK]).toBe(0));
+ leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0));
}, TIMEOUT
);
diff --git a/src/test/moves/rage_powder.test.ts b/src/test/moves/rage_powder.test.ts
index 3e78c6fe0c9..3e9f422fda8 100644
--- a/src/test/moves/rage_powder.test.ts
+++ b/src/test/moves/rage_powder.test.ts
@@ -1,5 +1,4 @@
import { BattlerIndex } from "#app/battle";
-import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
@@ -31,27 +30,27 @@ describe("Moves - Rage Powder", () => {
game.override.startingLevel(100);
game.override.enemyLevel(100);
game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.enemyMoveset([Moves.RAGE_POWDER, Moves.TACKLE, Moves.SPLASH]);
});
test(
"move effect should be bypassed by Grass type",
async () => {
- game.override.enemyMoveset([Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER]);
-
- await game.startBattle([Species.AMOONGUSS, Species.VENUSAUR]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.VENUSAUR]);
const enemyPokemon = game.scene.getEnemyField();
- const enemyStartingHp = enemyPokemon.map(p => p.hp);
-
game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY);
game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2);
- await game.phaseInterceptor.to(TurnEndPhase, false);
+
+ await game.forceEnemyMove(Moves.RAGE_POWDER);
+ await game.forceEnemyMove(Moves.SPLASH);
+
+ await game.phaseInterceptor.to("BerryPhase", false);
// If redirection was bypassed, both enemies should be damaged
- expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]);
- expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]);
+ expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
+ expect(enemyPokemon[1].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
}, TIMEOUT
);
@@ -59,10 +58,9 @@ describe("Moves - Rage Powder", () => {
"move effect should be bypassed by Overcoat",
async () => {
game.override.ability(Abilities.OVERCOAT);
- game.override.enemyMoveset([Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER, Moves.RAGE_POWDER]);
// Test with two non-Grass type player Pokemon
- await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.BLASTOISE, Species.CHARIZARD]);
const enemyPokemon = game.scene.getEnemyField();
@@ -70,7 +68,7 @@ describe("Moves - Rage Powder", () => {
game.move.select(Moves.QUICK_ATTACK, 0, BattlerIndex.ENEMY);
game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2);
- await game.phaseInterceptor.to(TurnEndPhase, false);
+ await game.phaseInterceptor.to("BerryPhase", false);
// If redirection was bypassed, both enemies should be damaged
expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]);
diff --git a/src/test/moves/safeguard.test.ts b/src/test/moves/safeguard.test.ts
new file mode 100644
index 00000000000..94a7aa6031e
--- /dev/null
+++ b/src/test/moves/safeguard.test.ts
@@ -0,0 +1,150 @@
+import { BattlerIndex } from "#app/battle";
+import { allAbilities, PostDefendContactApplyStatusEffectAbAttr } from "#app/data/ability";
+import { Abilities } from "#app/enums/abilities";
+import { StatusEffect } from "#app/enums/status-effect";
+import GameManager from "#app/test/utils/gameManager";
+import { Moves } from "#enums/moves";
+import { Species } from "#enums/species";
+import Phaser from "phaser";
+import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+
+const TIMEOUT = 20 * 1000;
+
+describe("Moves - Safeguard", () => {
+ 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.DRATINI)
+ .enemyMoveset(Array(4).fill(Moves.SAFEGUARD))
+ .enemyAbility(Abilities.BALL_FETCH)
+ .enemyLevel(5)
+ .starterSpecies(Species.DRATINI)
+ .moveset([Moves.NUZZLE, Moves.SPORE, Moves.YAWN, Moves.SPLASH])
+ .ability(Abilities.BALL_FETCH);
+ });
+
+ it("protects from damaging moves with additional effects", async () => {
+ await game.startBattle();
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.NUZZLE);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+
+ expect(enemy.status).toBeUndefined();
+ }, TIMEOUT);
+
+ it("protects from status moves", async () => {
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.SPORE);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.status).toBeUndefined();
+ }, TIMEOUT);
+
+ it("protects from confusion", async () => {
+ game.override.moveset([Moves.CONFUSE_RAY]);
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.CONFUSE_RAY);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.summonData.tags).toEqual([]);
+ }, TIMEOUT);
+
+ it("protects ally from status", async () => {
+ game.override.battleType("double");
+
+ await game.startBattle();
+
+ game.move.select(Moves.SPORE, 0, BattlerIndex.ENEMY_2);
+ game.move.select(Moves.NUZZLE, 1, BattlerIndex.ENEMY_2);
+
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER, BattlerIndex.PLAYER_2, BattlerIndex.ENEMY_2]);
+
+ await game.phaseInterceptor.to("BerryPhase");
+
+ const enemyPokemon = game.scene.getEnemyField();
+
+ expect(enemyPokemon[0].status).toBeUndefined();
+ expect(enemyPokemon[1].status).toBeUndefined();
+ }, TIMEOUT);
+
+ it("protects from Yawn", async () => {
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.YAWN);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.summonData.tags).toEqual([]);
+ }, TIMEOUT);
+
+ it("doesn't protect from already existing Yawn", async () => {
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.YAWN);
+ await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
+ await game.toNextTurn();
+
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.status?.effect).toEqual(StatusEffect.SLEEP);
+ }, TIMEOUT);
+
+ it("doesn't protect from self-inflicted via Rest or Flame Orb", async () => {
+ game.override.enemyHeldItems([{name: "FLAME_ORB"}]);
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.SPLASH);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN);
+
+ game.override.enemyMoveset(Array(4).fill(Moves.REST));
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.status?.effect).toEqual(StatusEffect.SLEEP);
+ }, TIMEOUT);
+
+ it("protects from ability-inflicted status", async () => {
+ game.override.ability(Abilities.STATIC);
+ vi.spyOn(allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], "chance", "get").mockReturnValue(100);
+ await game.startBattle();
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+
+ game.move.select(Moves.SPLASH);
+ await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
+ await game.toNextTurn();
+ game.override.enemyMoveset(Array(4).fill(Moves.TACKLE));
+ game.move.select(Moves.SPLASH);
+ await game.toNextTurn();
+
+ expect(enemyPokemon.status).toBeUndefined();
+ }, TIMEOUT);
+});
diff --git a/src/test/moves/speed_swap.test.ts b/src/test/moves/speed_swap.test.ts
new file mode 100644
index 00000000000..131d506792b
--- /dev/null
+++ b/src/test/moves/speed_swap.test.ts
@@ -0,0 +1,54 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+describe("Moves - Speed Swap", () => {
+ 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")
+ .enemyAbility(Abilities.NONE)
+ .enemyMoveset(SPLASH_ONLY)
+ .enemySpecies(Species.MEW)
+ .enemyLevel(200)
+ .moveset([ Moves.SPEED_SWAP ])
+ .ability(Abilities.NONE);
+ });
+
+ it("should swap the user's SPD and the target's SPD stats", async () => {
+ await game.startBattle([
+ Species.INDEEDEE
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const playerSpd = player.getStat(Stat.SPD, false);
+ const enemySpd = enemy.getStat(Stat.SPD, false);
+
+ game.move.select(Moves.SPEED_SWAP);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.SPD, false)).toBe(enemySpd);
+ expect(enemy.getStat(Stat.SPD, false)).toBe(playerSpd);
+ }, 20000);
+});
diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts
index c4096111c6f..fa2e7521152 100644
--- a/src/test/moves/spikes.test.ts
+++ b/src/test/moves/spikes.test.ts
@@ -1,10 +1,10 @@
-import { CommandPhase } from "#app/phases/command-phase";
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 { SPLASH_ONLY } from "../utils/testUtils";
describe("Moves - Spikes", () => {
@@ -23,93 +23,61 @@ describe("Moves - Spikes", () => {
beforeEach(() => {
game = new GameManager(phaserGame);
- game.scene.battleStyle = 1;
- game.override.battleType("single");
- game.override.enemySpecies(Species.RATTATA);
- game.override.enemyAbility(Abilities.HYDRATION);
- game.override.enemyPassiveAbility(Abilities.HYDRATION);
- game.override.ability(Abilities.HYDRATION);
- game.override.passiveAbility(Abilities.HYDRATION);
- game.override.startingWave(3);
- game.override.enemyMoveset([Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]);
- game.override.moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]);
+ game.override
+ .battleType("single")
+ .enemySpecies(Species.MAGIKARP)
+ .enemyAbility(Abilities.BALL_FETCH)
+ .ability(Abilities.BALL_FETCH)
+ .enemyMoveset(SPLASH_ONLY)
+ .moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]);
});
- it("single - wild - stay on field - no damage", async () => {
- await game.classicMode.runToSummon([
- Species.MIGHTYENA,
- Species.POOCHYENA,
- ]);
- await game.phaseInterceptor.to(CommandPhase, true);
- const initialHp = game.scene.getParty()[0].hp;
- expect(game.scene.getParty()[0].hp).toBe(initialHp);
+ it("should not damage the team that set them", async () => {
+ await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
+
game.move.select(Moves.SPIKES);
await game.toNextTurn();
+
game.move.select(Moves.SPLASH);
await game.toNextTurn();
- expect(game.scene.getParty()[0].hp).toBe(initialHp);
- }, 20000);
-
- it("single - wild - take some damage", async () => {
- // player set spikes on the field and switch back to back
- // opponent do splash for 2 turns
- // nobody should take damage
- await game.classicMode.runToSummon([
- Species.MIGHTYENA,
- Species.POOCHYENA,
- ]);
- await game.phaseInterceptor.to(CommandPhase, false);
-
- const initialHp = game.scene.getParty()[0].hp;
- game.doSwitchPokemon(1);
- await game.phaseInterceptor.run(CommandPhase);
- await game.phaseInterceptor.to(CommandPhase, false);
game.doSwitchPokemon(1);
- await game.phaseInterceptor.run(CommandPhase);
- await game.phaseInterceptor.to(CommandPhase, false);
+ await game.toNextTurn();
- expect(game.scene.getParty()[0].hp).toBe(initialHp);
+ game.doSwitchPokemon(1);
+ await game.toNextTurn();
+
+ const player = game.scene.getParty()[0];
+ expect(player.hp).toBe(player.getMaxHp());
}, 20000);
- it("trainer - wild - force switch opponent - should take damage", async () => {
+ it("should damage opposing pokemon that are forced to switch in", async () => {
game.override.startingWave(5);
- // player set spikes on the field and do splash for 3 turns
- // opponent do splash for 4 turns
- // nobody should take damage
- await game.classicMode.runToSummon([
- Species.MIGHTYENA,
- Species.POOCHYENA,
- ]);
- await game.phaseInterceptor.to(CommandPhase, true);
- const initialHpOpponent = game.scene.currentBattle.enemyParty[1].hp;
+ await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
+
game.move.select(Moves.SPIKES);
await game.toNextTurn();
+
game.move.select(Moves.ROAR);
await game.toNextTurn();
- expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(initialHpOpponent);
+
+ const enemy = game.scene.getEnemyParty()[0];
+ expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
}, 20000);
- it("trainer - wild - force switch by himself opponent - should take damage", async () => {
+ it("should damage opposing pokemon that choose to switch in", async () => {
game.override.startingWave(5);
- game.override.startingLevel(5000);
- game.override.enemySpecies(0);
- // turn 1: player set spikes, opponent do splash
- // turn 2: player do splash, opponent switch pokemon
- // opponent pokemon should trigger spikes and lose HP
- await game.classicMode.runToSummon([
- Species.MIGHTYENA,
- Species.POOCHYENA,
- ]);
- await game.phaseInterceptor.to(CommandPhase, true);
- const initialHpOpponent = game.scene.currentBattle.enemyParty[1].hp;
+ await game.startBattle([Species.MIGHTYENA, Species.POOCHYENA]);
+
game.move.select(Moves.SPIKES);
await game.toNextTurn();
- game.forceOpponentToSwitch();
game.move.select(Moves.SPLASH);
+ game.forceEnemyToSwitch();
await game.toNextTurn();
- expect(game.scene.currentBattle.enemyParty[0].hp).toBeLessThan(initialHpOpponent);
+
+ const enemy = game.scene.getEnemyParty()[0];
+ expect(enemy.hp).toBeLessThan(enemy.getMaxHp());
}, 20000);
});
diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts
index ab47e65d653..f88791efb74 100644
--- a/src/test/moves/spit_up.test.ts
+++ b/src/test/moves/spit_up.test.ts
@@ -1,22 +1,24 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { StockpilingTag } from "#app/data/battler-tags";
import { allMoves } from "#app/data/move";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { MoveResult, TurnMove } from "#app/field/pokemon";
-import { MovePhase } from "#app/phases/move-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import GameManager from "#test/utils/gameManager";
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
-import GameManager from "#test/utils/gameManager";
-import { SPLASH_ONLY } from "#test/utils/testUtils";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
+import { SPLASH_ONLY } from "#test/utils/testUtils";
+import { MovePhase } from "#app/phases/move-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Spit Up", () => {
let phaserGame: Phaser.Game;
let game: GameManager;
+ const spitUp = allMoves[Moves.SPIT_UP];
+
beforeAll(() => {
phaserGame = new Phaser.Game({ type: Phaser.HEADLESS });
});
@@ -35,8 +37,10 @@ describe("Moves - Spit Up", () => {
game.override.enemyAbility(Abilities.NONE);
game.override.enemyLevel(2000);
- game.override.moveset([Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP, Moves.SPIT_UP]);
+ game.override.moveset(new Array(4).fill(spitUp.id));
game.override.ability(Abilities.NONE);
+
+ vi.spyOn(spitUp, "calculateBattlePower");
});
describe("consumes all stockpile stacks to deal damage (scaling with stacks)", () => {
@@ -53,13 +57,11 @@ describe("Moves - Spit Up", () => {
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup);
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(TurnInitPhase);
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce();
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower);
+ expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce();
+ expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
@@ -78,13 +80,11 @@ describe("Moves - Spit Up", () => {
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup);
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(TurnInitPhase);
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce();
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower);
+ expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce();
+ expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
@@ -104,13 +104,11 @@ describe("Moves - Spit Up", () => {
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(stacksToSetup);
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(TurnInitPhase);
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce();
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveReturnedWith(expectedPower);
+ expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce();
+ expect(spitUp.calculateBattlePower).toHaveReturnedWith(expectedPower);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
@@ -124,14 +122,12 @@ describe("Moves - Spit Up", () => {
const stockpilingTag = pokemon.getTag(StockpilingTag)!;
expect(stockpilingTag).toBeUndefined();
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(TurnInitPhase);
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.FAIL });
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).not.toHaveBeenCalled();
+ expect(spitUp.calculateBattlePower).not.toHaveBeenCalled();
});
describe("restores stat boosts granted by stacks", () => {
@@ -144,22 +140,20 @@ describe("Moves - Spit Up", () => {
const stockpilingTag = pokemon.getTag(StockpilingTag)!;
expect(stockpilingTag).toBeDefined();
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(MovePhase);
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(1);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(1);
await game.phaseInterceptor.to(TurnInitPhase);
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS });
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce();
+ expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce();
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(0);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
@@ -175,26 +169,19 @@ describe("Moves - Spit Up", () => {
// for the sake of simplicity (and because other tests cover the setup), set boost amounts directly
stockpilingTag.statChangeCounts = {
- [BattleStat.DEF]: -1,
- [BattleStat.SPDEF]: 2,
+ [Stat.DEF]: -1,
+ [Stat.SPDEF]: 2,
};
- expect(stockpilingTag.statChangeCounts).toMatchObject({
- [BattleStat.DEF]: -1,
- [BattleStat.SPDEF]: 2,
- });
-
- vi.spyOn(allMoves[Moves.SPIT_UP], "calculateBattlePower");
-
game.move.select(Moves.SPIT_UP);
await game.phaseInterceptor.to(TurnInitPhase);
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SPIT_UP, result: MoveResult.SUCCESS });
- expect(allMoves[Moves.SPIT_UP].calculateBattlePower).toHaveBeenCalledOnce();
+ expect(spitUp.calculateBattlePower).toHaveBeenCalledOnce();
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(-2);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(1);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(-2);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
diff --git a/src/test/moves/spotlight.test.ts b/src/test/moves/spotlight.test.ts
index e5f4719d1d3..aef44369642 100644
--- a/src/test/moves/spotlight.test.ts
+++ b/src/test/moves/spotlight.test.ts
@@ -1,5 +1,4 @@
import { BattlerIndex } from "#app/battle";
-import { Stat } from "#app/data/pokemon-stat";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
@@ -31,52 +30,46 @@ describe("Moves - Spotlight", () => {
game.override.startingLevel(100);
game.override.enemyLevel(100);
game.override.moveset([Moves.FOLLOW_ME, Moves.RAGE_POWDER, Moves.SPOTLIGHT, Moves.QUICK_ATTACK]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.SPLASH]);
});
test(
"move should redirect attacks to the target",
async () => {
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const enemyPokemon = game.scene.getEnemyField();
- const enemyStartingHp = enemyPokemon.map(p => p.hp);
-
game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY);
game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2);
+
+ await game.forceEnemyMove(Moves.SPLASH);
+ await game.forceEnemyMove(Moves.SPLASH);
+
await game.phaseInterceptor.to(TurnEndPhase, false);
- expect(enemyPokemon[0].hp).toBeLessThan(enemyStartingHp[0]);
- expect(enemyPokemon[1].hp).toBe(enemyStartingHp[1]);
+ expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
+ expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp());
}, TIMEOUT
);
test(
"move should cause other redirection moves to fail",
async () => {
- game.override.enemyMoveset([Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME, Moves.FOLLOW_ME]);
-
- await game.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
+ await game.classicMode.startBattle([Species.AMOONGUSS, Species.CHARIZARD]);
const enemyPokemon = game.scene.getEnemyField();
- /**
- * Spotlight will target the slower enemy. In this situation without Spotlight being used,
- * the faster enemy would normally end up with the Center of Attention tag.
- */
- enemyPokemon.sort((a, b) => b.getBattleStat(Stat.SPD) - a.getBattleStat(Stat.SPD));
- const spotTarget = enemyPokemon[1].getBattlerIndex();
- const attackTarget = enemyPokemon[0].getBattlerIndex();
+ game.move.select(Moves.SPOTLIGHT, 0, BattlerIndex.ENEMY);
+ game.move.select(Moves.QUICK_ATTACK, 1, BattlerIndex.ENEMY_2);
- const enemyStartingHp = enemyPokemon.map(p => p.hp);
+ await game.forceEnemyMove(Moves.SPLASH);
+ await game.forceEnemyMove(Moves.FOLLOW_ME);
- game.move.select(Moves.SPOTLIGHT, 0, spotTarget);
- game.move.select(Moves.QUICK_ATTACK, 1, attackTarget);
- await game.phaseInterceptor.to(TurnEndPhase, false);
+ await game.phaseInterceptor.to("BerryPhase", false);
- expect(enemyPokemon[1].hp).toBeLessThan(enemyStartingHp[1]);
- expect(enemyPokemon[0].hp).toBe(enemyStartingHp[0]);
+ expect(enemyPokemon[0].hp).toBeLessThan(enemyPokemon[0].getMaxHp());
+ expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp());
}, TIMEOUT
);
});
diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts
index b1941b9f9b3..d57768d0ffd 100644
--- a/src/test/moves/stockpile.test.ts
+++ b/src/test/moves/stockpile.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { StockpilingTag } from "#app/data/battler-tags";
import { MoveResult, TurnMove } from "#app/field/pokemon";
import { CommandPhase } from "#app/phases/command-phase";
@@ -38,7 +38,7 @@ describe("Moves - Stockpile", () => {
game.override.ability(Abilities.NONE);
});
- it("Gains a stockpile stack and increases DEF and SPDEF by 1 on each use, fails at max stacks (3)", { timeout: 10000 }, async () => {
+ it("gains a stockpile stack and raises user's DEF and SPDEF stat stages by 1 on each use, fails at max stacks (3)", { timeout: 10000 }, async () => {
await game.startBattle([Species.ABOMASNOW]);
const user = game.scene.getPlayerPokemon()!;
@@ -47,8 +47,8 @@ describe("Moves - Stockpile", () => {
// we just have to know that they're implemented as a BattlerTag.
expect(user.getTag(StockpilingTag)).toBeUndefined();
- expect(user.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(0);
+ expect(user.getStatStage(Stat.DEF)).toBe(0);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(0);
// use Stockpile four times
for (let i = 0; i < 4; i++) {
@@ -60,18 +60,16 @@ describe("Moves - Stockpile", () => {
await game.phaseInterceptor.to(TurnInitPhase);
const stockpilingTag = user.getTag(StockpilingTag)!;
- const def = user.summonData.battleStats[BattleStat.DEF];
- const spdef = user.summonData.battleStats[BattleStat.SPDEF];
if (i < 3) { // first three uses should behave normally
- expect(def).toBe(i + 1);
- expect(spdef).toBe(i + 1);
+ expect(user.getStatStage(Stat.DEF)).toBe(i + 1);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(i + 1);
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(i + 1);
} else { // fourth should have failed
- expect(def).toBe(3);
- expect(spdef).toBe(3);
+ expect(user.getStatStage(Stat.DEF)).toBe(3);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(3);
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(3);
expect(user.getMoveHistory().at(-1)).toMatchObject({ result: MoveResult.FAIL, move: Moves.STOCKPILE });
@@ -79,17 +77,17 @@ describe("Moves - Stockpile", () => {
}
});
- it("Gains a stockpile stack even if DEF and SPDEF are at +6", { timeout: 10000 }, async () => {
+ it("gains a stockpile stack even if user's DEF and SPDEF stat stages are at +6", { timeout: 10000 }, async () => {
await game.startBattle([Species.ABOMASNOW]);
const user = game.scene.getPlayerPokemon()!;
- user.summonData.battleStats[BattleStat.DEF] = 6;
- user.summonData.battleStats[BattleStat.SPDEF] = 6;
+ user.setStatStage(Stat.DEF, 6);
+ user.setStatStage(Stat.SPDEF, 6);
expect(user.getTag(StockpilingTag)).toBeUndefined();
- expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6);
- expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6);
+ expect(user.getStatStage(Stat.DEF)).toBe(6);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(6);
game.move.select(Moves.STOCKPILE);
await game.phaseInterceptor.to(TurnInitPhase);
@@ -97,8 +95,8 @@ describe("Moves - Stockpile", () => {
const stockpilingTag = user.getTag(StockpilingTag)!;
expect(stockpilingTag).toBeDefined();
expect(stockpilingTag.stockpiledCount).toBe(1);
- expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6);
- expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6);
+ expect(user.getStatStage(Stat.DEF)).toBe(6);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(6);
// do it again, just for good measure
await game.phaseInterceptor.to(CommandPhase);
@@ -109,8 +107,8 @@ describe("Moves - Stockpile", () => {
const stockpilingTagAgain = user.getTag(StockpilingTag)!;
expect(stockpilingTagAgain).toBeDefined();
expect(stockpilingTagAgain.stockpiledCount).toBe(2);
- expect(user.summonData.battleStats[BattleStat.DEF]).toBe(6);
- expect(user.summonData.battleStats[BattleStat.SPDEF]).toBe(6);
+ expect(user.getStatStage(Stat.DEF)).toBe(6);
+ expect(user.getStatStage(Stat.SPDEF)).toBe(6);
});
});
});
diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts
index 202f25fee74..9cea7ae8dc9 100644
--- a/src/test/moves/swallow.test.ts
+++ b/src/test/moves/swallow.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { StockpilingTag } from "#app/data/battler-tags";
import { BattlerTagType } from "#app/enums/battler-tag-type";
import { MoveResult, TurnMove } from "#app/field/pokemon";
@@ -138,7 +138,7 @@ describe("Moves - Swallow", () => {
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.FAIL });
});
- describe("restores stat boosts granted by stacks", () => {
+ describe("restores stat stage boosts granted by stacks", () => {
it("decreases stats based on stored values (both boosts equal)", { timeout: 10000 }, async () => {
await game.startBattle([Species.ABOMASNOW]);
@@ -151,20 +151,20 @@ describe("Moves - Swallow", () => {
game.move.select(Moves.SWALLOW);
await game.phaseInterceptor.to(MovePhase);
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(1);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(1);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(1);
await game.phaseInterceptor.to(TurnInitPhase);
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS });
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(0);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(0);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(0);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(0);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
- it("decreases stats based on stored values (different boosts)", { timeout: 10000 }, async () => {
+ it("lower stat stages based on stored values (different boosts)", { timeout: 10000 }, async () => {
await game.startBattle([Species.ABOMASNOW]);
const pokemon = game.scene.getPlayerPokemon()!;
@@ -175,22 +175,18 @@ describe("Moves - Swallow", () => {
// for the sake of simplicity (and because other tests cover the setup), set boost amounts directly
stockpilingTag.statChangeCounts = {
- [BattleStat.DEF]: -1,
- [BattleStat.SPDEF]: 2,
+ [Stat.DEF]: -1,
+ [Stat.SPDEF]: 2,
};
- expect(stockpilingTag.statChangeCounts).toMatchObject({
- [BattleStat.DEF]: -1,
- [BattleStat.SPDEF]: 2,
- });
-
game.move.select(Moves.SWALLOW);
+
await game.phaseInterceptor.to(TurnInitPhase);
expect(pokemon.getMoveHistory().at(-1)).toMatchObject({ move: Moves.SWALLOW, result: MoveResult.SUCCESS });
- expect(pokemon.summonData.battleStats[BattleStat.DEF]).toBe(1);
- expect(pokemon.summonData.battleStats[BattleStat.SPDEF]).toBe(-2);
+ expect(pokemon.getStatStage(Stat.DEF)).toBe(1);
+ expect(pokemon.getStatStage(Stat.SPDEF)).toBe(-2);
expect(pokemon.getTag(StockpilingTag)).toBeUndefined();
});
diff --git a/src/test/moves/tackle.test.ts b/src/test/moves/tackle.test.ts
index 5eca9e344c8..b25c7524a1a 100644
--- a/src/test/moves/tackle.test.ts
+++ b/src/test/moves/tackle.test.ts
@@ -1,4 +1,4 @@
-import { Stat } from "#app/data/pokemon-stat";
+import { Stat } from "#enums/stat";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts
index 0a999fe1920..04730a04f7a 100644
--- a/src/test/moves/tail_whip.test.ts
+++ b/src/test/moves/tail_whip.test.ts
@@ -1,12 +1,13 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
-import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { Stat } from "#enums/stat";
+import GameManager from "#test/utils/gameManager";
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 { SPLASH_ONLY } from "../utils/testUtils";
+import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
describe("Moves - Tail whip", () => {
@@ -31,23 +32,23 @@ describe("Moves - Tail whip", () => {
game.override.enemyAbility(Abilities.INSOMNIA);
game.override.ability(Abilities.INSOMNIA);
game.override.startingLevel(2000);
- game.override.moveset([moveToUse]);
- game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);
+ game.override.moveset([ moveToUse ]);
+ game.override.enemyMoveset(SPLASH_ONLY);
});
- it("TAIL_WHIP", async () => {
+ it("should lower DEF stat stage by 1", async() => {
const moveToUse = Moves.TAIL_WHIP;
await game.startBattle([
Species.MIGHTYENA,
Species.MIGHTYENA,
]);
- let battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.DEF]).toBe(0);
+ const enemyPokemon = game.scene.getEnemyPokemon()!;
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(0);
game.move.select(moveToUse);
await game.phaseInterceptor.runFrom(EnemyCommandPhase).to(TurnInitPhase);
- battleStatsOpponent = game.scene.currentBattle.enemyParty[0].summonData.battleStats;
- expect(battleStatsOpponent[BattleStat.DEF]).toBe(-1);
+
+ expect(enemyPokemon.getStatStage(Stat.DEF)).toBe(-1);
}, 20000);
});
diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts
index 6b70122d08d..d158a9cce86 100644
--- a/src/test/moves/tailwind.test.ts
+++ b/src/test/moves/tailwind.test.ts
@@ -1,5 +1,5 @@
+import { Stat } from "#enums/stat";
import { ArenaTagSide } from "#app/data/arena-tag";
-import { Stat } from "#app/data/pokemon-stat";
import { ArenaTagType } from "#app/enums/arena-tag-type";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
import { Moves } from "#enums/moves";
@@ -38,16 +38,16 @@ describe("Moves - Tailwind", () => {
const magikarpSpd = magikarp.getStat(Stat.SPD);
const meowthSpd = meowth.getStat(Stat.SPD);
- expect(magikarp.getBattleStat(Stat.SPD)).equal(magikarpSpd);
- expect(meowth.getBattleStat(Stat.SPD)).equal(meowthSpd);
+ expect(magikarp.getEffectiveStat(Stat.SPD)).equal(magikarpSpd);
+ expect(meowth.getEffectiveStat(Stat.SPD)).equal(meowthSpd);
game.move.select(Moves.TAILWIND);
game.move.select(Moves.SPLASH, 1);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(magikarp.getBattleStat(Stat.SPD)).toBe(magikarpSpd * 2);
- expect(meowth.getBattleStat(Stat.SPD)).toBe(meowthSpd * 2);
+ expect(magikarp.getEffectiveStat(Stat.SPD)).toBe(magikarpSpd * 2);
+ expect(meowth.getEffectiveStat(Stat.SPD)).toBe(meowthSpd * 2);
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
});
@@ -86,8 +86,8 @@ describe("Moves - Tailwind", () => {
const enemySpd = enemy.getStat(Stat.SPD);
- expect(ally.getBattleStat(Stat.SPD)).equal(allySpd);
- expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd);
+ expect(ally.getEffectiveStat(Stat.SPD)).equal(allySpd);
+ expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined();
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined();
@@ -95,8 +95,8 @@ describe("Moves - Tailwind", () => {
await game.phaseInterceptor.to(TurnEndPhase);
- expect(ally.getBattleStat(Stat.SPD)).toBe(allySpd * 2);
- expect(enemy.getBattleStat(Stat.SPD)).equal(enemySpd);
+ expect(ally.getEffectiveStat(Stat.SPD)).toBe(allySpd * 2);
+ expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined();
});
diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts
index bd7df8403d1..fa7a99adc14 100644
--- a/src/test/moves/tera_blast.test.ts
+++ b/src/test/moves/tera_blast.test.ts
@@ -1,9 +1,8 @@
import { BattlerIndex } from "#app/battle";
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { allMoves } from "#app/data/move";
import { Type } from "#app/data/type";
import { Abilities } from "#app/enums/abilities";
-import { Stat } from "#app/enums/stat";
import { HitResult } from "#app/field/pokemon";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
@@ -112,7 +111,7 @@ describe("Moves - Tera Blast", () => {
await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.phaseInterceptor.to("MoveEndPhase");
- expect(playerPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(-1);
- expect(playerPokemon.summonData.battleStats[BattleStat.ATK]).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.SPATK)).toBe(-1);
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(-1);
}, 20000);
});
diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts
index 1ef7933c114..5204b06106b 100644
--- a/src/test/moves/tidy_up.test.ts
+++ b/src/test/moves/tidy_up.test.ts
@@ -1,4 +1,4 @@
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import { ArenaTagType } from "#app/enums/arena-tag-type";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { TurnEndPhase } from "#app/phases/turn-end-phase";
@@ -60,7 +60,6 @@ describe("Moves - Tidy Up", () => {
game.move.select(Moves.TIDY_UP);
await game.phaseInterceptor.to(MoveEndPhase);
expect(game.scene.arena.getTag(ArenaTagType.STEALTH_ROCK)).toBeUndefined();
-
}, 20000);
it("toxic spikes are cleared", async () => {
@@ -73,7 +72,6 @@ describe("Moves - Tidy Up", () => {
game.move.select(Moves.TIDY_UP);
await game.phaseInterceptor.to(MoveEndPhase);
expect(game.scene.arena.getTag(ArenaTagType.TOXIC_SPIKES)).toBeUndefined();
-
}, 20000);
it("sticky webs are cleared", async () => {
@@ -87,7 +85,6 @@ describe("Moves - Tidy Up", () => {
game.move.select(Moves.TIDY_UP);
await game.phaseInterceptor.to(MoveEndPhase);
expect(game.scene.arena.getTag(ArenaTagType.STICKY_WEB)).toBeUndefined();
-
}, 20000);
it.skip("substitutes are cleared", async () => {
@@ -101,22 +98,20 @@ describe("Moves - Tidy Up", () => {
game.move.select(Moves.TIDY_UP);
await game.phaseInterceptor.to(MoveEndPhase);
// TODO: check for subs here once the move is implemented
-
}, 20000);
it("user's stats are raised with no traps set", async () => {
await game.startBattle();
- const player = game.scene.getPlayerPokemon()!.summonData.battleStats;
- expect(player[BattleStat.ATK]).toBe(0);
- expect(player[BattleStat.SPD]).toBe(0);
+ const playerPokemon = game.scene.getPlayerPokemon()!;
+
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(0);
+ expect(playerPokemon.getStatStage(Stat.SPD)).toBe(0);
game.move.select(Moves.TIDY_UP);
await game.phaseInterceptor.to(TurnEndPhase);
- expect(player[BattleStat.ATK]).toBe(+1);
- expect(player[BattleStat.SPD]).toBe(+1);
-
+ expect(playerPokemon.getStatStage(Stat.ATK)).toBe(1);
+ expect(playerPokemon.getStatStage(Stat.SPD)).toBe(1);
}, 20000);
-
});
diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts
new file mode 100644
index 00000000000..45769447e4d
--- /dev/null
+++ b/src/test/moves/transform.test.ts
@@ -0,0 +1,101 @@
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import Phaser from "phaser";
+import GameManager from "#app/test/utils/gameManager";
+import { Species } from "#enums/species";
+import { TurnEndPhase } from "#app/phases/turn-end-phase";
+import { Moves } from "#enums/moves";
+import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat";
+import { Abilities } from "#enums/abilities";
+import { SPLASH_ONLY } from "../utils/testUtils";
+
+// TODO: Add more tests once Transform is fully implemented
+describe("Moves - Transform", () => {
+ 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.MEW)
+ .enemyLevel(200)
+ .enemyAbility(Abilities.BEAST_BOOST)
+ .enemyPassiveAbility(Abilities.BALL_FETCH)
+ .enemyMoveset(SPLASH_ONLY)
+ .ability(Abilities.INTIMIDATE)
+ .moveset([ 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
+ ]);
+
+ game.move.select(Moves.TRANSFORM);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ expect(player.getSpeciesForm().speciesId).toBe(enemy.getSpeciesForm().speciesId);
+ expect(player.getAbility()).toBe(enemy.getAbility());
+ expect(player.getGender()).toBe(enemy.getGender());
+
+ expect(player.getStat(Stat.HP, false)).not.toBe(enemy.getStat(Stat.HP));
+ for (const s of EFFECTIVE_STATS) {
+ expect(player.getStat(s, false)).toBe(enemy.getStat(s, false));
+ }
+
+ for (const s of BATTLE_STATS) {
+ expect(player.getStatStage(s)).toBe(enemy.getStatStage(s));
+ }
+
+ const playerMoveset = player.getMoveset();
+ const enemyMoveset = player.getMoveset();
+
+ 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();
+
+ 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(new Array(4).fill(Moves.POWER_SPLIT));
+
+ await game.startBattle([
+ Species.DITTO
+ ]);
+
+ const player = game.scene.getPlayerPokemon()!;
+ const enemy = game.scene.getEnemyPokemon()!;
+
+ const avgAtk = Math.floor((player.getStat(Stat.ATK, false) + enemy.getStat(Stat.ATK, false)) / 2);
+ const avgSpAtk = Math.floor((player.getStat(Stat.SPATK, false) + enemy.getStat(Stat.SPATK, false)) / 2);
+
+ game.move.select(Moves.TRANSFORM);
+ await game.phaseInterceptor.to(TurnEndPhase);
+
+ expect(player.getStat(Stat.ATK, false)).toBe(avgAtk);
+ expect(enemy.getStat(Stat.ATK, false)).toBe(avgAtk);
+
+ expect(player.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ expect(enemy.getStat(Stat.SPATK, false)).toBe(avgSpAtk);
+ });
+});
diff --git a/src/test/moves/wide_guard.test.ts b/src/test/moves/wide_guard.test.ts
index 616972de01b..6feeff815b5 100644
--- a/src/test/moves/wide_guard.test.ts
+++ b/src/test/moves/wide_guard.test.ts
@@ -1,12 +1,12 @@
-import { BattleStat } from "#app/data/battle-stat";
-import { BerryPhase } from "#app/phases/berry-phase";
-import { CommandPhase } from "#app/phases/command-phase";
-import { Abilities } from "#enums/abilities";
-import { Moves } from "#enums/moves";
-import { Species } from "#enums/species";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest";
import GameManager from "../utils/gameManager";
+import { Species } from "#enums/species";
+import { Abilities } from "#enums/abilities";
+import { Moves } from "#enums/moves";
+import { Stat } from "#enums/stat";
+import { BerryPhase } from "#app/phases/berry-phase";
+import { CommandPhase } from "#app/phases/command-phase";
const TIMEOUT = 20 * 1000;
@@ -75,7 +75,7 @@ describe("Moves - Wide Guard", () => {
await game.phaseInterceptor.to(BerryPhase, false);
- leadPokemon.forEach(p => expect(p.summonData.battleStats[BattleStat.ATK]).toBe(0));
+ leadPokemon.forEach(p => expect(p.getStatStage(Stat.ATK)).toBe(0));
}, TIMEOUT
);
diff --git a/src/test/reload.test.ts b/src/test/reload.test.ts
new file mode 100644
index 00000000000..0a712fcc7df
--- /dev/null
+++ b/src/test/reload.test.ts
@@ -0,0 +1,137 @@
+import { Species } from "#app/enums/species";
+import { GameModes } from "#app/game-mode";
+import GameManager from "#test/utils/gameManager";
+import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
+import { SPLASH_ONLY } from "./utils/testUtils";
+import { Moves } from "#app/enums/moves";
+import { Biome } from "#app/enums/biome";
+
+describe("Reload", () => {
+ let phaserGame: Phaser.Game;
+ let game: GameManager;
+
+ beforeAll(() => {
+ phaserGame = new Phaser.Game({
+ type: Phaser.HEADLESS,
+ });
+ });
+
+ afterEach(() => {
+ game.phaseInterceptor.restoreOg();
+ });
+
+ beforeEach(() => {
+ game = new GameManager(phaserGame);
+ });
+
+ it("should not have RNG inconsistencies in a Classic run", async () => {
+ await game.classicMode.startBattle();
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies after a biome switch", async () => {
+ game.override
+ .startingWave(10)
+ .startingBiome(Biome.CAVE) // Will lead to biomes with randomly generated weather
+ .battleType("single")
+ .startingLevel(100)
+ .enemyLevel(1000)
+ .disableTrainerWaves()
+ .moveset([Moves.KOWTOW_CLEAVE])
+ .enemyMoveset(SPLASH_ONLY);
+ await game.dailyMode.startBattle();
+
+ // Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch
+ game.move.select(Moves.KOWTOW_CLEAVE);
+ await game.phaseInterceptor.to("DamagePhase");
+ await game.doKillOpponents();
+ await game.toNextWave();
+ expect(game.phaseInterceptor.log).toContain("NewBiomeEncounterPhase");
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies at a Daily run wild Pokemon fight", async () => {
+ await game.dailyMode.startBattle();
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies at a Daily run double battle", async () => {
+ game.override
+ .battleType("double");
+ await game.dailyMode.startBattle();
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies at a Daily run Gym Leader fight", async () => {
+ game.override
+ .battleType("single")
+ .startingWave(40);
+ await game.dailyMode.startBattle();
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies at a Daily run regular trainer fight", async () => {
+ game.override
+ .battleType("single")
+ .startingWave(45);
+ await game.dailyMode.startBattle();
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+
+ it("should not have RNG inconsistencies at a Daily run wave 50 Boss fight", async () => {
+ game.override
+ .battleType("single")
+ .startingWave(50);
+ await game.runToFinalBossEncounter([Species.BULBASAUR], GameModes.DAILY);
+
+ const preReloadRngState = Phaser.Math.RND.state();
+
+ await game.reload.reloadSession();
+
+ const postReloadRngState = Phaser.Math.RND.state();
+
+ expect(preReloadRngState).toBe(postReloadRngState);
+ }, 20000);
+});
diff --git a/src/test/ui/starter-select.test.ts b/src/test/ui/starter-select.test.ts
index 8ef1ea16b4a..6d26ebfd6b3 100644
--- a/src/test/ui/starter-select.test.ts
+++ b/src/test/ui/starter-select.test.ts
@@ -53,9 +53,6 @@ describe("UI - Starter select", () => {
const handler = game.scene.ui.getHandler() as StarterSelectUiHandler;
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
- handler.processInput(Button.CYCLE_SHINY);
- handler.processInput(Button.V);
- handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
});
@@ -117,9 +114,6 @@ describe("UI - Starter select", () => {
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
handler.processInput(Button.CYCLE_GENDER);
- handler.processInput(Button.CYCLE_SHINY);
- handler.processInput(Button.V);
- handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
});
@@ -184,9 +178,6 @@ describe("UI - Starter select", () => {
handler.processInput(Button.CYCLE_GENDER);
handler.processInput(Button.CYCLE_NATURE);
handler.processInput(Button.CYCLE_ABILITY);
- handler.processInput(Button.CYCLE_SHINY);
- handler.processInput(Button.V);
- handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
});
@@ -227,11 +218,12 @@ describe("UI - Starter select", () => {
expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR);
expect(game.scene.getParty()[0].shiny).toBe(true);
expect(game.scene.getParty()[0].variant).toBe(2);
+ expect(game.scene.getParty()[0].gender).toBe(Gender.FEMALE);
expect(game.scene.getParty()[0].nature).toBe(Nature.LONELY);
expect(game.scene.getParty()[0].getAbility().id).toBe(Abilities.CHLOROPHYLL);
}, 20000);
- it("Bulbasaur - shiny - variant 2 female lonely chlorophyl", async() => {
+ it("Bulbasaur - shiny - variant 2 female", async() => {
await game.importData("src/test/utils/saves/everything.prsv");
const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => {
const species = game.scene.gameData.dexData[key];
@@ -249,9 +241,6 @@ describe("UI - Starter select", () => {
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
handler.processInput(Button.CYCLE_GENDER);
- handler.processInput(Button.CYCLE_SHINY);
- handler.processInput(Button.V);
- handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
});
@@ -313,6 +302,7 @@ describe("UI - Starter select", () => {
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
handler.processInput(Button.ACTION);
+ handler.processInput(Button.CYCLE_SHINY);
game.phaseInterceptor.unlock();
});
await game.phaseInterceptor.run(SelectStarterPhase);
@@ -371,7 +361,7 @@ describe("UI - Starter select", () => {
const handler = game.scene.ui.getHandler() as StarterSelectUiHandler;
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
- handler.processInput(Button.CYCLE_SHINY);
+ handler.processInput(Button.V);
handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
@@ -415,7 +405,7 @@ describe("UI - Starter select", () => {
expect(game.scene.getParty()[0].variant).toBe(1);
}, 20000);
- it("Bulbasaur - shiny - variant 2", async() => {
+ it("Bulbasaur - shiny - variant 0", async() => {
await game.importData("src/test/utils/saves/everything.prsv");
const caughtCount = Object.keys(game.scene.gameData.dexData).filter((key) => {
const species = game.scene.gameData.dexData[key];
@@ -432,8 +422,6 @@ describe("UI - Starter select", () => {
const handler = game.scene.ui.getHandler() as StarterSelectUiHandler;
handler.processInput(Button.RIGHT);
handler.processInput(Button.LEFT);
- handler.processInput(Button.CYCLE_SHINY);
- handler.processInput(Button.V);
handler.processInput(Button.V);
handler.processInput(Button.ACTION);
game.phaseInterceptor.unlock();
@@ -474,7 +462,7 @@ describe("UI - Starter select", () => {
expect(game.scene.getParty()[0].species.speciesId).toBe(Species.BULBASAUR);
expect(game.scene.getParty()[0].shiny).toBe(true);
- expect(game.scene.getParty()[0].variant).toBe(2);
+ expect(game.scene.getParty()[0].variant).toBe(0);
}, 20000);
it("Check if first pokemon in party is caterpie from gen 1 and 1rd row, 3rd column", async() => {
diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts
index 6ade758fd6f..f367fc70936 100644
--- a/src/test/utils/gameManager.ts
+++ b/src/test/utils/gameManager.ts
@@ -2,12 +2,16 @@ import { updateUserInfo } from "#app/account";
import { BattlerIndex } from "#app/battle";
import BattleScene from "#app/battle-scene";
import { BattleStyle } from "#app/enums/battle-style";
+import { Moves } from "#app/enums/moves";
+import { getMoveTargets } from "#app/data/move";
import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon";
import Trainer from "#app/field/trainer";
import { GameModes, getGameMode } from "#app/game-mode";
import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type";
+import overrides from "#app/overrides";
import { CommandPhase } from "#app/phases/command-phase";
import { EncounterPhase } from "#app/phases/encounter-phase";
+import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
import { FaintPhase } from "#app/phases/faint-phase";
import { LoginPhase } from "#app/phases/login-phase";
import { MovePhase } from "#app/phases/move-phase";
@@ -40,9 +44,12 @@ import fs from "fs";
import { vi } from "vitest";
import { ClassicModeHelper } from "./helpers/classicModeHelper";
import { DailyModeHelper } from "./helpers/dailyModeHelper";
+import { ChallengeModeHelper } from "./helpers/challengeModeHelper";
import { MoveHelper } from "./helpers/moveHelper";
import { OverridesHelper } from "./helpers/overridesHelper";
import { SettingsHelper } from "./helpers/settingsHelper";
+import { ReloadHelper } from "./helpers/reloadHelper";
+import { CheckSwitchPhase } from "#app/phases/check-switch-phase";
/**
* Class to manage the game state and transitions between phases.
@@ -57,7 +64,9 @@ export default class GameManager {
public readonly move: MoveHelper;
public readonly classicMode: ClassicModeHelper;
public readonly dailyMode: DailyModeHelper;
+ public readonly challengeMode: ChallengeModeHelper;
public readonly settings: SettingsHelper;
+ public readonly reload: ReloadHelper;
/**
* Creates an instance of GameManager.
@@ -77,7 +86,9 @@ export default class GameManager {
this.move = new MoveHelper(this);
this.classicMode = new ClassicModeHelper(this);
this.dailyMode = new DailyModeHelper(this);
+ this.challengeMode = new ChallengeModeHelper(this);
this.settings = new SettingsHelper(this);
+ this.reload = new ReloadHelper(this);
}
/**
@@ -135,7 +146,7 @@ export default class GameManager {
this.scene.hpBarSpeed = 3;
this.scene.enableTutorials = false;
this.scene.gameData.gender = PlayerGender.MALE; // set initial player gender
-
+ this.scene.battleStyle = this.settings.battleStyle;
}
/**
@@ -145,28 +156,26 @@ export default class GameManager {
* @param species
* @param mode
*/
- async runToFinalBossEncounter(game: GameManager, species: Species[], mode: GameModes) {
+ async runToFinalBossEncounter(species: Species[], mode: GameModes) {
console.log("===to final boss encounter===");
- await game.runToTitle();
+ await this.runToTitle();
- game.onNextPrompt("TitlePhase", Mode.TITLE, () => {
- game.scene.gameMode = getGameMode(mode);
- const starters = generateStarter(game.scene, species);
- const selectStarterPhase = new SelectStarterPhase(game.scene);
- game.scene.pushPhase(new EncounterPhase(game.scene, false));
+ this.onNextPrompt("TitlePhase", Mode.TITLE, () => {
+ this.scene.gameMode = getGameMode(mode);
+ const starters = generateStarter(this.scene, species);
+ const selectStarterPhase = new SelectStarterPhase(this.scene);
+ this.scene.pushPhase(new EncounterPhase(this.scene, false));
selectStarterPhase.initBattle(starters);
});
- game.onNextPrompt("EncounterPhase", Mode.MESSAGE, async () => {
- // This will skip all entry dialogue (I can't figure out a way to sequentially handle the 8 chained messages via 1 prompt handler)
- game.setMode(Mode.MESSAGE);
- const encounterPhase = game.scene.getCurrentPhase() as EncounterPhase;
+ // This will consider all battle entry dialog as seens and skip them
+ vi.spyOn(this.scene.ui, "shouldSkipDialogue").mockReturnValue(true);
- // No need to end phase, this will do it for you
- encounterPhase.doEncounterCommon(false);
- });
+ if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) {
+ this.removeEnemyHeldItems();
+ }
- await game.phaseInterceptor.to(EncounterPhase, true);
+ await this.phaseInterceptor.to(EncounterPhase);
console.log("===finished run to final boss encounter===");
}
@@ -229,15 +238,42 @@ export default class GameManager {
this.onNextPrompt("SelectModifierPhase", Mode.MODIFIER_SELECT, () => {
const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
handler.processInput(Button.CANCEL);
- }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase), true);
+ }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase), true);
this.onNextPrompt("SelectModifierPhase", Mode.CONFIRM, () => {
const handler = this.scene.ui.getHandler() as ModifierSelectUiHandler;
handler.processInput(Button.ACTION);
- }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase));
+ }, () => this.isCurrentPhase(CommandPhase) || this.isCurrentPhase(NewBattlePhase) || this.isCurrentPhase(CheckSwitchPhase));
}
- forceOpponentToSwitch() {
+ /**
+ * Forces the next enemy selecting a move to use the given move in its moveset against the
+ * given target (if applicable).
+ * @param moveId {@linkcode Moves} the move the enemy will use
+ * @param target {@linkcode BattlerIndex} the target on which the enemy will use the given move
+ */
+ async forceEnemyMove(moveId: Moves, target?: BattlerIndex) {
+ // Wait for the next EnemyCommandPhase to start
+ await this.phaseInterceptor.to(EnemyCommandPhase, false);
+ const enemy = this.scene.getEnemyField()[(this.scene.getCurrentPhase() as EnemyCommandPhase).getFieldIndex()];
+ const legalTargets = getMoveTargets(enemy, moveId);
+
+ vi.spyOn(enemy, "getNextMove").mockReturnValueOnce({
+ move: moveId,
+ targets: (target && !legalTargets.multiple && legalTargets.targets.includes(target))
+ ? [target]
+ : enemy.getNextTargets(moveId)
+ });
+
+ /**
+ * Run the EnemyCommandPhase to completion.
+ * This allows this function to be called consecutively to
+ * force a move for each enemy in a double battle.
+ */
+ await this.phaseInterceptor.to(EnemyCommandPhase);
+ }
+
+ forceEnemyToSwitch() {
const originalMatchupScore = Trainer.prototype.getPartyMemberMatchupScores;
Trainer.prototype.getPartyMemberMatchupScores = () => {
Trainer.prototype.getPartyMemberMatchupScores = originalMatchupScore;
@@ -378,7 +414,7 @@ export default class GameManager {
}
/**
- * Intercepts `TurnStartPhase` and mocks the getOrder's return value {@linkcode TurnStartPhase.getOrder}
+ * Intercepts `TurnStartPhase` and mocks the getSpeedOrder's return value {@linkcode TurnStartPhase.getSpeedOrder}
* Used to modify the turn order.
* @param {BattlerIndex[]} order The turn order to set
* @example
@@ -389,7 +425,7 @@ export default class GameManager {
async setTurnOrder(order: BattlerIndex[]): Promise {
await this.phaseInterceptor.to(TurnStartPhase, false);
- vi.spyOn(this.scene.getCurrentPhase() as TurnStartPhase, "getOrder").mockReturnValue(order);
+ vi.spyOn(this.scene.getCurrentPhase() as TurnStartPhase, "getSpeedOrder").mockReturnValue(order);
}
/**
diff --git a/src/test/utils/helpers/challengeModeHelper.ts b/src/test/utils/helpers/challengeModeHelper.ts
new file mode 100644
index 00000000000..184f11f505c
--- /dev/null
+++ b/src/test/utils/helpers/challengeModeHelper.ts
@@ -0,0 +1,78 @@
+import { BattleStyle } from "#app/enums/battle-style";
+import { Species } from "#app/enums/species";
+import overrides from "#app/overrides";
+import { EncounterPhase } from "#app/phases/encounter-phase";
+import { SelectStarterPhase } from "#app/phases/select-starter-phase";
+import { Mode } from "#app/ui/ui";
+import { generateStarter } from "../gameManagerUtils";
+import { GameManagerHelper } from "./gameManagerHelper";
+import { Challenge } from "#app/data/challenge";
+import { CommandPhase } from "#app/phases/command-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
+import { Challenges } from "#enums/challenges";
+import { copyChallenge } from "data/challenge";
+
+/**
+ * Helper to handle Challenge mode specifics
+ */
+export class ChallengeModeHelper extends GameManagerHelper {
+
+ challenges: Challenge[] = [];
+
+ /**
+ * Adds a challenge to the challenge mode helper.
+ * @param id - The challenge id.
+ * @param value - The challenge value.
+ * @param severity - The challenge severity.
+ */
+ addChallenge(id: Challenges, value: number, severity: number) {
+ const challenge = copyChallenge({ id, value, severity });
+ this.challenges.push(challenge);
+ }
+
+ /**
+ * Runs the Challenge game to the summon phase.
+ * @param gameMode - Optional game mode to set.
+ * @returns A promise that resolves when the summon phase is reached.
+ */
+ async runToSummon(species?: Species[]) {
+ await this.game.runToTitle();
+
+ this.game.onNextPrompt("TitlePhase", Mode.TITLE, () => {
+ this.game.scene.gameMode.challenges = this.challenges;
+ const starters = generateStarter(this.game.scene, species);
+ const selectStarterPhase = new SelectStarterPhase(this.game.scene);
+ this.game.scene.pushPhase(new EncounterPhase(this.game.scene, false));
+ selectStarterPhase.initBattle(starters);
+ });
+
+ await this.game.phaseInterceptor.run(EncounterPhase);
+ if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) {
+ this.game.removeEnemyHeldItems();
+ }
+ }
+
+ /**
+ * Transitions to the start of a battle.
+ * @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[]) {
+ await this.runToSummon(species);
+
+ if (this.game.scene.battleStyle === BattleStyle.SWITCH) {
+ this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
+ this.game.setMode(Mode.MESSAGE);
+ this.game.endPhase();
+ }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
+
+ this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
+ this.game.setMode(Mode.MESSAGE);
+ this.game.endPhase();
+ }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
+ }
+
+ await this.game.phaseInterceptor.to(CommandPhase);
+ console.log("==================[New Turn]==================");
+ }
+}
diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts
index d5eaee003db..cc5f9018325 100644
--- a/src/test/utils/helpers/overridesHelper.ts
+++ b/src/test/utils/helpers/overridesHelper.ts
@@ -281,6 +281,31 @@ export class OverridesHelper extends GameManagerHelper {
return this;
}
+ /**
+ * Override the items rolled at the end of a battle
+ * @param items the items to be rolled
+ * @returns this
+ */
+ itemRewards(items: ModifierOverride[]) {
+ vi.spyOn(Overrides, "ITEM_REWARD_OVERRIDE", "get").mockReturnValue(items);
+ this.log("Item rewards set to:", items);
+ 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
+ */
+ enemyHealthSegments(healthSegments: number) {
+ vi.spyOn(Overrides, "OPP_HEALTH_SEGMENTS_OVERRIDE", "get").mockReturnValue(healthSegments);
+ this.log("Enemy Pokemon health segments set to:", healthSegments);
+ return this;
+ }
+
private log(...params: any[]) {
console.log("Overrides:", ...params);
}
diff --git a/src/test/utils/helpers/reloadHelper.ts b/src/test/utils/helpers/reloadHelper.ts
new file mode 100644
index 00000000000..c15347b08c9
--- /dev/null
+++ b/src/test/utils/helpers/reloadHelper.ts
@@ -0,0 +1,53 @@
+import { GameManagerHelper } from "./gameManagerHelper";
+import { TitlePhase } from "#app/phases/title-phase";
+import { Mode } from "#app/ui/ui";
+import { vi } from "vitest";
+import { BattleStyle } from "#app/enums/battle-style";
+import { CommandPhase } from "#app/phases/command-phase";
+import { TurnInitPhase } from "#app/phases/turn-init-phase";
+
+/**
+ * Helper to allow reloading sessions in unit tests.
+ */
+export class ReloadHelper extends GameManagerHelper {
+ /**
+ * Simulate reloading the session from the title screen, until reaching the
+ * beginning of the first turn (equivalent to running `startBattle()`) for
+ * the reloaded session.
+ */
+ async reloadSession() : Promise {
+ const scene = this.game.scene;
+ const sessionData = scene.gameData.getSessionSaveData(scene);
+ const titlePhase = new TitlePhase(scene);
+
+ scene.clearPhaseQueue();
+
+ // Set the last saved session to the desired session data
+ vi.spyOn(scene.gameData, "getSession").mockReturnValue(
+ new Promise((resolve, reject) => {
+ resolve(sessionData);
+ })
+ );
+ scene.unshiftPhase(titlePhase);
+ this.game.endPhase(); // End the currently ongoing battle
+
+ titlePhase.loadSaveSlot(-1); // Load the desired session data
+ this.game.phaseInterceptor.shift(); // Loading the save slot also ended TitlePhase, clean it up
+
+ // Run through prompts for switching Pokemon, copied from classicModeHelper.ts
+ if (this.game.scene.battleStyle === BattleStyle.SWITCH) {
+ this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
+ this.game.setMode(Mode.MESSAGE);
+ this.game.endPhase();
+ }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
+
+ this.game.onNextPrompt("CheckSwitchPhase", Mode.CONFIRM, () => {
+ this.game.setMode(Mode.MESSAGE);
+ this.game.endPhase();
+ }, () => this.game.isCurrentPhase(CommandPhase) || this.game.isCurrentPhase(TurnInitPhase));
+ }
+
+ await this.game.phaseInterceptor.to(CommandPhase);
+ console.log("==================[New Turn]==================");
+ }
+}
diff --git a/src/test/utils/helpers/settingsHelper.ts b/src/test/utils/helpers/settingsHelper.ts
index 76ffafdbe10..8fca2a34d47 100644
--- a/src/test/utils/helpers/settingsHelper.ts
+++ b/src/test/utils/helpers/settingsHelper.ts
@@ -1,16 +1,30 @@
import { PlayerGender } from "#app/enums/player-gender";
+import { BattleStyle } from "#app/enums/battle-style";
import { GameManagerHelper } from "./gameManagerHelper";
/**
* Helper to handle settings for tests
*/
export class SettingsHelper extends GameManagerHelper {
+ private _battleStyle: BattleStyle = BattleStyle.SET;
+
+ get battleStyle(): BattleStyle {
+ return this._battleStyle;
+ }
+
+ /**
+ * Change the battle style to Switch or Set mode (tests default to {@linkcode BattleStyle.SET})
+ * @param mode {@linkcode BattleStyle.SWITCH} or {@linkcode BattleStyle.SET}
+ */
+ set battleStyle(mode: BattleStyle.SWITCH | BattleStyle.SET) {
+ this._battleStyle = mode;
+ }
/**
* Disable/Enable type hints settings
* @param enable true to enabled, false to disabled
*/
- typeHints(enable: boolean) {
+ typeHints(enable: boolean): void {
this.game.scene.typeHints = enable;
this.log(`Type Hints ${enable? "enabled" : "disabled"}` );
}
diff --git a/src/test/utils/mocks/mockTextureManager.ts b/src/test/utils/mocks/mockTextureManager.ts
index b26d03441fe..ca8065bef97 100644
--- a/src/test/utils/mocks/mockTextureManager.ts
+++ b/src/test/utils/mocks/mockTextureManager.ts
@@ -7,6 +7,8 @@ import MockSprite from "#test/utils/mocks/mocksContainer/mockSprite";
import MockText from "#test/utils/mocks/mocksContainer/mockText";
import MockTexture from "#test/utils/mocks/mocksContainer/mockTexture";
import { MockGameObject } from "./mockGameObject";
+import { vi } from "vitest";
+import { MockVideoGameObject } from "./mockVideoGameObject";
/**
* Stub class for Phaser.Textures.TextureManager
@@ -34,6 +36,7 @@ export default class MockTextureManager {
text: this.text.bind(this),
bitmapText: this.text.bind(this),
displayList: this.displayList,
+ video: vi.fn(() => new MockVideoGameObject()),
};
}
diff --git a/src/test/utils/mocks/mockVideoGameObject.ts b/src/test/utils/mocks/mockVideoGameObject.ts
new file mode 100644
index 00000000000..96f03542bbc
--- /dev/null
+++ b/src/test/utils/mocks/mockVideoGameObject.ts
@@ -0,0 +1,13 @@
+import { vi } from "vitest";
+import { MockGameObject } from "./mockGameObject";
+
+/** Mocks video-related stuff */
+export class MockVideoGameObject implements MockGameObject {
+ constructor() {}
+
+ public play = vi.fn();
+ public stop = vi.fn(() => this);
+ public setOrigin = vi.fn();
+ public setScale = vi.fn();
+ public setVisible = vi.fn();
+}
diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts
index ca3d55137fa..1141d0bf0d9 100644
--- a/src/test/utils/phaseInterceptor.ts
+++ b/src/test/utils/phaseInterceptor.ts
@@ -1,4 +1,5 @@
import { Phase } from "#app/phase";
+import ErrorInterceptor from "#app/test/utils/errorInterceptor";
import { BattleEndPhase } from "#app/phases/battle-end-phase";
import { BerryPhase } from "#app/phases/berry-phase";
import { CheckSwitchPhase } from "#app/phases/check-switch-phase";
@@ -6,16 +7,19 @@ import { CommandPhase } from "#app/phases/command-phase";
import { DamagePhase } from "#app/phases/damage-phase";
import { EggLapsePhase } from "#app/phases/egg-lapse-phase";
import { EncounterPhase } from "#app/phases/encounter-phase";
+import { EndEvolutionPhase } from "#app/phases/end-evolution-phase";
import { EnemyCommandPhase } from "#app/phases/enemy-command-phase";
+import { EvolutionPhase } from "#app/phases/evolution-phase";
import { FaintPhase } from "#app/phases/faint-phase";
+import { LevelCapPhase } from "#app/phases/level-cap-phase";
import { LoginPhase } from "#app/phases/login-phase";
import { MessagePhase } from "#app/phases/message-phase";
import { MoveEffectPhase } from "#app/phases/move-effect-phase";
import { MoveEndPhase } from "#app/phases/move-end-phase";
import { MovePhase } from "#app/phases/move-phase";
import { NewBattlePhase } from "#app/phases/new-battle-phase";
+import { NewBiomeEncounterPhase } from "#app/phases/new-biome-encounter-phase";
import { NextEncounterPhase } from "#app/phases/next-encounter-phase";
-import { PartyHealPhase } from "#app/phases/party-heal-phase";
import { PostSummonPhase } from "#app/phases/post-summon-phase";
import { QuietFormChangePhase } from "#app/phases/quiet-form-change-phase";
import { SelectGenderPhase } from "#app/phases/select-gender-phase";
@@ -24,7 +28,7 @@ import { SelectStarterPhase } from "#app/phases/select-starter-phase";
import { SelectTargetPhase } from "#app/phases/select-target-phase";
import { ShinySparklePhase } from "#app/phases/shiny-sparkle-phase";
import { ShowAbilityPhase } from "#app/phases/show-ability-phase";
-import { StatChangePhase } from "#app/phases/stat-change-phase";
+import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
import { SummonPhase } from "#app/phases/summon-phase";
import { SwitchPhase } from "#app/phases/switch-phase";
import { SwitchSummonPhase } from "#app/phases/switch-summon-phase";
@@ -35,7 +39,7 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase";
import { TurnStartPhase } from "#app/phases/turn-start-phase";
import { UnavailablePhase } from "#app/phases/unavailable-phase";
import { VictoryPhase } from "#app/phases/victory-phase";
-import ErrorInterceptor from "#app/test/utils/errorInterceptor";
+import { PartyHealPhase } from "#app/phases/party-heal-phase";
import UI, { Mode } from "#app/ui/ui";
export default class PhaseInterceptor {
@@ -60,6 +64,7 @@ export default class PhaseInterceptor {
[TitlePhase, this.startPhase],
[SelectGenderPhase, this.startPhase],
[EncounterPhase, this.startPhase],
+ [NewBiomeEncounterPhase, this.startPhase],
[SelectStarterPhase, this.startPhase],
[PostSummonPhase, this.startPhase],
[SummonPhase, this.startPhase],
@@ -84,7 +89,7 @@ export default class PhaseInterceptor {
[NewBattlePhase, this.startPhase],
[VictoryPhase, this.startPhase],
[MoveEndPhase, this.startPhase],
- [StatChangePhase, this.startPhase],
+ [StatStageChangePhase, this.startPhase],
[ShinySparklePhase, this.startPhase],
[SelectTargetPhase, this.startPhase],
[UnavailablePhase, this.startPhase],
@@ -92,6 +97,9 @@ export default class PhaseInterceptor {
[SwitchPhase, this.startPhase],
[SwitchSummonPhase, this.startPhase],
[PartyHealPhase, this.startPhase],
+ [EvolutionPhase, this.startPhase],
+ [EndEvolutionPhase, this.startPhase],
+ [LevelCapPhase, this.startPhase],
];
private endBySetMode = [
@@ -233,6 +241,22 @@ export default class PhaseInterceptor {
this.scene.shiftPhase();
}
+ /**
+ * Remove the current phase from the phase interceptor.
+ *
+ * Do not call this unless absolutely necessary. This function is intended
+ * for cleaning up the phase interceptor when, for whatever reason, a phase
+ * is manually ended without using the phase interceptor.
+ *
+ * @param shouldRun Whether or not the current scene should also be run.
+ */
+ shift(shouldRun: boolean = false) : void {
+ this.onHold.shift();
+ if (shouldRun) {
+ this.scene.shiftPhase();
+ }
+ }
+
/**
* Method to initialize phases and their corresponding methods.
*/
diff --git a/src/timed-event-manager.ts b/src/timed-event-manager.ts
index 18de67bfa86..874bf6a8b46 100644
--- a/src/timed-event-manager.ts
+++ b/src/timed-event-manager.ts
@@ -1,35 +1,39 @@
-import BattleScene from "#app/battle-scene.js";
-import { TextStyle, addTextObject } from "#app/ui/text.js";
+import BattleScene from "#app/battle-scene";
+import { TextStyle, addTextObject } from "#app/ui/text";
+import i18next from "i18next";
export enum EventType {
- SHINY
+ SHINY,
+ GENERIC
}
-interface TimedEvent {
- name: string;
- eventType: EventType;
- shinyMultiplier?: number;
- startDate: Date;
- endDate: Date;
- bannerFilename?: string
+interface EventBanner {
+ bannerKey?: string;
+ xPosition?: number;
+ yPosition?: number;
+ scale?: number;
+ availableLangs?: string[];
+}
+
+interface TimedEvent extends EventBanner {
+ name: string;
+ eventType: EventType;
+ shinyMultiplier?: number;
+ startDate: Date;
+ endDate: Date;
}
const timedEvents: TimedEvent[] = [
{
- name: "Pride Update",
- eventType: EventType.SHINY,
- shinyMultiplier: 2,
- startDate: new Date(Date.UTC(2024, 5, 14, 0)),
- endDate: new Date(Date.UTC(2024, 5, 23, 0)),
- bannerFilename: "pride-update"
- },
- {
- name: "August Variant Update",
- eventType: EventType.SHINY,
- shinyMultiplier: 2,
- startDate: new Date(Date.UTC(2024, 7, 16, 0)),
- endDate: new Date(Date.UTC(2024, 7, 22, 0)),
- bannerFilename: "august-variant-update"
+ name: "September Update",
+ eventType: EventType.GENERIC,
+ startDate: new Date(Date.UTC(2024, 7, 28, 0)),
+ endDate: new Date(Date.UTC(2024, 8, 15, 0)),
+ bannerKey: "september-update",
+ xPosition: 19,
+ yPosition: 115,
+ scale: 0.30,
+ availableLangs: ["en", "de", "it", "fr", "ja", "ko", "es", "pt-BR", "zh-CN"]
}
];
@@ -67,7 +71,7 @@ export class TimedEventManager {
}
getEventBannerFilename(): string {
- return timedEvents.find((te: TimedEvent) => this.isActive(te))?.bannerFilename!; // TODO: is this bang correct?
+ return timedEvents.find((te: TimedEvent) => this.isActive(te))?.bannerKey!; // TODO: is this bang correct?
}
}
@@ -85,38 +89,37 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container {
}
setup() {
- console.log(this.event?.bannerFilename);
- this.banner = new Phaser.GameObjects.Image(this.scene, 29, 64, this.event!.bannerFilename!); // TODO: are the bangs correct here?
- this.banner.setName("img-event-banner");
- this.banner.setOrigin(0.08, -0.35);
- this.banner.setScale(0.18);
- // this.bannerShadow = new Phaser.GameObjects.Rectangle(
- // this.scene,
- // this.banner.x - 2,
- // this.banner.y + 2,
- // this.banner.width,
- // this.banner.height,
- // 0x484848
- // );
- // this.bannerShadow.setName("rect-event-banner-shadow");
- // this.bannerShadow.setScale(0.07);
- // this.bannerShadow.setAlpha(0.5);
- // this.bannerShadow.setOrigin(0,0);
- this.eventTimerText = addTextObject(
- this.scene,
- this.banner.x + 8,
- this.banner.y + 100,
- this.timeToGo(this.event!.endDate), // TODO: is the bang correct here?
- TextStyle.WINDOW
- );
- this.eventTimerText.setName("text-event-timer");
- this.eventTimerText.setScale(0.15);
- this.eventTimerText.setOrigin(0, 0);
+ 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;
+ } else {
+ key += "-en";
+ }
+ }
+ console.log(this.event.bannerKey);
+ this.banner = new Phaser.GameObjects.Image(this.scene, this.event.xPosition ?? 29, this.event.yPosition ?? 64, key);
+ this.banner.setName("img-event-banner");
+ this.banner.setOrigin(0.08, -0.35);
+ this.banner.setScale(this.event.scale ?? 0.18);
+ if (this.event.eventType !== EventType.GENERIC) {
+ this.eventTimerText = addTextObject(
+ this.scene,
+ this.banner.x + 8,
+ this.banner.y + 100,
+ this.timeToGo(this.event.endDate),
+ TextStyle.WINDOW
+ );
+ this.eventTimerText.setName("text-event-timer");
+ this.eventTimerText.setScale(0.15);
+ this.eventTimerText.setOrigin(0, 0);
- this.add([
- this.eventTimerText,
- // this.bannerShadow,
- this.banner]);
+ this.add(this.eventTimerText);
+ }
+ this.add(this.banner);
+ }
}
show() {
@@ -157,6 +160,8 @@ export class TimedEventDisplay extends Phaser.GameObjects.Container {
}
updateCountdown() {
- this.eventTimerText.setText(this.timeToGo(this.event!.endDate)); // TODO: is the bang correct here?
+ if (this.event && this.event.eventType !== EventType.GENERIC) {
+ this.eventTimerText.setText(this.timeToGo(this.event.endDate));
+ }
}
}
diff --git a/src/ui/abstact-option-select-ui-handler.ts b/src/ui/abstact-option-select-ui-handler.ts
index 5172075da52..c6abecda4c0 100644
--- a/src/ui/abstact-option-select-ui-handler.ts
+++ b/src/ui/abstact-option-select-ui-handler.ts
@@ -77,7 +77,21 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
}
protected setupOptions() {
- const options = this.config?.options || [];
+ const configOptions = this.config?.options ?? [];
+
+ let options: OptionSelectItem[];
+
+ // for performance reasons, this limits how many options we can see at once. Without this, it would try to make text options for every single options
+ // which makes the performance take a hit. If there's not enough options to do this (set to 10 at the moment) and the ui mode !== Mode.AUTO_COMPLETE,
+ // this is ignored and the original code is untouched, with the options array being all the options from the config
+ if (configOptions.length >= 10 && this.scene.ui.getMode() === Mode.AUTO_COMPLETE) {
+ const optionsScrollTotal = configOptions.length;
+ const optionStartIndex = this.scrollCursor;
+ const optionEndIndex = Math.min(optionsScrollTotal, optionStartIndex + (!optionStartIndex || this.scrollCursor + (this.config?.maxOptions! - 1) >= optionsScrollTotal ? this.config?.maxOptions! - 1 : this.config?.maxOptions! - 2));
+ options = configOptions.slice(optionStartIndex, optionEndIndex + 2);
+ } else {
+ options = configOptions;
+ }
if (this.optionSelectText) {
this.optionSelectText.destroy();
@@ -192,6 +206,19 @@ export default abstract class AbstractOptionSelectUiHandler extends UiHandler {
} else {
ui.playError();
}
+ } else if (button === Button.SUBMIT && ui.getMode() === Mode.AUTO_COMPLETE) {
+ // this is here to differentiate between a Button.SUBMIT vs Button.ACTION within the autocomplete handler
+ // this is here because Button.ACTION is picked up as z on the keyboard, meaning if you're typing and hit z, it'll select the option you've chosen
+ success = true;
+ const option = this.config?.options[this.cursor + (this.scrollCursor - (this.scrollCursor ? 1 : 0))];
+ if (option?.handler()) {
+ if (!option.keepOpen) {
+ this.clear();
+ }
+ playSound = !option.overrideSound;
+ } else {
+ ui.playError();
+ }
} else {
switch (button) {
case Button.UP:
diff --git a/src/ui/achvs-ui-handler.ts b/src/ui/achvs-ui-handler.ts
index eb4316dc24b..605b8c538a9 100644
--- a/src/ui/achvs-ui-handler.ts
+++ b/src/ui/achvs-ui-handler.ts
@@ -74,7 +74,7 @@ export default class AchvsUiHandler extends MessageUiHandler {
this.headerText = addTextObject(this.scene, 0, 0, "", TextStyle.SETTINGS_LABEL);
this.headerText.setOrigin(0, 0);
this.headerText.setPositionRelative(this.headerBg, 8, 4);
- this.headerActionButton = new Phaser.GameObjects.Sprite(this.scene, 0, 0, "keyboard", "SPACE.png");
+ this.headerActionButton = new Phaser.GameObjects.Sprite(this.scene, 0, 0, "keyboard", "ACTION.png");
this.headerActionButton.setOrigin(0, 0);
this.headerActionButton.setPositionRelative(this.headerBg, 236, 6);
this.headerActionText = addTextObject(this.scene, 0, 0, "", TextStyle.WINDOW, {fontSize:"60px"});
diff --git a/src/ui/admin-ui-handler.ts b/src/ui/admin-ui-handler.ts
index 371604c00a2..5c91a36ab64 100644
--- a/src/ui/admin-ui-handler.ts
+++ b/src/ui/admin-ui-handler.ts
@@ -64,12 +64,15 @@ export default class AdminUiHandler extends FormModalUiHandler {
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) {
- return response.text();
+ console.error(response);
}
- return response.json();
+ this.inputs[0].setText("");
+ this.inputs[1].setText("");
+ this.scene.ui.revertMode();
})
- .then(response => {
- this.scene.ui.setMode(Mode.ADMIN, config);
+ .catch((err) => {
+ console.error(err);
+ this.scene.ui.revertMode();
});
return false;
};
diff --git a/src/ui/autocomplete-ui-handler.ts b/src/ui/autocomplete-ui-handler.ts
new file mode 100644
index 00000000000..480a3cf72d0
--- /dev/null
+++ b/src/ui/autocomplete-ui-handler.ts
@@ -0,0 +1,45 @@
+import { Button } from "#enums/buttons";
+import BattleScene from "../battle-scene";
+import AbstractOptionSelectUiHandler from "./abstact-option-select-ui-handler";
+import { Mode } from "./ui";
+
+export default class AutoCompleteUiHandler extends AbstractOptionSelectUiHandler {
+ modalContainer: Phaser.GameObjects.Container;
+ constructor(scene: BattleScene, mode: Mode = Mode.OPTION_SELECT) {
+ super(scene, mode);
+ }
+
+ getWindowWidth(): integer {
+ return 64;
+ }
+
+ show(args: any[]): boolean {
+ if (args[0].modalContainer) {
+ const { modalContainer } = args[0];
+ const show = super.show(args);
+ this.modalContainer = modalContainer;
+ this.setupOptions();
+
+ return show;
+ }
+ return false;
+ }
+
+ protected setupOptions() {
+ super.setupOptions();
+ if (this.modalContainer) {
+ this.optionSelectContainer.setSize(this.optionSelectContainer.height, Math.max(this.optionSelectText.displayWidth + 24, this.getWindowWidth()));
+ this.optionSelectContainer.setPositionRelative(this.modalContainer, this.optionSelectBg.width, this.optionSelectBg.height + 50);
+ }
+ }
+
+ processInput(button: Button): boolean {
+ // the cancel and action button are here because if you're typing, x and z are used for cancel/action. This means you could be typing something and accidentally cancel/select when you don't mean to
+ // the submit button is therefore used to select a choice (the enter button), though this does not work on my local dev testing for phones, as for my phone/keyboard combo, the enter and z key are both
+ // bound to Button.ACTION, which makes this not work on mobile
+ if (button !== Button.CANCEL && button !== Button.ACTION) {
+ return super.processInput(button);
+ }
+ return false;
+ }
+}
diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts
index 11b807e8ab7..05c634609f8 100644
--- a/src/ui/battle-info.ts
+++ b/src/ui/battle-info.ts
@@ -7,7 +7,7 @@ import { StatusEffect } from "../data/status-effect";
import BattleScene from "../battle-scene";
import { Type, getTypeRgb } from "../data/type";
import { getVariantTint } from "#app/data/variant";
-import { BattleStat } from "#app/data/battle-stat";
+import { Stat } from "#enums/stat";
import BattleFlyout from "./battle-flyout";
import { WindowVariant, addWindow } from "./ui-theme";
import i18next from "i18next";
@@ -30,7 +30,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
private lastLevelExp: integer;
private lastLevel: integer;
private lastLevelCapped: boolean;
- private lastBattleStats: string;
+ private lastStats: string;
private box: Phaser.GameObjects.Sprite;
private nameText: Phaser.GameObjects.Text;
@@ -68,9 +68,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
public flyoutMenu?: BattleFlyout;
- private battleStatOrder: BattleStat[];
- private battleStatOrderPlayer = [BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD];
- private battleStatOrderEnemy = [BattleStat.HP, BattleStat.ATK, BattleStat.DEF, BattleStat.SPATK, BattleStat.SPDEF, BattleStat.ACC, BattleStat.EVA, BattleStat.SPD];
+ private statOrder: Stat[];
+ private readonly statOrderPlayer = [ Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ];
+ private readonly statOrderEnemy = [ Stat.HP, Stat.ATK, Stat.DEF, Stat.SPATK, Stat.SPDEF, Stat.ACC, Stat.EVA, Stat.SPD ];
constructor(scene: Phaser.Scene, x: number, y: number, player: boolean) {
super(scene, x, y);
@@ -229,9 +229,9 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
const startingX = this.player ? -this.statsBox.width + 8 : -this.statsBox.width + 5;
const paddingX = this.player ? 4 : 2;
const statOverflow = this.player ? 1 : 0;
- this.battleStatOrder = this.player ? this.battleStatOrderPlayer : this.battleStatOrderEnemy; // this tells us whether or not to use the player or enemy battle stat order
+ this.statOrder = this.player ? this.statOrderPlayer : this.statOrderEnemy; // this tells us whether or not to use the player or enemy battle stat order
- this.battleStatOrder.map((s, i) => {
+ this.statOrder.map((s, i) => {
// we do a check for i > statOverflow to see when the stat labels go onto the next column
// For enemies, we have HP (i=0) by itself then a new column, so we check for i > 0
// For players, we don't have HP, so we start with i = 0 and i = 1 for our first column, and so need to check for i > 1
@@ -239,25 +239,25 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
const baseY = -this.statsBox.height / 2 + 4; // this is the baseline for the y-axis
let statY: number; // this will be the y-axis placement for the labels
- if (this.battleStatOrder[i] === BattleStat.SPD || this.battleStatOrder[i] === BattleStat.HP) {
+ if (this.statOrder[i] === Stat.SPD || this.statOrder[i] === Stat.HP) {
statY = baseY + 5;
} else {
statY = baseY + (!!(i % 2) === this.player ? 10 : 0); // we compare i % 2 against this.player to tell us where to place the label; because this.battleStatOrder for enemies has HP, this.battleStatOrder[1]=ATK, but for players this.battleStatOrder[0]=ATK, so this comparing i % 2 to this.player fixes this issue for us
}
- const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", BattleStat[s]);
+ const statLabel = this.scene.add.sprite(statX, statY, "pbinfo_stat", Stat[s]);
statLabel.setName("icon_stat_label_" + i.toString());
statLabel.setOrigin(0, 0);
statLabels.push(statLabel);
this.statValuesContainer.add(statLabel);
- const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", this.battleStatOrder[i] !== BattleStat.HP ? "3" : "empty");
+ const statNumber = this.scene.add.sprite(statX + statLabel.width, statY, "pbinfo_stat_numbers", this.statOrder[i] !== Stat.HP ? "3" : "empty");
statNumber.setName("icon_stat_number_" + i.toString());
statNumber.setOrigin(0, 0);
this.statNumbers.push(statNumber);
this.statValuesContainer.add(statNumber);
- if (this.battleStatOrder[i] === BattleStat.HP) {
+ if (this.statOrder[i] === Stat.HP) {
statLabel.setVisible(false);
statNumber.setVisible(false);
}
@@ -433,10 +433,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.statValuesContainer.setPosition(8, 7);
}
- const battleStats = this.battleStatOrder.map(() => 0);
+ const stats = this.statOrder.map(() => 0);
- this.lastBattleStats = battleStats.join("");
- this.updateBattleStats(battleStats);
+ this.lastStats = stats.join("");
+ this.updateStats(stats);
}
getTextureName(): string {
@@ -650,14 +650,12 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
this.lastLevel = pokemon.level;
}
- const battleStats = pokemon.summonData
- ? pokemon.summonData.battleStats
- : this.battleStatOrder.map(() => 0);
- const battleStatsStr = battleStats.join("");
+ const stats = pokemon.getStatStages();
+ const statsStr = stats.join("");
- if (this.lastBattleStats !== battleStatsStr) {
- this.updateBattleStats(battleStats);
- this.lastBattleStats = battleStatsStr;
+ if (this.lastStats !== statsStr) {
+ this.updateStats(stats);
+ this.lastStats = statsStr;
}
this.shinyIcon.setVisible(pokemon.isShiny());
@@ -769,10 +767,10 @@ export default class BattleInfo extends Phaser.GameObjects.Container {
}
}
- updateBattleStats(battleStats: integer[]): void {
- this.battleStatOrder.map((s, i) => {
- if (s !== BattleStat.HP) {
- this.statNumbers[i].setFrame(battleStats[s].toString());
+ updateStats(stats: integer[]): void {
+ this.statOrder.map((s, i) => {
+ if (s !== Stat.HP) {
+ this.statNumbers[i].setFrame(stats[s - 1].toString());
}
});
}
diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts
index 189305ce4c1..3bea0f21433 100644
--- a/src/ui/battle-message-ui-handler.ts
+++ b/src/ui/battle-message-ui-handler.ts
@@ -1,13 +1,12 @@
import BattleScene from "../battle-scene";
import { addBBCodeTextObject, addTextObject, getTextColor, TextStyle } from "./text";
import { Mode } from "./ui";
-import * as Utils from "../utils";
import MessageUiHandler from "./message-ui-handler";
-import { getStatName, Stat } from "../data/pokemon-stat";
import { addWindow } from "./ui-theme";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
import {Button} from "#enums/buttons";
import i18next from "i18next";
+import { Stat, PERMANENT_STATS, getStatKey } from "#app/enums/stat";
export default class BattleMessageUiHandler extends MessageUiHandler {
private levelUpStatsContainer: Phaser.GameObjects.Container;
@@ -21,6 +20,8 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
public movesWindowContainer: Phaser.GameObjects.Container;
public nameBoxContainer: Phaser.GameObjects.Container;
+ public readonly wordWrapWidth: number = 1780;
+
constructor(scene: BattleScene) {
super(scene, Mode.MESSAGE);
}
@@ -63,7 +64,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
const message = addTextObject(this.scene, 0, 0, "", TextStyle.MESSAGE, {
maxLines: 2,
wordWrap: {
- width: 1780
+ width: this.wordWrapWidth
}
});
messageContainer.add(message);
@@ -98,9 +99,8 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 });
let levelUpStatsLabelText = "";
- const stats = Utils.getEnumValues(Stat);
- for (const s of stats) {
- levelUpStatsLabelText += `${getStatName(s)}\n`;
+ for (const s of PERMANENT_STATS) {
+ levelUpStatsLabelText += `${i18next.t(getStatKey(s))}\n`;
}
levelUpStatsLabelsContent.text = levelUpStatsLabelText;
levelUpStatsLabelsContent.x -= levelUpStatsLabelsContent.displayWidth;
@@ -129,7 +129,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
this.commandWindow.setVisible(false);
this.movesWindowContainer.setVisible(false);
- this.message.setWordWrapWidth(1780);
+ this.message.setWordWrapWidth(this.wordWrapWidth);
return true;
}
@@ -161,7 +161,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
}
showDialogue(text: string, name?: string, delay?: integer | null, callback?: Function, callbackDelay?: integer, prompt?: boolean, promptDelay?: integer) {
- name && this.showNameText(name);
+ if (name) {
+ this.showNameText(name);
+ }
super.showDialogue(text, name, delay, callback, callbackDelay, prompt, promptDelay);
}
@@ -172,8 +174,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
}
const newStats = (this.scene as BattleScene).getParty()[partyMemberIndex].stats;
let levelUpStatsValuesText = "";
- const stats = Utils.getEnumValues(Stat);
- for (const s of stats) {
+ for (const s of PERMANENT_STATS) {
levelUpStatsValuesText += `${showTotals ? newStats[s] : newStats[s] - prevStats[s]}\n`;
}
this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
@@ -195,10 +196,9 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
return new Promise(resolve => {
this.scene.executeWithSeedOffset(() => {
let levelUpStatsValuesText = "";
- const stats = Utils.getEnumValues(Stat);
const shownStats = this.getTopIvs(ivs, shownIvsCount);
- for (const s of stats) {
- levelUpStatsValuesText += `${shownStats.indexOf(s) > -1 ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`;
+ for (const s of PERMANENT_STATS) {
+ levelUpStatsValuesText += `${shownStats.includes(s) ? this.getIvDescriptor(ivs[s], s, pokemonId) : "???"}\n`;
}
this.levelUpStatsValuesContent.text = levelUpStatsValuesText;
this.levelUpStatsIncrContent.setVisible(false);
@@ -213,26 +213,16 @@ export default class BattleMessageUiHandler extends MessageUiHandler {
}
getTopIvs(ivs: integer[], shownIvsCount: integer): Stat[] {
- const stats = Utils.getEnumValues(Stat);
let shownStats: Stat[] = [];
if (shownIvsCount < 6) {
- const statsPool = stats.slice(0);
+ const statsPool = PERMANENT_STATS.slice();
+ // Sort the stats from highest to lowest iv
+ statsPool.sort((s1, s2) => ivs[s2] - ivs[s1]);
for (let i = 0; i < shownIvsCount; i++) {
- let shownStat: Stat | null = null;
- let highestIv = -1;
- statsPool.map(s => {
- if (ivs[s] > highestIv) {
- shownStat = s as Stat;
- highestIv = ivs[s];
- }
- });
- if (shownStat !== null && shownStat !== undefined) {
- shownStats.push(shownStat);
- statsPool.splice(statsPool.indexOf(shownStat), 1);
- }
+ shownStats.push(statsPool[i]);
}
} else {
- shownStats = stats;
+ shownStats = PERMANENT_STATS.slice();
}
return shownStats;
}
diff --git a/src/ui/challenges-select-ui-handler.ts b/src/ui/challenges-select-ui-handler.ts
index f1ba0da6c51..e08736d2b70 100644
--- a/src/ui/challenges-select-ui-handler.ts
+++ b/src/ui/challenges-select-ui-handler.ts
@@ -5,13 +5,13 @@ import UiHandler from "./ui-handler";
import { addWindow } from "./ui-theme";
import {Button} from "#enums/buttons";
import i18next from "i18next";
-import { Challenge } from "#app/data/challenge.js";
+import { Challenge } from "#app/data/challenge";
import * as Utils from "../utils";
-import { Challenges } from "#app/enums/challenges.js";
+import { Challenges } from "#app/enums/challenges";
import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext";
-import { Color, ShadowColor } from "#app/enums/color.js";
-import { SelectStarterPhase } from "#app/phases/select-starter-phase.js";
-import { TitlePhase } from "#app/phases/title-phase.js";
+import { Color, ShadowColor } from "#app/enums/color";
+import { SelectStarterPhase } from "#app/phases/select-starter-phase";
+import { TitlePhase } from "#app/phases/title-phase";
/**
* Handles all the UI for choosing optional challenges.
@@ -33,7 +33,10 @@ export default class GameChallengesUiHandler extends UiHandler {
private cursorObj: Phaser.GameObjects.NineSlice | null;
+ private startBg: Phaser.GameObjects.NineSlice;
private startCursor: Phaser.GameObjects.NineSlice;
+ private startText: Phaser.GameObjects.Text;
+ private hasSelectedChallenge: boolean;
private optionsWidth: number;
@@ -104,20 +107,20 @@ export default class GameChallengesUiHandler extends UiHandler {
this.descriptionText.setShadow(4, 5, ShadowColor.ORANGE);
this.descriptionText.setOrigin(0, 0);
- const startBg = addWindow(this.scene, 0, 0, descriptionBg.width, 24);
- startBg.setName("window-start-bg");
- startBg.setOrigin(0, 0);
- startBg.setPositionRelative(descriptionBg, 0, descriptionBg.height);
+ this.startBg = addWindow(this.scene, 0, 0, descriptionBg.width, 24);
+ this.startBg.setName("window-start-bg");
+ this.startBg.setOrigin(0, 0);
+ this.startBg.setPositionRelative(descriptionBg, 0, descriptionBg.height);
- const startText = addTextObject(this.scene, 0, 0, i18next.t("common:start"), TextStyle.SETTINGS_LABEL);
- startText.setName("text-start");
- startText.setOrigin(0, 0);
- startText.setPositionRelative(startBg, (startBg.width - startText.displayWidth) / 2, 4);
+ this.startText = addTextObject(this.scene, 0, 0, i18next.t("challenges:noneSelected"), TextStyle.SETTINGS_LABEL);
+ this.startText.setName("text-start");
+ this.startText.setOrigin(0, 0);
+ this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4);
this.startCursor = this.scene.add.nineslice(0, 0, "summary_moves_cursor", undefined, descriptionBg.width - 8, 16, 1, 1, 1, 1);
this.startCursor.setName("9s-start-cursor");
this.startCursor.setOrigin(0, 0);
- this.startCursor.setPositionRelative(startBg, 4, 3);
+ this.startCursor.setPositionRelative(this.startBg, 4, 3);
this.startCursor.setVisible(false);
this.valuesContainer = this.scene.add.container(0, 0);
@@ -157,8 +160,8 @@ export default class GameChallengesUiHandler extends UiHandler {
this.challengesContainer.add(this.optionsBg);
this.challengesContainer.add(descriptionBg);
this.challengesContainer.add(this.descriptionText);
- this.challengesContainer.add(startBg);
- this.challengesContainer.add(startText);
+ this.challengesContainer.add(this.startBg);
+ this.challengesContainer.add(this.startText);
this.challengesContainer.add(this.startCursor);
this.challengesContainer.add(this.valuesContainer);
@@ -216,6 +219,21 @@ export default class GameChallengesUiHandler extends UiHandler {
this.monoTypeValue.setVisible(false);
}
+ // This checks if a challenge has been selected by the user and updates the text/its opacity accordingly.
+ this.hasSelectedChallenge = this.scene.gameMode.challenges.some(c => c.value !== 0);
+ if (this.hasSelectedChallenge) {
+
+ this.startText.setText(i18next.t("common:start"));
+ this.startText.setAlpha(1);
+ this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4);
+ } else {
+
+ this.startText.setText(i18next.t("challenges:noneSelected"));
+ this.startText.setAlpha(0.5);
+ this.startText.setPositionRelative(this.startBg, (this.startBg.width - this.startText.displayWidth) / 2, 4);
+ }
+ this.challengesContainer.update();
+
// const totalDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getDifficulty(), 0);
// const totalMinDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getMinDifficulty(), 0);
// this.difficultyText.text = `${totalDifficulty}` + (totalMinDifficulty ? `/${totalMinDifficulty}` : "");
@@ -227,6 +245,8 @@ export default class GameChallengesUiHandler extends UiHandler {
this.startCursor.setVisible(false);
this.challengesContainer.setVisible(true);
+ // Should always be false at the start
+ this.hasSelectedChallenge = this.scene.gameMode.challenges.some(c => c.value !== 0);
this.setCursor(0);
this.initLabels();
@@ -257,6 +277,7 @@ export default class GameChallengesUiHandler extends UiHandler {
if (button === Button.CANCEL) {
if (this.startCursor.visible) {
+ // If the user presses cancel when the start cursor has been activated, the game deactivates the start cursor and allows typical challenge selection behavior
this.startCursor.setVisible(false);
this.cursorObj?.setVisible(true);
} else {
@@ -266,83 +287,82 @@ export default class GameChallengesUiHandler extends UiHandler {
}
success = true;
} else if (button === Button.SUBMIT || button === Button.ACTION) {
- if (this.startCursor.visible) {
- const totalDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getDifficulty(), 0);
- const totalMinDifficulty = this.scene.gameMode.challenges.reduce((v, c) => v + c.getMinDifficulty(), 0);
- if (totalDifficulty >= totalMinDifficulty) {
+ if (this.hasSelectedChallenge) {
+ if (this.startCursor.visible) {
this.scene.unshiftPhase(new SelectStarterPhase(this.scene));
this.scene.getCurrentPhase()?.end();
- success = true;
} else {
- success = false;
+ this.startCursor.setVisible(true);
+ this.cursorObj?.setVisible(false);
}
- } else {
- this.startCursor.setVisible(true);
- this.cursorObj?.setVisible(false);
success = true;
+ } else {
+ success = false;
}
} else {
- switch (button) {
- 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
- // 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);
+ if (this.cursorObj?.visible && !this.startCursor.visible) {
+ switch (button) {
+ 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
+ // 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);
+ }
+ } 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) {
- // When at the bottom and pressing DOWN, scroll if possible.
- success = this.setScrollCursor(this.scrollCursor + 1);
+ 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 {
+ // 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) {
+ // When at the bottom of a non-scrolling menu and pressing DOWN, move to the topmost item.
+ success = this.setCursor(0);
} 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
+ success = this.setCursor(this.cursor + 1);
}
- } 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:
+ // Moves the option cursor left, if possible.
+ 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;
}
- 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:
- // Moves the option cursor right, if possible.
- success = this.getActiveChallenge().increaseValue();
- if (success) {
- this.updateText();
- }
- break;
}
}
@@ -350,7 +370,6 @@ export default class GameChallengesUiHandler extends UiHandler {
if (success) {
ui.playSelect();
}
-
return success;
}
diff --git a/src/ui/command-ui-handler.ts b/src/ui/command-ui-handler.ts
index b22ea5d20fc..27ff923e9a3 100644
--- a/src/ui/command-ui-handler.ts
+++ b/src/ui/command-ui-handler.ts
@@ -68,7 +68,11 @@ export default class CommandUiHandler extends UiHandler {
messageHandler.movesWindowContainer.setVisible(false);
messageHandler.message.setWordWrapWidth(1110);
messageHandler.showText(i18next.t("commandUiHandler:actionMessage", {pokemonName: getPokemonNameWithAffix(commandPhase.getPokemon())}), 0);
- this.setCursor(this.getCursor());
+ if (this.getCursor() === Command.POKEMON) {
+ this.setCursor(Command.FIGHT);
+ } else {
+ this.setCursor(this.getCursor());
+ }
return true;
}
@@ -85,7 +89,7 @@ export default class CommandUiHandler extends UiHandler {
if (button === Button.ACTION) {
switch (cursor) {
// Fight
- case 0:
+ case Command.FIGHT:
if ((this.scene.getCurrentPhase() as CommandPhase).checkFightOverride()) {
return true;
}
@@ -93,17 +97,17 @@ export default class CommandUiHandler extends UiHandler {
success = true;
break;
// Ball
- case 1:
+ case Command.BALL:
ui.setModeWithoutClear(Mode.BALL);
success = true;
break;
// Pokemon
- case 2:
+ case Command.POKEMON:
ui.setMode(Mode.PARTY, PartyUiMode.SWITCH, (this.scene.getCurrentPhase() as CommandPhase).getPokemon().getFieldIndex(), null, PartyUiHandler.FilterNonFainted);
success = true;
break;
// Run
- case 3:
+ case Command.RUN:
(this.scene.getCurrentPhase() as CommandPhase).handleCommand(Command.RUN, 0);
success = true;
break;
diff --git a/src/ui/dropdown.ts b/src/ui/dropdown.ts
index 1fef7259108..08d55b03cdb 100644
--- a/src/ui/dropdown.ts
+++ b/src/ui/dropdown.ts
@@ -23,6 +23,14 @@ export enum SortDirection {
DESC = 1
}
+export enum SortCriteria {
+ NUMBER = 0,
+ COST = 1,
+ CANDY = 2,
+ IV = 3,
+ NAME = 4
+}
+
export class DropDownLabel {
public state: DropDownState;
public text: string;
diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts
new file mode 100644
index 00000000000..af82ab33438
--- /dev/null
+++ b/src/ui/egg-summary-ui-handler.ts
@@ -0,0 +1,320 @@
+import BattleScene from "../battle-scene";
+import { Mode } from "./ui";
+import PokemonIconAnimHandler, { PokemonIconAnimMode } from "./pokemon-icon-anim-handler";
+import MessageUiHandler from "./message-ui-handler";
+import { getEggTierForSpecies } from "../data/egg";
+import {Button} from "#enums/buttons";
+import { Gender } from "#app/data/gender";
+import { getVariantTint } from "#app/data/variant";
+import { EggTier } from "#app/enums/egg-type";
+import PokemonHatchInfoContainer from "./pokemon-hatch-info-container";
+import { EggSummaryPhase } from "#app/phases/egg-summary-phase";
+import { DexAttr } from "#app/system/game-data";
+import { EggHatchData } from "#app/data/egg-hatch-data";
+
+const iconContainerX = 115;
+const iconContainerY = 9;
+const numCols = 11;
+const iconSize = 18;
+
+/**
+ * UI Handler for the egg summary.
+ * Handles navigation and display of each pokemon as a list
+ * Also handles display of the pokemon-hatch-info-container
+ */
+export default class EggSummaryUiHandler extends MessageUiHandler {
+ /** holds all elements in the scene */
+ private eggHatchContainer: Phaser.GameObjects.Container;
+ /** holds the icon containers and info container */
+ private summaryContainer: Phaser.GameObjects.Container;
+ /** container for the mini pokemon sprites */
+ private pokemonIconSpritesContainer: Phaser.GameObjects.Container;
+ /** container for the icons displayed alongside the mini icons (e.g. shiny, HA capsule) */
+ private pokemonIconsContainer: Phaser.GameObjects.Container;
+ /** hatch info container that displays the current pokemon / hatch (main element on left hand side) */
+ private infoContainer: PokemonHatchInfoContainer;
+ /** handles jumping animations for the pokemon sprite icons */
+ private iconAnimHandler: PokemonIconAnimHandler;
+ private eggHatchBg: Phaser.GameObjects.Image;
+ private cursorObj: Phaser.GameObjects.Image;
+ private eggHatchData: EggHatchData[];
+
+
+ /**
+ * Allows subscribers to listen for events
+ *
+ * Current Events:
+ * - {@linkcode EggEventType.EGG_COUNT_CHANGED} {@linkcode EggCountChangedEvent}
+ */
+ public readonly eventTarget: EventTarget = new EventTarget();
+
+ constructor(scene: BattleScene) {
+ super(scene, Mode.EGG_HATCH_SUMMARY);
+ }
+
+
+ setup() {
+ const ui = this.getUi();
+
+ this.summaryContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6);
+ this.summaryContainer.setVisible(false);
+ ui.add(this.summaryContainer);
+
+ this.eggHatchContainer = this.scene.add.container(0, -this.scene.game.canvas.height / 6);
+ this.eggHatchContainer.setVisible(false);
+ ui.add(this.eggHatchContainer);
+
+ this.iconAnimHandler = new PokemonIconAnimHandler();
+ this.iconAnimHandler.setup(this.scene);
+
+ this.eggHatchBg = this.scene.add.image(0, 0, "egg_summary_bg");
+ this.eggHatchBg.setOrigin(0, 0);
+ this.eggHatchContainer.add(this.eggHatchBg);
+
+ this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY);
+ this.pokemonIconSpritesContainer = this.scene.add.container(iconContainerX, iconContainerY);
+ this.summaryContainer.add(this.pokemonIconsContainer);
+ this.summaryContainer.add(this.pokemonIconSpritesContainer);
+
+ this.cursorObj = this.scene.add.image(0, 0, "select_cursor");
+ this.cursorObj.setOrigin(0, 0);
+ this.summaryContainer.add(this.cursorObj);
+
+ this.infoContainer = new PokemonHatchInfoContainer(this.scene, this.summaryContainer);
+ this.infoContainer.setup();
+ this.infoContainer.changeToEggSummaryLayout();
+ this.infoContainer.setVisible(true);
+ this.summaryContainer.add(this.infoContainer);
+
+ this.cursor = -1;
+ }
+
+ clear() {
+ super.clear();
+ this.cursor = -1;
+ this.summaryContainer.setVisible(false);
+ this.pokemonIconSpritesContainer.removeAll(true);
+ this.pokemonIconsContainer.removeAll(true);
+ this.eggHatchBg.setVisible(false);
+ this.getUi().hideTooltip();
+ // Note: Questions on garbage collection go to @frutescens
+ const activeKeys = this.scene.getActiveKeys();
+ // Removing unnecessary sprites from animation manager
+ const animKeys = Object.keys(this.scene.anims["anims"]["entries"]);
+ animKeys.forEach(key => {
+ if (key.startsWith("pkmn__") && !activeKeys.includes(key)) {
+ this.scene.anims.remove(key);
+ }
+ });
+ // Removing unnecessary cries from audio cache
+ const audioKeys = Object.keys(this.scene.cache.audio.entries.entries);
+ audioKeys.forEach(key => {
+ if (key.startsWith("cry/") && !activeKeys.includes(key)) {
+ delete this.scene.cache.audio.entries.entries[key];
+ }
+ });
+ // Clears eggHatchData in EggSummaryUiHandler
+ this.eggHatchData.length = 0;
+ // Removes Pokemon icons in EggSummaryUiHandler
+ this.iconAnimHandler.removeAll();
+ console.log("Egg Summary Handler cleared");
+ }
+
+ /**
+ * @param args EggHatchData[][]
+ * args[0]: list of EggHatchData for each egg/pokemon hatched
+ */
+ show(args: EggHatchData[][]): boolean {
+ super.show(args);
+ if (args.length >= 1) {
+ // sort the egg hatch data by egg tier then by species number (then by order hatched)
+ this.eggHatchData = args[0].sort(function sortHatchData(a: EggHatchData, b: EggHatchData) {
+ const speciesA = a.pokemon.species;
+ const speciesB = b.pokemon.species;
+ if (getEggTierForSpecies(speciesA) < getEggTierForSpecies(speciesB)) {
+ return -1;
+ } else if (getEggTierForSpecies(speciesA) > getEggTierForSpecies(speciesB)) {
+ return 1;
+ } else {
+ if (speciesA.speciesId < speciesB.speciesId) {
+ return -1;
+ } else if (speciesA.speciesId > speciesB.speciesId) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ }
+
+ );
+ }
+
+ this.getUi().bringToTop(this.summaryContainer);
+ this.summaryContainer.setVisible(true);
+ this.eggHatchContainer.setVisible(true);
+ this.pokemonIconsContainer.setVisible(true);
+ this.eggHatchBg.setVisible(true);
+ this.infoContainer.hideDisplayPokemon();
+
+ this.eggHatchData.forEach( (value: EggHatchData, i: number) => {
+ const x = (i % numCols) * iconSize;
+ const y = Math.floor(i / numCols) * iconSize;
+
+ const displayPokemon = value.pokemon;
+ const offset = 2;
+ const rightSideX = 12;
+
+ const bg = this.scene.add.image(x+2, y+5, "passive_bg");
+ bg.setOrigin(0, 0);
+ bg.setScale(0.75);
+ bg.setVisible(true);
+ this.pokemonIconsContainer.add(bg);
+
+ // set tint for passive bg
+ switch (getEggTierForSpecies(displayPokemon.species)) {
+ case EggTier.COMMON:
+ bg.setVisible(false);
+ break;
+ case EggTier.GREAT:
+ bg.setTint(0xabafff);
+ break;
+ case EggTier.ULTRA:
+ bg.setTint(0xffffaa);
+ break;
+ case EggTier.MASTER:
+ bg.setTint(0xdfffaf);
+ break;
+ }
+ const species = displayPokemon.species;
+ const female = displayPokemon.gender === Gender.FEMALE;
+ const formIndex = displayPokemon.formIndex;
+ const variant = displayPokemon.variant;
+ const isShiny = displayPokemon.shiny;
+
+ // set pokemon icon (and replace with base sprite if there is a mismatch)
+ const icon = this.scene.add.sprite(x - offset, y + offset, species.getIconAtlasKey(formIndex, isShiny, variant));
+ icon.setScale(0.5);
+ icon.setOrigin(0, 0);
+ icon.setFrame(species.getIconId(female, formIndex, isShiny, variant));
+
+ if (icon.frame.name !== species.getIconId(female, formIndex, isShiny, variant)) {
+ console.log(`${species.name}'s variant icon does not exist. Replacing with default.`);
+ icon.setTexture(species.getIconAtlasKey(formIndex, false, variant));
+ icon.setFrame(species.getIconId(female, formIndex, false, variant));
+ }
+ this.pokemonIconSpritesContainer.add(icon);
+ this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE);
+
+ const shiny = this.scene.add.image(x + rightSideX, y + offset * 2, "shiny_star_small");
+ shiny.setScale(0.5);
+ shiny.setVisible(displayPokemon.shiny);
+ shiny.setTint(getVariantTint(displayPokemon.variant));
+ this.pokemonIconsContainer.add(shiny);
+
+ const ha = this.scene.add.image(x + rightSideX, y + 7, "ha_capsule");
+ ha.setScale(0.5);
+ ha.setVisible((displayPokemon.hasAbility(displayPokemon.species.abilityHidden)));
+ this.pokemonIconsContainer.add(ha);
+
+ const pb = this.scene.add.image(x + rightSideX, y + offset * 7, "icon_owned");
+ pb.setOrigin(0, 0);
+ pb.setScale(0.5);
+
+ // add animation for new unlocks (new catch or new shiny or new form)
+ const dexEntry = value.dexEntryBeforeUpdate;
+ const caughtAttr = dexEntry.caughtAttr;
+ const newShiny = BigInt(1 << (displayPokemon.shiny ? 1 : 0));
+ const newVariant = BigInt(1 << (displayPokemon.variant + 4));
+ const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0));
+ const newForm = (BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM & caughtAttr) === BigInt(0);
+
+ pb.setVisible(!caughtAttr || newForm);
+ if (!caughtAttr || newShinyOrVariant || newForm) {
+ this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE);
+ }
+ this.pokemonIconsContainer.add(pb);
+
+ const em = this.scene.add.image(x, y + offset, "icon_egg_move");
+ em.setOrigin(0, 0);
+ em.setScale(0.5);
+ em.setVisible(value.eggMoveUnlocked);
+ this.pokemonIconsContainer.add(em);
+ });
+
+ this.setCursor(0);
+ this.scene.playSoundWithoutBgm("evolution_fanfare");
+ return true;
+ }
+
+ processInput(button: Button): boolean {
+ const ui = this.getUi();
+
+ let success = false;
+ const error = false;
+ if (button === Button.CANCEL) {
+ const phase = this.scene.getCurrentPhase();
+ if (phase instanceof EggSummaryPhase) {
+ phase.end();
+ }
+ ui.revertMode();
+ success = true;
+ } else {
+ const count = this.eggHatchData.length;
+ const rows = Math.ceil(count / numCols);
+ const row = Math.floor(this.cursor / numCols);
+ switch (button) {
+ case Button.UP:
+ if (row) {
+ success = this.setCursor(this.cursor - numCols);
+ }
+ break;
+ case Button.DOWN:
+ if (row < rows - 2 || (row < rows - 1 && this.cursor % numCols <= (count - 1) % numCols)) {
+ success = this.setCursor(this.cursor + numCols);
+ }
+ break;
+ case Button.LEFT:
+ if (this.cursor % numCols) {
+ success = this.setCursor(this.cursor - 1);
+ }
+ break;
+ case Button.RIGHT:
+ if (this.cursor % numCols < (row < rows - 1 ? 10 : (count - 1) % numCols)) {
+ success = this.setCursor(this.cursor + 1);
+ }
+ break;
+ }
+ }
+
+ if (success) {
+ ui.playSelect();
+ } else if (error) {
+ ui.playError();
+ }
+
+ return success || error;
+ }
+
+ setCursor(cursor: number): boolean {
+ let changed = false;
+
+ const lastCursor = this.cursor;
+
+ changed = super.setCursor(cursor);
+
+ if (changed) {
+ this.cursorObj.setPosition(iconContainerX - 1 + iconSize * (cursor % numCols), iconContainerY + 1 + iconSize * Math.floor(cursor / numCols));
+
+ if (lastCursor > -1) {
+ this.iconAnimHandler.addOrUpdate(this.pokemonIconSpritesContainer.getAt(lastCursor) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.NONE);
+ }
+ this.iconAnimHandler.addOrUpdate(this.pokemonIconSpritesContainer.getAt(cursor) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.ACTIVE);
+
+ this.infoContainer.showHatchInfo(this.eggHatchData[cursor]);
+
+ }
+
+ return changed;
+ }
+
+}
diff --git a/src/ui/fight-ui-handler.ts b/src/ui/fight-ui-handler.ts
index 0beaddbb517..4bbe88dabd9 100644
--- a/src/ui/fight-ui-handler.ts
+++ b/src/ui/fight-ui-handler.ts
@@ -95,9 +95,13 @@ export default class FightUiHandler extends UiHandler {
messageHandler.bg.setVisible(false);
messageHandler.commandWindow.setVisible(false);
messageHandler.movesWindowContainer.setVisible(true);
- this.setCursor(this.getCursor());
+ const pokemon = (this.scene.getCurrentPhase() as CommandPhase).getPokemon();
+ if (pokemon.battleSummonData.turnCount <= 1) {
+ this.setCursor(0);
+ } else {
+ this.setCursor(this.getCursor());
+ }
this.displayMoves();
-
return true;
}
diff --git a/src/ui/menu-ui-handler.ts b/src/ui/menu-ui-handler.ts
index 0bbfe21e4f9..adbb3089e5c 100644
--- a/src/ui/menu-ui-handler.ts
+++ b/src/ui/menu-ui-handler.ts
@@ -2,7 +2,7 @@ import BattleScene, { bypassLogin } from "../battle-scene";
import { TextStyle, addTextObject, getTextStyleOptions } from "./text";
import { Mode } from "./ui";
import * as Utils from "../utils";
-import { addWindow } from "./ui-theme";
+import { addWindow, WindowVariant } from "./ui-theme";
import MessageUiHandler from "./message-ui-handler";
import { OptionSelectConfig, OptionSelectItem } from "./abstact-option-select-ui-handler";
import { Tutorial, handleTutorial } from "../tutorial";
@@ -11,6 +11,8 @@ import i18next from "i18next";
import { Button } from "#enums/buttons";
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";
enum MenuOptions {
GAME_SETTINGS,
@@ -29,8 +31,13 @@ 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";
export default class MenuUiHandler extends MessageUiHandler {
+ private readonly textPadding = 8;
+ private readonly defaultMessageBoxWidth = 220;
+ private readonly defaultWordWrapWidth = 1224;
+
private menuContainer: Phaser.GameObjects.Container;
private menuMessageBoxContainer: Phaser.GameObjects.Container;
private menuOverlay: Phaser.GameObjects.Rectangle;
@@ -46,17 +53,20 @@ export default class MenuUiHandler extends MessageUiHandler {
protected manageDataConfig: OptionSelectConfig;
protected communityConfig: OptionSelectConfig;
+ // Windows for the default message box and the message box for testing dialogue
+ private menuMessageBox: Phaser.GameObjects.NineSlice;
+ private dialogueMessageBox: Phaser.GameObjects.NineSlice;
+
protected scale: number = 0.1666666667;
public bgmBar: BgmBar;
-
constructor(scene: BattleScene, mode: Mode | null = null) {
super(scene, mode);
this.excludedMenus = () => [
- { condition: [Mode.COMMAND, Mode.TITLE].includes(mode ?? Mode.TITLE), options: [ MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST] },
- { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ] }
+ { condition: [Mode.COMMAND, Mode.TITLE].includes(mode ?? Mode.TITLE), options: [MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST] },
+ { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }
];
this.menuOptions = Utils.getEnumKeys(MenuOptions)
@@ -98,8 +108,8 @@ export default class MenuUiHandler extends MessageUiHandler {
render() {
const ui = this.getUi();
this.excludedMenus = () => [
- { condition: ![Mode.COMMAND, Mode.TITLE].includes(ui.getModeChain()[0]), options: [ MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST] },
- { condition: bypassLogin, options: [ MenuOptions.LOG_OUT ] }
+ { condition: this.scene.getCurrentPhase() instanceof SelectModifierPhase, options: [MenuOptions.EGG_GACHA, MenuOptions.EGG_LIST] },
+ { condition: bypassLogin, options: [MenuOptions.LOG_OUT] }
];
this.menuOptions = Utils.getEnumKeys(MenuOptions)
@@ -115,12 +125,12 @@ export default class MenuUiHandler extends MessageUiHandler {
this.menuBg = addWindow(this.scene,
(this.scene.game.canvas.width / 6) - (this.optionSelectText.displayWidth + 25),
0,
- this.optionSelectText.displayWidth + 19+24*this.scale,
+ this.optionSelectText.displayWidth + 19 + 24 * this.scale,
(this.scene.game.canvas.height / 6) - 2
);
this.menuBg.setOrigin(0, 0);
- this.optionSelectText.setPositionRelative(this.menuBg, 10+24*this.scale, 6);
+ this.optionSelectText.setPositionRelative(this.menuBg, 10 + 24 * this.scale, 6);
this.menuContainer.add(this.menuBg);
@@ -131,20 +141,27 @@ export default class MenuUiHandler extends MessageUiHandler {
this.menuMessageBoxContainer = this.scene.add.container(0, 130);
this.menuMessageBoxContainer.setName("menu-message-box");
this.menuMessageBoxContainer.setVisible(false);
- this.menuContainer.add(this.menuMessageBoxContainer);
- const menuMessageBox = addWindow(this.scene, 0, -0, 220, 48);
- menuMessageBox.setOrigin(0, 0);
- this.menuMessageBoxContainer.add(menuMessageBox);
+ // Window for general messages
+ this.menuMessageBox = addWindow(this.scene, 0, 0, this.defaultMessageBoxWidth, 48);
+ this.menuMessageBox.setOrigin(0, 0);
+ this.menuMessageBoxContainer.add(this.menuMessageBox);
- const menuMessageText = addTextObject(this.scene, 8, 8, "", TextStyle.WINDOW, { maxLines: 2 });
+ // Full-width window used for testing dialog messages in debug mode
+ this.dialogueMessageBox = addWindow(this.scene, -this.textPadding, 0, this.scene.game.canvas.width / 6 + this.textPadding * 2, 49, false, false, 0, 0, WindowVariant.THIN);
+ this.dialogueMessageBox.setOrigin(0, 0);
+ this.menuMessageBoxContainer.add(this.dialogueMessageBox);
+
+ const menuMessageText = addTextObject(this.scene, this.textPadding, this.textPadding, "", TextStyle.WINDOW, { maxLines: 2 });
menuMessageText.setName("menu-message");
- menuMessageText.setWordWrapWidth(1224);
menuMessageText.setOrigin(0, 0);
this.menuMessageBoxContainer.add(menuMessageText);
this.message = menuMessageText;
+ // By default we use the general purpose message window
+ this.setDialogTestMode(false);
+
this.menuContainer.add(this.menuMessageBoxContainer);
const manageDataOptions: any[] = []; // TODO: proper type
@@ -155,7 +172,7 @@ export default class MenuUiHandler extends MessageUiHandler {
const config: OptionSelectConfig = {
options: new Array(5).fill(null).map((_, i) => i).filter(slotFilter).map(i => {
return {
- label: i18next.t("menuUiHandler:slot", {slotNumber: i+1}),
+ label: i18next.t("menuUiHandler:slot", { slotNumber: i + 1 }),
handler: () => {
callback(i);
ui.revertMode();
@@ -257,8 +274,55 @@ export default class MenuUiHandler extends MessageUiHandler {
return true;
},
keepOpen: true
- },
- {
+ });
+ if (Utils.isLocal || Utils.isBeta) { // this should make sure we don't have this option in live
+ manageDataOptions.push({
+ label: "Test Dialogue",
+ handler: () => {
+ ui.playSelect();
+ const prefilledText = "";
+ const buttonAction: any = {};
+ buttonAction["buttonActions"] = [
+ (sanitizedName: string) => {
+ ui.revertMode();
+ ui.playSelect();
+ const dialogueTestName = sanitizedName;
+ const dialogueName = decodeURIComponent(escape(atob(dialogueTestName)));
+ const handler = ui.getHandler() as AwaitableUiHandler;
+ handler.tutorialActive = true;
+ const interpolatorOptions: any = {};
+ const splitArr = dialogueName.split(" "); // this splits our inputted text into words to cycle through later
+ const translatedString = splitArr[0]; // this is our outputted i18 string
+ const regex = RegExp("\\{\\{(\\w*)\\}\\}", "g"); // this is a regex expression to find all the text between {{ }} in the i18 output
+ const matches = i18next.t(translatedString).match(regex) ?? [];
+ if (matches.length > 0) {
+ for (let match = 0; match < matches.length; match++) {
+ // we add 1 here because splitArr[0] is our first value for the translatedString, and after that is where the variables are
+ // the regex here in the replace (/\W/g) is to remove the {{ and }} and just give us all alphanumeric characters
+ if (typeof splitArr[match + 1] !== "undefined") {
+ interpolatorOptions[matches[match].replace(/\W/g, "")] = i18next.t(splitArr[match + 1]);
+ }
+ }
+ }
+ // Switch to the dialog test window
+ this.setDialogTestMode(true);
+ ui.showText(String(i18next.t(translatedString, interpolatorOptions)), null, () => this.scene.ui.showText("", 0, () => {
+ handler.tutorialActive = false;
+ // Go back to the default message window
+ this.setDialogTestMode(false);
+ }), null, true);
+ },
+ () => {
+ ui.revertMode();
+ }
+ ];
+ ui.setMode(Mode.TEST_DIALOGUE, buttonAction, prefilledText);
+ return true;
+ },
+ keepOpen: true
+ });
+ }
+ manageDataOptions.push({
label: i18next.t("menuUiHandler:cancel"),
handler: () => {
this.scene.ui.revertMode();
@@ -306,7 +370,16 @@ export default class MenuUiHandler extends MessageUiHandler {
return true;
},
keepOpen: true
- }];
+ },
+ {
+ label: i18next.t("menuUiHandler:donate"),
+ handler: () => {
+ window.open(donateUrl, "_blank")?.focus();
+ return true;
+ },
+ keepOpen: true
+ }
+ ];
if (!bypassLogin && loggedInUser?.hasAdminRole) {
communityOptions.push({
label: "Admin",
@@ -421,7 +494,7 @@ export default class MenuUiHandler extends MessageUiHandler {
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,
+ this.manageDataConfig.options.splice(this.manageDataConfig.options.length - 1, 0,
{
label: loggedInUser?.discordId === "" ? i18next.t("menuUiHandler:linkDiscord") : i18next.t("menuUiHandler:unlinkDiscord"),
handler: () => {
@@ -547,6 +620,21 @@ export default class MenuUiHandler extends MessageUiHandler {
return success || error;
}
+ /**
+ * Switch the message window style and size when we are replaying dialog for debug purposes
+ * In "dialog test mode", the window takes the whole width of the screen and the text
+ * is set up to wrap around the same way as the dialogue during the game
+ * @param isDialogMode whether to use the dialog test
+ */
+ setDialogTestMode(isDialogMode: boolean) {
+ this.menuMessageBox.setVisible(!isDialogMode);
+ this.dialogueMessageBox.setVisible(isDialogMode);
+ // If we're testing dialog, we use the same word wrapping as the battle message handler
+ this.message.setWordWrapWidth(isDialogMode ? this.scene.ui.getMessageHandler().wordWrapWidth : this.defaultWordWrapWidth);
+ this.message.setX(isDialogMode ? this.textPadding + 1 : this.textPadding);
+ this.message.setY(isDialogMode ? this.textPadding + 0.4 : this.textPadding);
+ }
+
showText(text: string, delay?: number, callback?: Function, callbackDelay?: number, prompt?: boolean, promptDelay?: number): void {
this.menuMessageBoxContainer.setVisible(!!text);
diff --git a/src/ui/modifier-select-ui-handler.ts b/src/ui/modifier-select-ui-handler.ts
index 4a567c926d7..ca5d27f96a4 100644
--- a/src/ui/modifier-select-ui-handler.ts
+++ b/src/ui/modifier-select-ui-handler.ts
@@ -122,6 +122,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler {
}
show(args: any[]): boolean {
+
+ this.scene.disableMenu = false;
+
if (this.active) {
if (args.length >= 3) {
this.awaitingActionInput = true;
@@ -254,6 +257,9 @@ export default class ModifierSelectUiHandler extends AwaitableUiHandler {
if (this.scene.shopCursorTarget === ShopCursorTarget.CHECK_TEAM) {
this.setRowCursor(0);
this.setCursor(2);
+ } else if ((this.scene.shopCursorTarget === ShopCursorTarget.SHOP) && this.scene.gameMode.hasNoShop) {
+ this.setRowCursor(ShopCursorTarget.REWARDS);
+ this.setCursor(0);
} else {
this.setRowCursor(this.scene.shopCursorTarget);
this.setCursor(0);
diff --git a/src/ui/party-ui-handler.ts b/src/ui/party-ui-handler.ts
index e7c4069c16e..98a19402a2b 100644
--- a/src/ui/party-ui-handler.ts
+++ b/src/ui/party-ui-handler.ts
@@ -166,6 +166,8 @@ export default class PartyUiHandler extends MessageUiHandler {
private iconAnimHandler: PokemonIconAnimHandler;
+ private blockInput: boolean;
+
private static FilterAll = (_pokemon: PlayerPokemon) => null;
public static FilterNonFainted = (pokemon: PlayerPokemon) => {
@@ -309,7 +311,7 @@ export default class PartyUiHandler extends MessageUiHandler {
this.partyContainer.setVisible(true);
this.partyBg.setTexture(`party_bg${this.scene.currentBattle.double ? "_double" : ""}`);
this.populatePartySlots();
- this.setCursor(this.cursor < 6 ? this.cursor : 0);
+ this.setCursor(0);
return true;
}
@@ -317,7 +319,7 @@ export default class PartyUiHandler extends MessageUiHandler {
processInput(button: Button): boolean {
const ui = this.getUi();
- if (this.pendingPrompt) {
+ if (this.pendingPrompt || this.blockInput) {
return false;
}
@@ -485,7 +487,9 @@ export default class PartyUiHandler extends MessageUiHandler {
this.clearOptions();
ui.playSelect();
if (this.cursor >= this.scene.currentBattle.getBattlerCount() || !pokemon.isAllowedInBattle()) {
+ this.blockInput = true;
this.showText(i18next.t("partyUiHandler:releaseConfirmation", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => {
+ this.blockInput = false;
ui.setModeWithoutClear(Mode.CONFIRM, () => {
ui.setMode(Mode.PARTY);
this.doRelease(this.cursor);
@@ -1317,16 +1321,13 @@ class PartySlot extends Phaser.GameObjects.Container {
this.slotHpOverlay.setVisible(false);
this.slotHpText.setVisible(false);
let slotTmText: string;
- switch (true) {
- case (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1):
- slotTmText = i18next.t("partyUiHandler:notAble");
- break;
- case (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0):
+
+ if (this.pokemon.getMoveset().filter(m => m?.moveId === tmMoveId).length > 0) {
slotTmText = i18next.t("partyUiHandler:learned");
- break;
- default:
+ } else if (this.pokemon.compatibleTms.indexOf(tmMoveId) === -1) {
+ slotTmText = i18next.t("partyUiHandler:notAble");
+ } else {
slotTmText = i18next.t("partyUiHandler:able");
- break;
}
this.slotDescriptionLabel.setText(slotTmText);
diff --git a/src/ui/pokemon-hatch-info-container.ts b/src/ui/pokemon-hatch-info-container.ts
new file mode 100644
index 00000000000..f8a9adced36
--- /dev/null
+++ b/src/ui/pokemon-hatch-info-container.ts
@@ -0,0 +1,189 @@
+import PokemonInfoContainer from "./pokemon-info-container";
+import BattleScene from "../battle-scene";
+import { Gender } from "../data/gender";
+import { Type } from "../data/type";
+import * as Utils from "../utils";
+import { TextStyle, addTextObject } from "./text";
+import { speciesEggMoves } from "#app/data/egg-moves";
+import { allMoves } from "#app/data/move";
+import { Species } from "#app/enums/species";
+import { getEggTierForSpecies } from "#app/data/egg";
+import { starterColors } from "../battle-scene";
+import { argbFromRgba } from "@material/material-color-utilities";
+import { EggHatchData } from "#app/data/egg-hatch-data";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { getPokemonSpeciesForm } from "#app/data/pokemon-species";
+
+/**
+ * Class for the hatch info summary of each pokemon
+ * Holds an info container as well as an additional egg sprite, name, egg moves and main sprite
+ */
+export default class PokemonHatchInfoContainer extends PokemonInfoContainer {
+ private currentPokemonSprite: Phaser.GameObjects.Sprite;
+ private pokemonNumberText: Phaser.GameObjects.Text;
+ private pokemonNameText: Phaser.GameObjects.Text;
+ private pokemonEggMovesContainer: Phaser.GameObjects.Container;
+ private pokemonEggMoveContainers: Phaser.GameObjects.Container[];
+ private pokemonEggMoveBgs: Phaser.GameObjects.NineSlice[];
+ private pokemonEggMoveLabels: Phaser.GameObjects.Text[];
+ private pokemonHatchedIcon : Phaser.GameObjects.Sprite;
+ private pokemonListContainer: Phaser.GameObjects.Container;
+ private pokemonCandyIcon: Phaser.GameObjects.Sprite;
+ private pokemonCandyOverlayIcon: Phaser.GameObjects.Sprite;
+ private pokemonCandyCountText: Phaser.GameObjects.Text;
+
+ constructor(scene: BattleScene, listContainer : Phaser.GameObjects.Container, x: number = 115, y: number = 9,) {
+ super(scene, x, y);
+ this.pokemonListContainer = listContainer;
+
+ }
+ setup(): void {
+ super.setup();
+ super.changeToEggSummaryLayout();
+
+ this.currentPokemonSprite = this.scene.add.sprite(54, 80, "pkmn__sub");
+ this.currentPokemonSprite.setScale(0.8);
+ this.currentPokemonSprite.setPipeline(this.scene.spritePipeline, { tone: [ 0.0, 0.0, 0.0, 0.0 ], ignoreTimeTint: true });
+ this.pokemonListContainer.add(this.currentPokemonSprite);
+
+ // setup name and number
+ this.pokemonNumberText = addTextObject(this.scene, 80, 107.5, "0000", TextStyle.SUMMARY, {fontSize: 74});
+ this.pokemonNumberText.setOrigin(0, 0);
+ this.pokemonListContainer.add(this.pokemonNumberText);
+
+ this.pokemonNameText = addTextObject(this.scene, 7, 107.5, "", TextStyle.SUMMARY, {fontSize: 74});
+ this.pokemonNameText.setOrigin(0, 0);
+ this.pokemonListContainer.add(this.pokemonNameText);
+
+ // setup egg icon and candy count
+ this.pokemonHatchedIcon = this.scene.add.sprite(-5, 90, "egg_icons");
+ this.pokemonHatchedIcon.setOrigin(0, 0.2);
+ this.pokemonHatchedIcon.setScale(0.8);
+ this.pokemonListContainer.add(this.pokemonHatchedIcon);
+
+ this.pokemonCandyIcon = this.scene.add.sprite(4.5, 40, "candy");
+ this.pokemonCandyIcon.setScale(0.5);
+ this.pokemonCandyIcon.setOrigin(0, 0);
+ this.pokemonListContainer.add(this.pokemonCandyIcon);
+
+ this.pokemonCandyOverlayIcon = this.scene.add.sprite(4.5, 40, "candy_overlay");
+ this.pokemonCandyOverlayIcon.setScale(0.5);
+ this.pokemonCandyOverlayIcon.setOrigin(0, 0);
+ this.pokemonListContainer.add(this.pokemonCandyOverlayIcon);
+
+ this.pokemonCandyCountText = addTextObject(this.scene, 14, 40, "x0", TextStyle.SUMMARY, { fontSize: "56px" });
+ this.pokemonCandyCountText.setOrigin(0, 0);
+ this.pokemonListContainer.add(this.pokemonCandyCountText);
+
+ // setup egg moves
+ this.pokemonEggMoveContainers = [];
+ this.pokemonEggMoveBgs = [];
+ this.pokemonEggMoveLabels = [];
+ this.pokemonEggMovesContainer = this.scene.add.container(0, 200);
+ this.pokemonEggMovesContainer.setVisible(false);
+ this.pokemonEggMovesContainer.setScale(0.5);
+
+ for (let m = 0; m < 4; m++) {
+ const eggMoveContainer = this.scene.add.container(0, 0 + 6 * m);
+
+ const eggMoveBg = this.scene.add.nineslice(70, 0, "type_bgs", "unknown", 92, 14, 2, 2, 2, 2);
+ eggMoveBg.setOrigin(1, 0);
+
+ const eggMoveLabel = addTextObject(this.scene, 70 -eggMoveBg.width / 2, 0, "???", TextStyle.PARTY);
+ eggMoveLabel.setOrigin(0.5, 0);
+
+ this.pokemonEggMoveBgs.push(eggMoveBg);
+ this.pokemonEggMoveLabels.push(eggMoveLabel);
+
+ eggMoveContainer.add(eggMoveBg);
+ eggMoveContainer.add(eggMoveLabel);
+ eggMoveContainer.setScale(0.44);
+
+ this.pokemonEggMoveContainers.push(eggMoveContainer);
+
+ this.pokemonEggMovesContainer.add(eggMoveContainer);
+ }
+
+ super.add(this.pokemonEggMoveContainers);
+
+ }
+
+ /**
+ * Disable the sprite (and replace with substitute)
+ */
+ hideDisplayPokemon() {
+ this.currentPokemonSprite.setVisible(false);
+ }
+
+ /**
+ * Display a given pokemon sprite with animations
+ * assumes the specific pokemon sprite has already been loaded
+ */
+ displayPokemon(pokemon: PlayerPokemon) {
+ const species = pokemon.species;
+ const female = pokemon.gender === Gender.FEMALE;
+ const formIndex = pokemon.formIndex;
+ const shiny = pokemon.shiny;
+ const variant = pokemon.variant;
+ this.currentPokemonSprite.setVisible(false);
+ species.loadAssets(this.scene, female, formIndex, shiny, variant, true).then(() => {
+
+ getPokemonSpeciesForm(species.speciesId, pokemon.formIndex).cry(this.scene);
+ this.currentPokemonSprite.play(species.getSpriteKey(female, formIndex, shiny, variant));
+ this.currentPokemonSprite.setPipelineData("shiny", shiny);
+ this.currentPokemonSprite.setPipelineData("variant", variant);
+ this.currentPokemonSprite.setPipelineData("spriteKey", species.getSpriteKey(female, formIndex, shiny, variant));
+ this.currentPokemonSprite.setVisible(true);
+ });
+ }
+
+ /**
+ * Updates the info container with the appropriate dex data and starter entry from the hatchInfo
+ * Also updates the displayed name, number, egg moves and main animated sprite for the pokemon
+ * @param hatchInfo The EggHatchData of the pokemon / new hatch to show
+ */
+ showHatchInfo(hatchInfo: EggHatchData) {
+ this.pokemonEggMovesContainer.setVisible(true);
+
+ const pokemon = hatchInfo.pokemon;
+ const species = pokemon.species;
+ this.displayPokemon(pokemon);
+
+ super.show(pokemon, false, 1, hatchInfo.getDex(), hatchInfo.getStarterEntry(), true);
+ const colorScheme = starterColors[species.speciesId];
+
+ this.pokemonCandyIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[0])));
+ this.pokemonCandyIcon.setVisible(true);
+ this.pokemonCandyOverlayIcon.setTint(argbFromRgba(Utils.rgbHexToRgba(colorScheme[1])));
+ this.pokemonCandyOverlayIcon.setVisible(true);
+ this.pokemonCandyCountText.setText(`x${this.scene.gameData.starterData[species.speciesId].candyCount}`);
+ this.pokemonCandyCountText.setVisible(true);
+
+ this.pokemonNumberText.setText(Utils.padInt(species.speciesId, 4));
+ this.pokemonNameText.setText(species.name);
+
+ const hasEggMoves = species && speciesEggMoves.hasOwnProperty(species.speciesId);
+
+ for (let em = 0; em < 4; em++) {
+ const eggMove = hasEggMoves ? allMoves[speciesEggMoves[species.speciesId][em]] : null;
+ const eggMoveUnlocked = eggMove && this.scene.gameData.starterData[species.speciesId].eggMoves & Math.pow(2, em);
+ this.pokemonEggMoveBgs[em].setFrame(Type[eggMove ? eggMove.type : Type.UNKNOWN].toString().toLowerCase());
+
+ this.pokemonEggMoveLabels[em].setText(eggMove && eggMoveUnlocked ? eggMove.name : "???");
+ if (!(eggMove && hatchInfo.starterDataEntryBeforeUpdate.eggMoves & Math.pow(2, em)) && eggMoveUnlocked) {
+ this.pokemonEggMoveLabels[em].setText("(+) " + eggMove.name);
+ }
+ }
+
+ // will always have at least one egg move
+ this.pokemonEggMovesContainer.setVisible(true);
+
+ if (species.speciesId === Species.MANAPHY || species.speciesId === Species.PHIONE) {
+ this.pokemonHatchedIcon.setFrame("manaphy");
+ } else {
+ this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species));
+ }
+
+ }
+
+}
diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts
index edb85ecff7a..49bfd4d7293 100644
--- a/src/ui/pokemon-info-container.ts
+++ b/src/ui/pokemon-info-container.ts
@@ -6,7 +6,7 @@ import { getNatureName } from "../data/nature";
import { Type } from "../data/type";
import Pokemon from "../field/pokemon";
import i18next from "i18next";
-import { DexAttr } from "../system/game-data";
+import { DexAttr, DexEntry, StarterDataEntry } from "../system/game-data";
import * as Utils from "../utils";
import ConfirmUiHandler from "./confirm-ui-handler";
import { StatsContainer } from "./stats-container";
@@ -24,7 +24,7 @@ const languageSettings: { [key: string]: LanguageSetting } = {
infoContainerTextSize: "64px"
},
"de": {
- infoContainerTextSize: "64px"
+ infoContainerTextSize: "64px",
},
"es": {
infoContainerTextSize: "64px"
@@ -63,6 +63,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
private pokemonMovesContainers: Phaser.GameObjects.Container[];
private pokemonMoveBgs: Phaser.GameObjects.NineSlice[];
private pokemonMoveLabels: Phaser.GameObjects.Text[];
+ private infoBg;
private numCharsBeforeCutoff = 16;
@@ -83,9 +84,9 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
const currentLanguage = i18next.resolvedLanguage!; // TODO: is this bang correct?
const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage?.includes(lang))!; // TODO: is this bang correct?
const textSettings = languageSettings[langSettingKey];
- const infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132);
- infoBg.setOrigin(0.5, 0.5);
- infoBg.setName("window-info-bg");
+ this.infoBg = addWindow(this.scene, 0, 0, this.infoWindowWidth, 132);
+ this.infoBg.setOrigin(0.5, 0.5);
+ this.infoBg.setName("window-info-bg");
this.pokemonMovesContainer = this.scene.add.container(6, 14);
this.pokemonMovesContainer.setName("pkmn-moves");
@@ -133,7 +134,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.statsContainer = new StatsContainer(this.scene, -48, -64, true);
- this.add(infoBg);
+ this.add(this.infoBg);
this.add(this.statsContainer);
// The position should be set per language
@@ -207,9 +208,16 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.setVisible(false);
}
- show(pokemon: Pokemon, showMoves: boolean = false, speedMultiplier: number = 1): Promise {
+ show(pokemon: Pokemon, showMoves: boolean = false, speedMultiplier: number = 1, dexEntry?: DexEntry, starterEntry?: StarterDataEntry, eggInfo = false): Promise {
return new Promise(resolve => {
- const caughtAttr = BigInt(pokemon.scene.gameData.dexData[pokemon.species.speciesId].caughtAttr);
+ if (!dexEntry) {
+ dexEntry = pokemon.scene.gameData.dexData[pokemon.species.speciesId];
+ }
+ if (!starterEntry) {
+ starterEntry = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()];
+ }
+
+ const caughtAttr = BigInt(dexEntry.caughtAttr);
if (pokemon.gender > Gender.GENDERLESS) {
this.pokemonGenderText.setText(getGenderSymbol(pokemon.gender));
this.pokemonGenderText.setColor(getGenderColor(pokemon.gender));
@@ -268,7 +276,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
const opponentPokemonAbilityIndex = (opponentPokemonOneNormalAbility && pokemon.abilityIndex === 1) ? 2 : pokemon.abilityIndex;
const opponentPokemonAbilityAttr = 1 << opponentPokemonAbilityIndex;
- const rootFormHasHiddenAbility = pokemon.scene.gameData.starterData[pokemon.species.getRootSpeciesId()].abilityAttr & opponentPokemonAbilityAttr;
+ const rootFormHasHiddenAbility = starterEntry.abilityAttr & opponentPokemonAbilityAttr;
if (!rootFormHasHiddenAbility) {
this.pokemonAbilityLabelText.setColor(getTextColor(TextStyle.SUMMARY_BLUE, false, this.scene.uiTheme));
@@ -280,7 +288,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
this.pokemonNatureText.setText(getNatureName(pokemon.getNature(), true, false, false, this.scene.uiTheme));
- const dexNatures = pokemon.scene.gameData.dexData[pokemon.species.speciesId].natureAttr;
+ const dexNatures = dexEntry.natureAttr;
const newNature = 1 << (pokemon.nature + 1);
if (!(dexNatures & newNature)) {
@@ -324,31 +332,31 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
}
const starterSpeciesId = pokemon.species.getRootSpeciesId();
- const originalIvs: integer[] | null = this.scene.gameData.dexData[starterSpeciesId].caughtAttr
- ? this.scene.gameData.dexData[starterSpeciesId].ivs
- : null;
+ const originalIvs: integer[] | null = eggInfo ? (dexEntry.caughtAttr ? dexEntry.ivs : null) : (this.scene.gameData.dexData[starterSpeciesId].caughtAttr
+ ? this.scene.gameData.dexData[starterSpeciesId].ivs : null);
this.statsContainer.updateIvs(pokemon.ivs, originalIvs!); // TODO: is this bang correct?
-
- this.scene.tweens.add({
- targets: this,
- duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)),
- ease: "Cubic.easeInOut",
- x: this.initialX - this.infoWindowWidth,
- onComplete: () => {
- resolve();
- }
- });
-
- if (showMoves) {
+ if (!eggInfo) {
this.scene.tweens.add({
- delay: Utils.fixedInt(Math.floor(325 / speedMultiplier)),
- targets: this.pokemonMovesContainer,
- duration: Utils.fixedInt(Math.floor(325 / speedMultiplier)),
+ targets: this,
+ duration: Utils.fixedInt(Math.floor(750 / speedMultiplier)),
ease: "Cubic.easeInOut",
- x: this.movesContainerInitialX - 57,
- onComplete: () => resolve()
+ x: this.initialX - this.infoWindowWidth,
+ onComplete: () => {
+ resolve();
+ }
});
+
+ if (showMoves) {
+ this.scene.tweens.add({
+ delay: Utils.fixedInt(Math.floor(325 / speedMultiplier)),
+ targets: this.pokemonMovesContainer,
+ duration: Utils.fixedInt(Math.floor(325 / speedMultiplier)),
+ ease: "Cubic.easeInOut",
+ x: this.movesContainerInitialX - 57,
+ onComplete: () => resolve()
+ });
+ }
}
for (let m = 0; m < 4; m++) {
@@ -364,6 +372,36 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container {
});
}
+ changeToEggSummaryLayout() {
+ // The position should be set per language (and shifted for new layout)
+ const currentLanguage = i18next.resolvedLanguage!; // TODO: is this bang correct?
+ const langSettingKey = Object.keys(languageSettings).find(lang => currentLanguage?.includes(lang))!; // TODO: is this bang correct?
+ const textSettings = languageSettings[langSettingKey];
+
+ const eggLabelTextOffset = 43;
+ const infoContainerLabelXPos = (textSettings?.infoContainerLabelXPos || -18) + eggLabelTextOffset;
+ const infoContainerTextXPos = (textSettings?.infoContainerTextXPos || -14) + eggLabelTextOffset;
+
+ this.x = this.initialX - this.infoWindowWidth;
+
+ this.pokemonGenderText.setPosition(89, -2);
+ this.pokemonGenderNewText.setPosition(79, -2);
+ this.pokemonShinyIcon.setPosition(82, 87);
+ this.pokemonShinyNewIcon.setPosition(72, 87);
+
+ this.pokemonFormLabelText.setPosition(infoContainerLabelXPos, 152);
+ this.pokemonFormText.setPosition(infoContainerTextXPos, 152);
+ this.pokemonAbilityLabelText.setPosition(infoContainerLabelXPos, 110);
+ this.pokemonAbilityText.setPosition(infoContainerTextXPos, 110);
+ this.pokemonNatureLabelText.setPosition(infoContainerLabelXPos, 125);
+ this.pokemonNatureText.setPosition(infoContainerTextXPos, 125);
+
+ this.statsContainer.setScale(0.7);
+ this.statsContainer.setPosition(30, -3);
+ this.infoBg.setVisible(false);
+ this.pokemonMovesContainer.setVisible(false);
+ }
+
makeRoomForConfirmUi(speedMultiplier: number = 1, fromCatch: boolean = false): Promise {
const xPosition = fromCatch ? this.initialX - this.infoWindowWidth - 65 : this.initialX - this.infoWindowWidth - ConfirmUiHandler.windowWidth;
return new Promise(resolve => {
diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts
index ff4ed919e75..7a183a11d29 100644
--- a/src/ui/run-info-ui-handler.ts
+++ b/src/ui/run-info-ui-handler.ts
@@ -13,8 +13,9 @@ import { BattleType } from "../battle";
import { TrainerVariant } from "../field/trainer";
import { Challenges } from "#enums/challenges";
import { getLuckString, getLuckTextTint } from "../modifier/modifier-type";
-import RoundRectangle from "phaser3-rex-plugins/plugins/roundrectangle.js";
+import RoundRectangle from "phaser3-rex-plugins/plugins/roundrectangle";
import { Type, getTypeRgb } from "../data/type";
+import { TypeColor, TypeShadow } from "#app/enums/color";
import { getNatureStatMultiplier, getNatureName } from "../data/nature";
import { getVariantTint } from "#app/data/variant";
import { PokemonHeldItemModifier, TerastallizeModifier } from "../modifier/modifier";
@@ -373,18 +374,10 @@ export default class RunInfoUiHandler extends UiHandler {
break;
case GameModes.CHALLENGE:
modeText.appendText(`${i18next.t("gameMode:challenge")}`, false);
- modeText.appendText(`\t\t${i18next.t("runHistory:challengeRules")}: `);
- const runChallenges = this.runInfo.challenges;
- const rules: string[] = [];
- for (let i = 0; i < runChallenges.length; i++) {
- if (runChallenges[i].id === Challenges.SINGLE_GENERATION && runChallenges[i].value !== 0) {
- rules.push(i18next.t(`runHistory:challengeMonoGen${runChallenges[i].value}`));
- } else if (runChallenges[i].id === Challenges.SINGLE_TYPE && runChallenges[i].value !== 0) {
- rules.push(i18next.t(`pokemonInfo:Type.${Type[runChallenges[i].value-1]}` as const));
- } else if (runChallenges[i].id === Challenges.FRESH_START && runChallenges[i].value !== 0) {
- rules.push(i18next.t("challenges:freshStart.name"));
- }
- }
+ 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) {
@@ -466,6 +459,38 @@ export default class RunInfoUiHandler extends UiHandler {
this.runContainer.add(this.runInfoContainer);
}
+ /**
+ * This function parses the Challenges section of the Run Entry and returns a list of active challenge.
+ * @return string[] of active challenge names
+ */
+ private challengeParser(): string[] {
+ const rules: string[] = [];
+ 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.FRESH_START:
+ rules.push(i18next.t("challenges:freshStart.name"));
+ break;
+ case Challenges.INVERSE_BATTLE:
+ //
+ rules.push(i18next.t("challenges:inverseBattle.shortName"));
+ break;
+ }
+ }
+ }
+ return rules;
+ }
+
/**
* Parses and displays the run's player party.
* Default Information: Icon, Level, Nature, Ability, Passive, Shiny Status, Fusion Status, Stats, and Moves.
@@ -609,7 +634,7 @@ export default class RunInfoUiHandler extends UiHandler {
// Pokemon Held Items - not displayed by default
// Endless/Endless Spliced have a different scale because Pokemon tend to accumulate more items in these runs.
const heldItemsScale = (this.runInfo.gameMode === GameModes.SPLICED_ENDLESS || this.runInfo.gameMode === GameModes.ENDLESS) ? 0.25 : 0.5;
- const heldItemsContainer = this.scene.add.container(-82, 6);
+ const heldItemsContainer = this.scene.add.container(-82, 2);
const heldItemsList : PokemonHeldItemModifier[] = [];
if (this.runInfo.modifiers.length) {
for (const m of this.runInfo.modifiers) {
@@ -629,6 +654,9 @@ export default class RunInfoUiHandler extends UiHandler {
break;
}
const itemIcon = item?.getIcon(this.scene, true);
+ if (item?.stackCount < item?.getMaxHeldItemCount(pokemon) && itemIcon.list[1] instanceof Phaser.GameObjects.BitmapText) {
+ itemIcon.list[1].clearTint();
+ }
itemIcon.setScale(heldItemsScale);
itemIcon.setPosition((index%19) * 10, row * 10);
heldItemsContainer.add(itemIcon);
diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts
index f9b40dd96e6..6b75c46bd45 100644
--- a/src/ui/starter-select-ui-handler.ts
+++ b/src/ui/starter-select-ui-handler.ts
@@ -32,19 +32,20 @@ import {SettingKeyboard} from "#app/system/settings/settings-keyboard";
import {Passive as PassiveAttr} from "#enums/passive";
import * as Challenge from "../data/challenge";
import MoveInfoOverlay from "./move-info-overlay";
-import { getEggTierForSpecies } from "#app/data/egg.js";
+import { getEggTierForSpecies } from "#app/data/egg";
import { Device } from "#enums/devices";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import {Button} from "#enums/buttons";
-import { EggSourceType } from "#app/enums/egg-source-types.js";
+import { EggSourceType } from "#app/enums/egg-source-types";
import AwaitableUiHandler from "./awaitable-ui-handler";
-import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType } from "./dropdown";
+import { DropDown, DropDownLabel, DropDownOption, DropDownState, DropDownType, SortCriteria } from "./dropdown";
import { StarterContainer } from "./starter-container";
import { DropDownColumn, FilterBar } from "./filter-bar";
import { ScrollBar } from "./scroll-bar";
-import { SelectChallengePhase } from "#app/phases/select-challenge-phase.js";
-import { TitlePhase } from "#app/phases/title-phase.js";
+import { SelectChallengePhase } from "#app/phases/select-challenge-phase";
+import { TitlePhase } from "#app/phases/title-phase";
+import { Abilities } from "#app/enums/abilities";
export type StarterSelectCallback = (starters: Starter[]) => void;
@@ -262,6 +263,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
private pokemonHatchedIcon : Phaser.GameObjects.Sprite;
private pokemonHatchedCountText: Phaser.GameObjects.Text;
private pokemonShinyIcon: Phaser.GameObjects.Sprite;
+ private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite;
+ private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite;
private instructionsContainer: Phaser.GameObjects.Container;
private filterInstructionsContainer: Phaser.GameObjects.Container;
@@ -501,11 +504,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
// sort filter
const sortOptions = [
- new DropDownOption(this.scene, 0, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)),
- new DropDownOption(this.scene, 1, new DropDownLabel(i18next.t("filterBar:sortByCost"))),
- new DropDownOption(this.scene, 2, new DropDownLabel(i18next.t("filterBar:sortByCandies"))),
- new DropDownOption(this.scene, 3, new DropDownLabel(i18next.t("filterBar:sortByIVs"))),
- new DropDownOption(this.scene, 4, new DropDownLabel(i18next.t("filterBar:sortByName")))
+ new DropDownOption(this.scene, SortCriteria.NUMBER, new DropDownLabel(i18next.t("filterBar:sortByNumber"), undefined, DropDownState.ON)),
+ new DropDownOption(this.scene, SortCriteria.COST, new DropDownLabel(i18next.t("filterBar:sortByCost"))),
+ new DropDownOption(this.scene, SortCriteria.CANDY, new DropDownLabel(i18next.t("filterBar:sortByCandies"))),
+ new DropDownOption(this.scene, SortCriteria.IV, new DropDownLabel(i18next.t("filterBar:sortByIVs"))),
+ new DropDownOption(this.scene, SortCriteria.NAME, new DropDownLabel(i18next.t("filterBar:sortByName")))
];
this.filterBar.addFilter(DropDownColumn.SORT, i18next.t("filterBar:sortFilter"), new DropDown(this.scene, 0, 0, sortOptions, this.updateStarters, DropDownType.SINGLE));
this.filterBarContainer.add(this.filterBar);
@@ -573,6 +576,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonPassiveText.setOrigin(0, 0);
this.starterSelectContainer.add(this.pokemonPassiveText);
+ this.pokemonPassiveDisabledIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop");
+ this.pokemonPassiveDisabledIcon.setOrigin(0, 0.5);
+ this.pokemonPassiveDisabledIcon.setScale(0.35);
+ this.pokemonPassiveDisabledIcon.setVisible(false);
+ this.starterSelectContainer.add(this.pokemonPassiveDisabledIcon);
+
+ this.pokemonPassiveLockedIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_lock");
+ this.pokemonPassiveLockedIcon.setOrigin(0, 0.5);
+ this.pokemonPassiveLockedIcon.setScale(0.42, 0.38);
+ this.pokemonPassiveLockedIcon.setVisible(false);
+ this.starterSelectContainer.add(this.pokemonPassiveLockedIcon);
+
this.pokemonNatureLabelText = addTextObject(this.scene, 6, 145 + starterInfoYOffset, i18next.t("starterSelectUiHandler:nature"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize });
this.pokemonNatureLabelText.setOrigin(0, 0);
this.pokemonNatureLabelText.setVisible(false);
@@ -733,7 +748,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonShinyIcon = this.scene.add.sprite(14, 76, "shiny_icons");
this.pokemonShinyIcon.setOrigin(0.15, 0.2);
this.pokemonShinyIcon.setScale(1);
- this.pokemonCaughtHatchedContainer.add ((this.pokemonShinyIcon));
+ this.pokemonCaughtHatchedContainer.add(this.pokemonShinyIcon);
this.pokemonHatchedCountText = addTextObject(this.scene, 24, 19, "0", TextStyle.SUMMARY_ALT);
this.pokemonHatchedCountText.setOrigin(0, 0);
@@ -915,7 +930,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.allSpecies.forEach((species, s) => {
const icon = this.starterContainers[s].icon;
const dexEntry = this.scene.gameData.dexData[species.speciesId];
- this.starterPreferences[species.speciesId] = this.starterPreferences[species.speciesId] ?? {};
+
+ // Initialize the StarterAttributes for this species
+ this.starterPreferences[species.speciesId] = this.initStarterPrefs(species);
if (dexEntry.caughtAttr) {
icon.clearTint();
@@ -942,6 +959,93 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return false;
}
+ /**
+ * Get the starter attributes for the given PokemonSpecies, after sanitizing them.
+ * If somehow a preference is set for a form, variant, gender, ability or nature
+ * that wasn't actually unlocked or is invalid it will be cleared here
+ *
+ * @param species The species to get Starter Preferences for
+ * @returns StarterAttributes for the species
+ */
+ initStarterPrefs(species: PokemonSpecies): StarterAttributes {
+ const starterAttributes = this.starterPreferences[species.speciesId];
+ const dexEntry = this.scene.gameData.dexData[species.speciesId];
+ const starterData = this.scene.gameData.starterData[species.speciesId];
+
+ // no preferences or Pokemon wasn't caught, return empty attribute
+ if (!starterAttributes || !dexEntry.caughtAttr) {
+ return {};
+ }
+
+ const caughtAttr = dexEntry.caughtAttr;
+
+ const hasShiny = caughtAttr & DexAttr.SHINY;
+ const hasNonShiny = caughtAttr & DexAttr.NON_SHINY;
+ if (starterAttributes.shiny && !hasShiny) {
+ // shiny form wasn't unlocked, purging shiny and variant setting
+ delete starterAttributes.shiny;
+ delete starterAttributes.variant;
+ } else if (starterAttributes.shiny === false && !hasNonShiny) {
+ // non shiny form wasn't unlocked, purging shiny setting
+ delete starterAttributes.shiny;
+ }
+
+ if (starterAttributes.variant !== undefined && !isNaN(starterAttributes.variant)) {
+ const unlockedVariants = [
+ hasNonShiny,
+ hasShiny && caughtAttr & DexAttr.DEFAULT_VARIANT,
+ hasShiny && caughtAttr & DexAttr.VARIANT_2,
+ hasShiny && caughtAttr & DexAttr.VARIANT_3
+ ];
+ if (!unlockedVariants[starterAttributes.variant + 1]) { // add 1 as -1 = non-shiny
+ // requested variant wasn't unlocked, purging setting
+ delete starterAttributes.variant;
+ }
+ }
+
+ if (starterAttributes.female !== undefined) {
+ if (!(starterAttributes.female ? caughtAttr & DexAttr.FEMALE : caughtAttr & DexAttr.MALE)) {
+ // requested gender wasn't unlocked, purging setting
+ delete starterAttributes.female;
+ }
+ }
+
+ if (starterAttributes.ability !== undefined) {
+ const speciesHasSingleAbility = species.ability2 === species.ability1;
+ const abilityAttr = starterData.abilityAttr;
+ const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1;
+ const hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2;
+ const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN;
+ // Due to a past bug it is possible that some Pokemon with a single ability have the ability2 flag
+ // In this case, we only count ability2 as valid if ability1 was not unlocked, otherwise we ignore it
+ const unlockedAbilities = [
+ hasAbility1,
+ speciesHasSingleAbility ? hasAbility2 && !hasAbility1 : hasAbility2,
+ hasHiddenAbility
+ ];
+ if (!unlockedAbilities[starterAttributes.ability]) {
+ // requested ability wasn't unlocked, purging setting
+ delete starterAttributes.ability;
+ }
+ }
+
+ const selectedForm = starterAttributes.form;
+ if (selectedForm !== undefined && (!species.forms[selectedForm]?.isStarterSelectable || !(caughtAttr & this.scene.gameData.getFormAttr(selectedForm)))) {
+ // requested form wasn't unlocked/isn't a starter form, purging setting
+ delete starterAttributes.form;
+ }
+
+ if (starterAttributes.nature !== undefined) {
+ const unlockedNatures = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr);
+ if (unlockedNatures.indexOf(starterAttributes.nature as unknown as Nature) < 0) {
+ // requested nature wasn't unlocked, purging setting
+ delete starterAttributes.nature;
+ }
+ }
+
+ return starterAttributes;
+ }
+
/**
* Set the selections for all filters to their default starting value
*/
@@ -1749,10 +1853,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
switch (button) {
case Button.CYCLE_SHINY:
if (this.canCycleShiny) {
- const newVariant = props.variant;
- starterAttributes.shiny = starterAttributes.shiny ? !starterAttributes.shiny : true;
- this.setSpeciesDetails(this.lastSpecies, !props.shiny, undefined, undefined, props.shiny ? 0 : undefined, undefined, undefined);
+ starterAttributes.shiny = starterAttributes.shiny !== undefined ? !starterAttributes.shiny : false;
+
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);
+
this.scene.playSound("se/sparkle");
// Set the variant label to the shiny tint
const tint = getVariantTint(newVariant);
@@ -1760,10 +1868,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonShinyIcon.setTint(tint);
this.pokemonShinyIcon.setVisible(true);
} else {
- // starterAttributes.variant = 0;
- if (starterAttributes?.variant) {
- delete starterAttributes.variant;
- }
+ this.setSpeciesDetails(this.lastSpecies, false, undefined, undefined, 0, undefined, undefined);
this.pokemonShinyIcon.setVisible(false);
success = true;
}
@@ -2276,48 +2381,45 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
container.cost = this.scene.gameData.getSpeciesStarterValue(container.species.speciesId);
// First, ensure you have the caught attributes for the species else default to bigint 0
- const isCaught = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0);
-
- // Define the variables based on whether their respective variants have been caught
- const isVariant3Caught = !!(isCaught & DexAttr.VARIANT_3);
- const isVariant2Caught = !!(isCaught & DexAttr.VARIANT_2);
- const isVariantCaught = !!(isCaught & DexAttr.SHINY);
- const isUncaught = !isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught;
- const isPassiveUnlocked = this.scene.gameData.starterData[container.species.speciesId].passiveAttr > 0;
- const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked;
- const isCostReduced = this.scene.gameData.starterData[container.species.speciesId].valueReduction > 0;
- const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId);
- const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false;
-
- const isWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount > 0;
- const isNotWin = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === 0;
- const isUndefined = this.scene.gameData.starterData[container.species.speciesId].classicWinCount === undefined;
- const isHA = this.scene.gameData.starterData[container.species.speciesId].abilityAttr & AbilityAttr.ABILITY_HIDDEN;
- const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId);
+ const caughtAttr = this.scene.gameData.dexData[container.species.speciesId]?.caughtAttr || BigInt(0);
+ const starterData = this.scene.gameData.starterData[container.species.speciesId];
+ const isStarterProgressable = speciesEggMoves.hasOwnProperty(container.species.speciesId);
+ // Gen filter
const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation);
+ // Type filter
const fitsType = this.filterBar.getVals(DropDownColumn.TYPES).some(type => container.species.isOfType((type as number) - 1));
+ // Caught / Shiny filter
+ const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY);
+ const isShinyCaught = !!(caughtAttr & DexAttr.SHINY);
+ const isVariant1Caught = isShinyCaught && !!(caughtAttr & DexAttr.DEFAULT_VARIANT);
+ const isVariant2Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_2);
+ const isVariant3Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_3);
+ const isUncaught = !isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught;
const fitsCaught = this.filterBar.getVals(DropDownColumn.CAUGHT).some(caught => {
if (caught === "SHINY3") {
return isVariant3Caught;
} else if (caught === "SHINY2") {
return isVariant2Caught && !isVariant3Caught;
} else if (caught === "SHINY") {
- return isVariantCaught && !isVariant2Caught && !isVariant3Caught;
+ return isVariant1Caught && !isVariant2Caught && !isVariant3Caught;
} else if (caught === "NORMAL") {
- return isCaught && !isVariantCaught && !isVariant2Caught && !isVariant3Caught;
+ return isNonShinyCaught && !isVariant1Caught && !isVariant2Caught && !isVariant3Caught;
} else if (caught === "UNCAUGHT") {
return isUncaught;
}
});
+ // Passive Filter
+ const isPassiveUnlocked = starterData.passiveAttr > 0;
+ const isPassiveUnlockable = this.isPassiveAvailable(container.species.speciesId) && !isPassiveUnlocked;
const fitsPassive = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => {
if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.ON) {
return isPassiveUnlocked;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.EXCLUDE) {
- return !isPassiveUnlocked;
+ return isStarterProgressable && !isPassiveUnlocked;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.UNLOCKABLE) {
return isPassiveUnlockable;
} else if (unlocks.val === "PASSIVE" && unlocks.state === DropDownState.OFF) {
@@ -2325,11 +2427,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
+ // Cost Reduction Filter
+ const isCostReduced = starterData.valueReduction > 0;
+ const isCostReductionUnlockable = this.isValueReductionAvailable(container.species.speciesId);
const fitsCostReduction = this.filterBar.getVals(DropDownColumn.UNLOCKS).some(unlocks => {
if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.ON) {
return isCostReduced;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.EXCLUDE) {
- return !isCostReduced;
+ return isStarterProgressable && !isCostReduced;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.UNLOCKABLE) {
return isCostReductionUnlockable;
} else if (unlocks.val === "COST_REDUCTION" && unlocks.state === DropDownState.OFF) {
@@ -2337,6 +2442,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
+ // Favorite Filter
+ const isFavorite = this.starterPreferences[container.species.speciesId]?.favorite ?? false;
const fitsFavorite = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "FAVORITE" && misc.state === DropDownState.ON) {
return isFavorite;
@@ -2349,38 +2456,46 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
});
+ // Ribbon / Classic Win Filter
+ const hasWon = starterData.classicWinCount > 0;
+ const hasNotWon = starterData.classicWinCount === 0;
+ const isUndefined = starterData.classicWinCount === undefined;
const fitsWin = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
- if (container.species.speciesId < 10) {
- }
if (misc.val === "WIN" && misc.state === DropDownState.ON) {
- return isWin;
+ return hasWon;
} else if (misc.val === "WIN" && misc.state === DropDownState.EXCLUDE) {
- return isNotWin || isUndefined;
+ return hasNotWon || isUndefined;
} else if (misc.val === "WIN" && misc.state === DropDownState.OFF) {
return true;
}
});
+ // HA Filter
+ const speciesHasHiddenAbility = container.species.abilityHidden !== container.species.ability1 && container.species.abilityHidden !== Abilities.NONE;
+ const hasHA = starterData.abilityAttr & AbilityAttr.ABILITY_HIDDEN;
const fitsHA = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.ON) {
- return isHA;
+ return hasHA;
} else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.EXCLUDE) {
- return !isHA;
+ return speciesHasHiddenAbility && !hasHA;
} else if (misc.val === "HIDDEN_ABILITY" && misc.state === DropDownState.OFF) {
return true;
}
});
+ // Egg Purchasable Filter
+ const isEggPurchasable = this.isSameSpeciesEggAvailable(container.species.speciesId);
const fitsEgg = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "EGG" && misc.state === DropDownState.ON) {
return isEggPurchasable;
} else if (misc.val === "EGG" && misc.state === DropDownState.EXCLUDE) {
- return !isEggPurchasable;
+ return isStarterProgressable && !isEggPurchasable;
} else if (misc.val === "EGG" && misc.state === DropDownState.OFF) {
return true;
}
});
+ // Pokerus Filter
const fitsPokerus = this.filterBar.getVals(DropDownColumn.MISC).some(misc => {
if (misc.val === "POKERUS" && misc.state === DropDownState.ON) {
return this.pokerusSpecies.includes(container.species);
@@ -2405,19 +2520,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
switch (sort.val) {
default:
break;
- case 0:
+ case SortCriteria.NUMBER:
return (a.species.speciesId - b.species.speciesId) * -sort.dir;
- case 1:
+ case SortCriteria.COST:
return (a.cost - b.cost) * -sort.dir;
- case 2:
+ 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 3:
+ 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 4:
+ case SortCriteria.NAME:
return a.species.name.localeCompare(b.species.name) * -sort.dir;
}
return 0;
@@ -2579,56 +2694,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0;
const starterAttributes : StarterAttributes | null = species ? {...this.starterPreferences[species.speciesId]} : null;
- // validate starterAttributes
- if (starterAttributes) {
- // this may cause changes so we created a copy of the attributes before
- if (starterAttributes.variant && !isNaN(starterAttributes.variant)) {
- if (![
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.NON_SHINY, // TODO: is that bang correct?
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.DEFAULT_VARIANT, // TODO: is that bang correct?
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_2, // TODO: is that bang correct?
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.VARIANT_3 // TODO: is that bang correct?
- ][starterAttributes.variant+1]) { // add 1 as -1 = non-shiny
- // requested variant wasn't unlocked, purging setting
- delete starterAttributes.variant;
- }
- }
-
- if (typeof starterAttributes.female !== "boolean" || !(starterAttributes.female ?
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.FEMALE : // TODO: is this bang correct?
- this.speciesStarterDexEntry!.caughtAttr & DexAttr.MALE // TODO: is this bang correct?
- )) {
- // requested gender wasn't unlocked, purging setting
- delete starterAttributes.female;
- }
-
- const abilityAttr = this.scene.gameData.starterData[species!.speciesId].abilityAttr; // TODO: is this bang correct?
- if (![
- abilityAttr & AbilityAttr.ABILITY_1,
- species!.ability2 ? (abilityAttr & AbilityAttr.ABILITY_2) : abilityAttr & AbilityAttr.ABILITY_HIDDEN, // TODO: is this bang correct?
- species!.ability2 && abilityAttr & AbilityAttr.ABILITY_HIDDEN // TODO: is this bang correct?
- ][starterAttributes.ability!]) { // TODO: is this bang correct?
- // requested ability wasn't unlocked, purging setting
- delete starterAttributes.ability;
- }
-
- if (!(species?.forms[starterAttributes.form!]?.isStarterSelectable && this.speciesStarterDexEntry!.caughtAttr & this.scene.gameData.getFormAttr(starterAttributes.form!))) { // TODO: are those bangs correct?
- // requested form wasn't unlocked/isn't a starter form, purging setting
- delete starterAttributes.form;
- }
-
- if (this.scene.gameData.getNaturesForAttr(this.speciesStarterDexEntry?.natureAttr).indexOf(starterAttributes.nature as unknown as Nature) < 0) {
- // requested nature wasn't unlocked, purging setting
- delete starterAttributes.nature;
- }
- }
if (starterAttributes?.nature) {
// load default nature from stater save data, if set
this.natureCursor = starterAttributes.nature;
}
if (starterAttributes?.ability && !isNaN(starterAttributes.ability)) {
- // load default nature from stater save data, if set
+ // load default ability from stater save data, if set
this.abilityCursor = starterAttributes.ability;
}
@@ -2675,7 +2747,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonLuckText.setText(luck.toString());
this.pokemonLuckText.setTint(getVariantTint(Math.min(luck - 1, 2) as Variant));
this.pokemonLuckLabelText.setVisible(this.pokemonLuckText.visible);
- this.pokemonShinyIcon.setVisible(this.starterPreferences[species.speciesId]?.shiny ?? false);
//Growth translate
let growthReadable = Utils.toReadableString(GrowthRate[species.growthRate]);
@@ -2699,12 +2770,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonHatchedIcon.setFrame(getEggTierForSpecies(species));
}
this.pokemonHatchedCountText.setText(`${this.speciesStarterDexEntry.hatchedCount}`);
+
const defaultDexAttr = this.getCurrentDexProps(species.speciesId);
const defaultProps = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr);
const variant = defaultProps.variant;
const tint = getVariantTint(variant);
this.pokemonShinyIcon.setFrame(getVariantIcon(variant));
this.pokemonShinyIcon.setTint(tint);
+ this.pokemonShinyIcon.setVisible(defaultProps.shiny);
this.pokemonCaughtHatchedContainer.setVisible(true);
if (pokemonPrevolutions.hasOwnProperty(species.speciesId)) {
this.pokemonCaughtHatchedContainer.setY(16);
@@ -2881,6 +2954,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
this.pokemonSprite.setVisible(false);
+ this.pokemonPassiveLabelText.setVisible(false);
+ this.pokemonPassiveText.setVisible(false);
+ this.pokemonPassiveDisabledIcon.setVisible(false);
+ this.pokemonPassiveLockedIcon.setVisible(false);
if (this.assetLoadCancelled) {
this.assetLoadCancelled.value = true;
@@ -2894,21 +2971,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
const dexEntry = this.scene.gameData.dexData[species.speciesId];
const abilityAttr = this.scene.gameData.starterData[species.speciesId].abilityAttr;
- const isCaught = this.scene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0);
- const isVariant3Caught = !!(isCaught & DexAttr.VARIANT_3);
- const isVariant2Caught = !!(isCaught & DexAttr.VARIANT_2);
- const isDefaultVariantCaught = !!(isCaught & DexAttr.DEFAULT_VARIANT);
- const isVariantCaught = !!(isCaught & DexAttr.SHINY);
- const isMaleCaught = !!(isCaught & DexAttr.MALE);
- const isFemaleCaught = !!(isCaught & DexAttr.FEMALE);
-
- const starterAttributes = this.starterPreferences[species.speciesId];
-
- const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId));
- const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
- const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
+ const caughtAttr = this.scene.gameData.dexData[species.speciesId]?.caughtAttr || BigInt(0);
if (!dexEntry.caughtAttr) {
+ const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId));
+ const defaultAbilityIndex = this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species);
+ const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species);
+
if (shiny === undefined || shiny !== props.shiny) {
shiny = props.shiny;
}
@@ -2927,83 +2996,6 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
if (natureIndex === undefined || natureIndex !== defaultNature) {
natureIndex = defaultNature;
}
- } else {
- // compare current shiny, formIndex, female, variant, abilityIndex, natureIndex with the caught ones
- // if the current ones are not caught, we need to find the next caught ones
- if (shiny) {
- if (!(isVariantCaught || isVariant2Caught || isVariant3Caught)) {
- shiny = false;
- starterAttributes.shiny = false;
- variant = 0;
- starterAttributes.variant = 0;
- } else {
- shiny = true;
- starterAttributes.shiny = true;
- if (variant === 0 && !isDefaultVariantCaught) {
- if (isVariant2Caught) {
- variant = 1;
- starterAttributes.variant = 1;
- } else if (isVariant3Caught) {
- variant = 2;
- starterAttributes.variant = 2;
- } else {
- variant = 0;
- starterAttributes.variant = 0;
- }
- } else if (variant === 1 && !isVariant2Caught) {
- if (isVariantCaught) {
- variant = 0;
- starterAttributes.variant = 0;
- } else if (isVariant3Caught) {
- variant = 2;
- starterAttributes.variant = 2;
- } else {
- variant = 0;
- starterAttributes.variant = 0;
- }
- } else if (variant === 2 && !isVariant3Caught) {
- if (isVariantCaught) {
- variant = 0;
- starterAttributes.variant = 0;
- } else if (isVariant2Caught) {
- variant = 1;
- starterAttributes.variant = 1;
- } else {
- variant = 0;
- starterAttributes.variant = 0;
- }
- }
- }
- }
- if (female) {
- if (!isFemaleCaught) {
- female = false;
- starterAttributes.female = false;
- }
- } else {
- if (!isMaleCaught) {
- female = true;
- starterAttributes.female = true;
- }
- }
-
- if (species.forms) {
- const formCount = species.forms.length;
- let newFormIndex = formIndex??0;
- if (species.forms[newFormIndex]) {
- const isValidForm = species.forms[newFormIndex].isStarterSelectable && dexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex);
- if (!isValidForm) {
- do {
- newFormIndex = (newFormIndex + 1) % formCount;
- if (species.forms[newFormIndex].isStarterSelectable && dexEntry.caughtAttr & this.scene.gameData.getFormAttr(newFormIndex)) {
- break;
- }
- } while (newFormIndex !== props.formIndex);
- formIndex = newFormIndex;
- starterAttributes.form = formIndex;
- }
- }
- }
}
this.shinyOverlay.setVisible(shiny ?? false); // TODO: is false the correct default?
@@ -3045,8 +3037,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
currentFilteredContainer.checkIconId(female, formIndex, shiny, variant);
}
- this.canCycleShiny = isVariantCaught || isVariant2Caught || isVariant3Caught;
+ const isNonShinyCaught = !!(caughtAttr & DexAttr.NON_SHINY);
+ const isShinyCaught = !!(caughtAttr & DexAttr.SHINY);
+ const isVariant1Caught = isShinyCaught && !!(caughtAttr & DexAttr.DEFAULT_VARIANT);
+ const isVariant2Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_2);
+ const isVariant3Caught = isShinyCaught && !!(caughtAttr & DexAttr.VARIANT_3);
+
+ this.canCycleShiny = isNonShinyCaught && isShinyCaught;
+ this.canCycleVariant = !!shiny && [ isVariant1Caught, isVariant2Caught, isVariant3Caught].filter(v => v).length > 1;
+
+ const isMaleCaught = !!(caughtAttr & DexAttr.MALE);
+ const isFemaleCaught = !!(caughtAttr & DexAttr.FEMALE);
this.canCycleGender = isMaleCaught && isFemaleCaught;
+
const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1;
let hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2;
const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN;
@@ -3061,10 +3064,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
}
this.canCycleAbility = [ hasAbility1, hasAbility2, hasHiddenAbility ].filter(a => a).length > 1;
+
this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey))
.map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(f => f).length > 1;
this.canCycleNature = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1;
- this.canCycleVariant = !!shiny && [ dexEntry.caughtAttr & DexAttr.DEFAULT_VARIANT, dexEntry.caughtAttr & DexAttr.VARIANT_2, dexEntry.caughtAttr & DexAttr.VARIANT_3].filter(v => v).length > 1;
+
}
if (dexEntry.caughtAttr && species.malePercent !== null) {
@@ -3085,9 +3089,34 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
this.pokemonAbilityText.setShadowColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD, true));
const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr;
- this.pokemonPassiveText.setText(passiveAttr & PassiveAttr.UNLOCKED ? passiveAttr & PassiveAttr.ENABLED ? allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]].name : i18next.t("starterSelectUiHandler:disabled") : i18next.t("starterSelectUiHandler:locked"));
- this.pokemonPassiveText.setColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY));
- this.pokemonPassiveText.setShadowColor(this.getTextColor(passiveAttr === (PassiveAttr.UNLOCKED | PassiveAttr.ENABLED) ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY, true));
+ const passiveAbility = allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]];
+
+ if (passiveAbility) {
+ const isUnlocked = !!(passiveAttr & PassiveAttr.UNLOCKED);
+ const isEnabled = !!(passiveAttr & PassiveAttr.ENABLED);
+
+ const textStyle = isUnlocked && isEnabled ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GRAY;
+ const textAlpha = isUnlocked && isEnabled ? 1 : 0.5;
+
+ this.pokemonPassiveLabelText.setVisible(true);
+ this.pokemonPassiveLabelText.setColor(this.getTextColor(TextStyle.SUMMARY_ALT));
+ this.pokemonPassiveLabelText.setShadowColor(this.getTextColor(TextStyle.SUMMARY_ALT, true));
+ this.pokemonPassiveText.setVisible(true);
+ this.pokemonPassiveText.setText(passiveAbility.name);
+ this.pokemonPassiveText.setColor(this.getTextColor(textStyle));
+ this.pokemonPassiveText.setAlpha(textAlpha);
+ this.pokemonPassiveText.setShadowColor(this.getTextColor(textStyle, true));
+
+ const iconPosition = {
+ x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1,
+ y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2
+ };
+ this.pokemonPassiveDisabledIcon.setVisible(isUnlocked && !isEnabled);
+ this.pokemonPassiveDisabledIcon.setPosition(iconPosition.x, iconPosition.y);
+ this.pokemonPassiveLockedIcon.setVisible(!isUnlocked);
+ this.pokemonPassiveLockedIcon.setPosition(iconPosition.x, iconPosition.y);
+
+ }
this.pokemonNatureText.setText(getNatureName(natureIndex as unknown as Nature, true, true, false, this.scene.uiTheme));
@@ -3442,39 +3471,54 @@ export default class StarterSelectUiHandler extends MessageUiHandler {
return canStart;
}
- /* this creates a temporary dex attr props that we use to check whether a pokemon is valid for a challenge.
- * when checking for certain challenges (i.e. mono type), we need to check for form changes AND evolutions
- * However, since some pokemon can evolve based on their intial gender/form, we need a way to look for that
- * This temporary dex attr will therefore ONLY look at gender and form, since there's no cases of shinies/variants
- * having different evolutions to their non shiny/variant part, and so those can be ignored
- * Since the current form and gender is stored in the starter preferences, this is where we get the values from
- */
+ /**
+ * Creates a temporary dex attr props that will be used to check whether a pokemon is valid for a challenge
+ * and to display the correct shiny, variant, and form based on the StarterPreferences
+ *
+ * @param speciesId the id of the species to get props for
+ * @returns the dex props
+ */
getCurrentDexProps(speciesId: number): bigint {
let props = 0n;
+ const caughtAttr = this.scene.gameData.dexData[speciesId].caughtAttr;
- if (this.starterPreferences[speciesId]?.female) { // this checks the gender of the pokemon
+ /* this checks the gender of the pokemon; this works by checking a) that the starter preferences for the species exist, and if so, is it female. If so, it'll add DexAttr.FEMALE to our temp props
+ * It then checks b) if the caughtAttr for the pokemon is female and NOT male - this means that the ONLY gender we've gotten is female, and we need to add DexAttr.FEMALE to our temp props
+ * If neither of these pass, we add DexAttr.MALE to our temp props
+ */
+ if (this.starterPreferences[speciesId]?.female || ((caughtAttr & DexAttr.FEMALE) > 0n && (caughtAttr & DexAttr.MALE) === 0n)) {
props += DexAttr.FEMALE;
} else {
props += DexAttr.MALE;
}
- if (this.starterPreferences[speciesId]?.shiny) {
+ /* This part is very similar to above, but instead of for gender, it checks for shiny within starter preferences.
+ * If they're not there, it enables shiny state by default if any shiny was caught
+ */
+ if (this.starterPreferences[speciesId]?.shiny || ((caughtAttr & DexAttr.SHINY) > 0n && this.starterPreferences[speciesId]?.shiny !== false)) {
props += DexAttr.SHINY;
- if (this.starterPreferences[speciesId]?.variant) {
+ if (this.starterPreferences[speciesId]?.variant !== undefined) {
props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.variant)) * DexAttr.DEFAULT_VARIANT;
} else {
- props += DexAttr.DEFAULT_VARIANT;
+ /* This calculates the correct variant if there's no starter preferences for it.
+ * This gets the highest tier variant that you've caught and adds it to the temp props
+ */
+ if ((caughtAttr & DexAttr.VARIANT_3) > 0) {
+ props += DexAttr.VARIANT_3;
+ } else if ((caughtAttr & DexAttr.VARIANT_2) > 0) {
+ props += DexAttr.VARIANT_2;
+ } else {
+ props += DexAttr.DEFAULT_VARIANT;
+ }
}
} else {
props += DexAttr.NON_SHINY;
- if (this.starterPreferences[speciesId]?.variant) {
- delete this.starterPreferences[speciesId].variant;
- }
props += DexAttr.DEFAULT_VARIANT; // we add the default variant here because non shiny versions are listed as default variant
}
if (this.starterPreferences[speciesId]?.form) { // this checks for the form of the pokemon
props += BigInt(Math.pow(2, this.starterPreferences[speciesId]?.form)) * DexAttr.DEFAULT_FORM;
} else {
- props += DexAttr.DEFAULT_FORM;
+ // Get the first unlocked form
+ props += this.scene.gameData.getFormAttr(this.scene.gameData.getFormIndex(caughtAttr));
}
return props;
diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts
index 2bd7099a2c5..c6e0ea3a71c 100644
--- a/src/ui/stats-container.ts
+++ b/src/ui/stats-container.ts
@@ -1,7 +1,8 @@
import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodetext/BBCodeText";
import BattleScene from "../battle-scene";
-import { Stat, getStatName } from "../data/pokemon-stat";
import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text";
+import { PERMANENT_STATS, getStatKey } from "#app/enums/stat";
+import i18next from "i18next";
const ivChartSize = 24;
const ivChartStatCoordMultipliers = [[0, -1], [0.825, -0.5], [0.825, 0.5], [-0.825, -0.5], [-0.825, 0.5], [0, 1]];
@@ -53,16 +54,16 @@ export class StatsContainer extends Phaser.GameObjects.Container {
this.ivStatValueTexts = [];
- new Array(6).fill(null).map((_, i: integer) => {
- const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[i][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[i][1] * 1.325 - 4 + ivLabelOffset[i], getStatName(i as Stat), TextStyle.TOOLTIP_CONTENT);
+ for (const s of PERMANENT_STATS) {
+ const statLabel = addTextObject(this.scene, ivChartBg.x + (ivChartSize) * ivChartStatCoordMultipliers[s][0] * 1.325, ivChartBg.y + (ivChartSize) * ivChartStatCoordMultipliers[s][1] * 1.325 - 4 + ivLabelOffset[s], i18next.t(getStatKey(s)), TextStyle.TOOLTIP_CONTENT);
statLabel.setOrigin(0.5);
- this.ivStatValueTexts[i] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT);
- this.ivStatValueTexts[i].setOrigin(0.5);
+ this.ivStatValueTexts[s] = addBBCodeTextObject(this.scene, statLabel.x, statLabel.y + 8, "0", TextStyle.TOOLTIP_CONTENT);
+ this.ivStatValueTexts[s].setOrigin(0.5);
this.add(statLabel);
- this.add(this.ivStatValueTexts[i]);
- });
+ this.add(this.ivStatValueTexts[s]);
+ }
}
updateIvs(ivs: integer[], originalIvs?: integer[]): void {
diff --git a/src/ui/summary-ui-handler.ts b/src/ui/summary-ui-handler.ts
index ea7b798f2bf..8ae72f08edd 100644
--- a/src/ui/summary-ui-handler.ts
+++ b/src/ui/summary-ui-handler.ts
@@ -11,7 +11,6 @@ import Move, { MoveCategory } from "../data/move";
import { getPokeballAtlasKey } from "../data/pokeball";
import { getGenderColor, getGenderSymbol } from "../data/gender";
import { getLevelRelExp, getLevelTotalExp } from "../data/exp";
-import { Stat, getStatName } from "../data/pokemon-stat";
import { PokemonHeldItemModifier } from "../modifier/modifier";
import { StatusEffect } from "../data/status-effect";
import { getBiomeName } from "../data/biomes";
@@ -19,10 +18,11 @@ import { Nature, getNatureName, getNatureStatMultiplier } from "../data/nature";
import { loggedInUser } from "../account";
import { Variant, getVariantTint } from "#app/data/variant";
import {Button} from "#enums/buttons";
-import { Ability } from "../data/ability.js";
+import { Ability } from "../data/ability";
import i18next from "i18next";
import {modifierSortFunc} from "../modifier/modifier";
import { PlayerGender } from "#enums/player-gender";
+import { Stat, PERMANENT_STATS, getStatKey } from "#app/enums/stat";
enum Page {
PROFILE,
@@ -836,10 +836,8 @@ export default class SummaryUiHandler extends UiHandler {
const statsContainer = this.scene.add.container(0, -pageBg.height);
pageContainer.add(statsContainer);
- const stats = Utils.getEnumValues(Stat) as Stat[];
-
- stats.forEach((stat, s) => {
- const statName = getStatName(stat);
+ PERMANENT_STATS.forEach((stat, s) => {
+ const statName = i18next.t(getStatKey(stat));
const rowIndex = s % 3;
const colIndex = Math.floor(s / 3);
@@ -850,7 +848,7 @@ export default class SummaryUiHandler extends UiHandler {
statsContainer.add(statLabel);
const statValueText = stat !== Stat.HP
- ? Utils.formatStat(this.pokemon?.stats[s]!) // TODO: is this bang correct?
+ ? 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);
diff --git a/src/ui/test-dialogue-ui-handler.ts b/src/ui/test-dialogue-ui-handler.ts
new file mode 100644
index 00000000000..3f353bbc461
--- /dev/null
+++ b/src/ui/test-dialogue-ui-handler.ts
@@ -0,0 +1,147 @@
+import { FormModalUiHandler } from "./form-modal-ui-handler";
+import { ModalConfig } from "./modal-ui-handler";
+import i18next from "i18next";
+import { PlayerPokemon } from "#app/field/pokemon";
+import { OptionSelectItem } from "./abstact-option-select-ui-handler";
+import { isNullOrUndefined } from "#app/utils";
+import { Mode } from "./ui";
+
+export default class TestDialogueUiHandler extends FormModalUiHandler {
+
+ keys: string[];
+
+ constructor(scene, mode) {
+ super(scene, mode);
+ }
+
+ setup() {
+ super.setup();
+
+ const flattenKeys = (object, topKey?: string, midleKey?: string[]): Array => {
+ return Object.keys(object).map((t, i) => {
+ const value = Object.values(object)[i];
+
+ if (typeof value === "object" && !isNullOrUndefined(value)) { // we check for not null or undefined here because if the language json file has a null key, the typeof will still be an object, but that object will be null, causing issues
+ // If the value is an object, execute the same process
+ // si el valor es un objeto ejecuta el mismo proceso
+
+ return flattenKeys(value, topKey ?? t, topKey ? midleKey ? [...midleKey, t] : [t] : undefined).filter((t) => t.length > 0);
+ } else if (typeof value === "string" || isNullOrUndefined(value)) { // we check for null or undefined here as per above - the typeof is still an object but the value is null so we need to exit out of this and pass the null key
+
+ // Return in the format expected by i18next
+ return midleKey ? `${topKey}:${midleKey.map((m) => m).join(".")}.${t}` : `${topKey}:${t}`;
+ }
+ }).filter((t) => t);
+ };
+
+ const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter((t) => t.length > 0); // Array of arrays
+ const keys = keysInArrays.flat(Infinity).map(String); // One array of string
+ this.keys = keys;
+ }
+
+ getModalTitle(config?: ModalConfig): string {
+ return "Test Dialogue";
+ }
+
+ getFields(config?: ModalConfig): string[] {
+ return [ "Dialogue" ];
+ }
+
+ getWidth(config?: ModalConfig): number {
+ return 300;
+ }
+
+ getMargin(config?: ModalConfig): [number, number, number, number] {
+ return [ 0, 0, 48, 0 ];
+ }
+
+ getButtonLabels(config?: ModalConfig): string[] {
+ return [ "Check", "Cancel" ];
+ }
+
+ getReadableErrorMessage(error: string): string {
+ const colonIndex = error?.indexOf(":");
+ if (colonIndex > 0) {
+ error = error.slice(0, colonIndex);
+ }
+
+ return super.getReadableErrorMessage(error);
+ }
+
+ show(args: any[]): boolean {
+ const ui = this.getUi();
+ const input = this.inputs[0];
+ input.setMaxLength(255);
+
+ input.on("keydown", (inputObject, evt: KeyboardEvent) => {
+ if (["escape", "space"].some((v) => v === evt.key.toLowerCase() || v === evt.code.toLowerCase()) && ui.getMode() === Mode.AUTO_COMPLETE) {
+ // Delete autocomplete list and recovery focus.
+ inputObject.on("blur", () => inputObject.node.focus(), { once: true });
+ ui.revertMode();
+ }
+ });
+
+ input.on("textchange", (inputObject, evt: InputEvent) => {
+ // Delete autocomplete.
+ if (ui.getMode() === Mode.AUTO_COMPLETE) {
+ ui.revertMode();
+ }
+
+ let options: OptionSelectItem[] = [];
+ const splitArr = inputObject.text.split(" ");
+ const filteredKeys = this.keys.filter((command) => command.toLowerCase().includes(splitArr[splitArr.length - 1].toLowerCase()));
+ if (inputObject.text !== "" && filteredKeys.length > 0) {
+ // if performance is required, you could reduce the number of total results by changing the slice below to not have all ~8000 inputs going
+ options = filteredKeys.slice(0).map((value) => {
+ return {
+ label: value,
+ handler: () => {
+ // this is here to make sure that if you try to backspace then enter, the last known evt.data (backspace) is picked up
+ // this is because evt.data is null for backspace, so without this, the autocomplete windows just closes
+ if (!isNullOrUndefined(evt.data) || evt.inputType?.toLowerCase() === "deletecontentbackward") {
+ const separatedArray = inputObject.text.split(" ");
+ separatedArray[separatedArray.length - 1] = value;
+ inputObject.setText(separatedArray.join(" "));
+ }
+ ui.revertMode();
+ return true;
+ }
+ };
+ });
+ }
+
+ if (options.length > 0) {
+ const modalOpts = {
+ options: options,
+ maxOptions: 5,
+ modalContainer: this.modalContainer
+ };
+ ui.setOverlayMode(Mode.AUTO_COMPLETE, modalOpts);
+ }
+
+ });
+
+
+ if (super.show(args)) {
+ const config = args[0] as ModalConfig;
+ this.inputs[0].resize(1150, 116);
+ this.inputContainers[0].list[0].width = 200;
+ if (args[1] && typeof (args[1] as PlayerPokemon).getNameToRender === "function") {
+ this.inputs[0].text = (args[1] as PlayerPokemon).getNameToRender();
+ } else {
+ this.inputs[0].text = args[1];
+ }
+ this.submitAction = (_) => {
+ if (ui.getMode() === Mode.TEST_DIALOGUE) {
+ this.sanitizeInputs();
+ const sanitizedName = btoa(unescape(encodeURIComponent(this.inputs[0].text)));
+ config.buttonActions[0](sanitizedName);
+ return true;
+ }
+ return false;
+ };
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/ui/ui.ts b/src/ui/ui.ts
index e62cd37aae3..6c988b43043 100644
--- a/src/ui/ui.ts
+++ b/src/ui/ui.ts
@@ -37,7 +37,7 @@ import UnavailableModalUiHandler from "./unavailable-modal-ui-handler";
import OutdatedModalUiHandler from "./outdated-modal-ui-handler";
import SessionReloadModalUiHandler from "./session-reload-modal-ui-handler";
import { Button } from "#enums/buttons";
-import i18next, { ParseKeys } from "i18next";
+import i18next from "i18next";
import GamepadBindingUiHandler from "./settings/gamepad-binding-ui-handler";
import SettingsKeyboardUiHandler from "#app/ui/settings/settings-keyboard-ui-handler";
import KeyboardBindingUiHandler from "#app/ui/settings/keyboard-binding-ui-handler";
@@ -49,6 +49,9 @@ import RenameFormUiHandler from "./rename-form-ui-handler";
import AdminUiHandler from "./admin-ui-handler";
import RunHistoryUiHandler from "./run-history-ui-handler";
import RunInfoUiHandler from "./run-info-ui-handler";
+import EggSummaryUiHandler from "./egg-summary-ui-handler";
+import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler";
+import AutoCompleteUiHandler from "./autocomplete-ui-handler";
export enum Mode {
MESSAGE,
@@ -64,6 +67,7 @@ export enum Mode {
STARTER_SELECT,
EVOLUTION_SCENE,
EGG_HATCH_SCENE,
+ EGG_HATCH_SUMMARY,
CONFIRM,
OPTION_SELECT,
MENU,
@@ -89,6 +93,8 @@ export enum Mode {
RENAME_POKEMON,
RUN_HISTORY,
RUN_INFO,
+ TEST_DIALOGUE,
+ AUTO_COMPLETE,
ADMIN,
}
@@ -127,6 +133,8 @@ const noTransitionModes = [
Mode.UNAVAILABLE,
Mode.OUTDATED,
Mode.RENAME_POKEMON,
+ Mode.TEST_DIALOGUE,
+ Mode.AUTO_COMPLETE,
Mode.ADMIN,
];
@@ -165,6 +173,7 @@ export default class UI extends Phaser.GameObjects.Container {
new StarterSelectUiHandler(scene),
new EvolutionSceneHandler(scene),
new EggHatchSceneHandler(scene),
+ new EggSummaryUiHandler(scene),
new ConfirmUiHandler(scene),
new OptionSelectUiHandler(scene),
new MenuUiHandler(scene),
@@ -191,6 +200,8 @@ export default class UI extends Phaser.GameObjects.Container {
new RenameFormUiHandler(scene),
new RunHistoryUiHandler(scene),
new RunInfoUiHandler(scene),
+ new TestDialogueUiHandler(scene, Mode.TEST_DIALOGUE),
+ new AutoCompleteUiHandler(scene),
new AdminUiHandler(scene),
];
}
@@ -298,30 +309,29 @@ export default class UI extends Phaser.GameObjects.Container {
}
}
- showDialogue(text: string, name: string | undefined, delay: integer | null = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer): void {
- // First get the gender of the player (default male) (also used if UNSET)
- let playerGenderPrefix = "PGM";
- if ((this.scene as BattleScene).gameData.gender === PlayerGender.FEMALE) {
- playerGenderPrefix = "PGF";
- }
- // Add the prefix to the text
- const localizationKey: string = playerGenderPrefix + text;
-
+ showDialogue(keyOrText: string, name: string | undefined, delay: integer | null = 0, callback: Function, callbackDelay?: integer, promptDelay?: integer): void {
+ const battleScene = this.scene as BattleScene;
// Get localized dialogue (if available)
let hasi18n = false;
- if (i18next.exists(localizationKey) ) {
- text = i18next.t(localizationKey as ParseKeys);
+ let text = keyOrText;
+ const genderIndex = battleScene.gameData.gender ?? PlayerGender.UNSET;
+ const genderStr = PlayerGender[genderIndex].toLowerCase();
+
+ if (i18next.exists(keyOrText) ) {
+ const i18nKey = keyOrText;
hasi18n = true;
+ text = i18next.t(i18nKey, { context: genderStr }); // override text with translation
+
// Skip dialogue if the player has enabled the option and the dialogue has been already seen
- if ((this.scene as BattleScene).skipSeenDialogues && (this.scene as BattleScene).gameData.getSeenDialogues()[localizationKey] === true) {
- console.log(`Dialogue ${localizationKey} skipped`);
+ if (this.shouldSkipDialogue(i18nKey)) {
+ console.log(`Dialogue ${i18nKey} skipped`);
callback();
return;
}
}
let showMessageAndCallback = () => {
- hasi18n && (this.scene as BattleScene).gameData.saveSeenDialogue(localizationKey);
+ hasi18n && battleScene.gameData.saveSeenDialogue(keyOrText);
callback();
};
if (text.indexOf("$") > -1) {
@@ -341,16 +351,11 @@ export default class UI extends Phaser.GameObjects.Container {
}
}
- shouldSkipDialogue(text): boolean {
- let playerGenderPrefix = "PGM";
- if ((this.scene as BattleScene).gameData.gender === PlayerGender.FEMALE) {
- playerGenderPrefix = "PGF";
- }
+ shouldSkipDialogue(i18nKey: string): boolean {
+ const battleScene = this.scene as BattleScene;
- const key = playerGenderPrefix + text;
-
- if (i18next.exists(key) ) {
- if ((this.scene as BattleScene).skipSeenDialogues && (this.scene as BattleScene).gameData.getSeenDialogues()[key] === true) {
+ if (i18next.exists(i18nKey) ) {
+ if (battleScene.skipSeenDialogues && battleScene.gameData.getSeenDialogues()[i18nKey] === true) {
return true;
}
}